zoukankan      html  css  js  c++  java
  • Ibatis的基本用法

    1.ibatis基础理论知识

    半自动化java持久层框架,开源免费,核心还是JDBC,只是将其封装,减少了重复代码的书写(据某个闲的够呛的外国人统计,减少了62%的代码),在编码上更符合面向对象原理。

                       -----------

                                |——什么是持久层: ----先说持久:持久就是把数据保存到可掉电式存储设备中以备后续使用。(从内存保存到磁盘,加以固化) --通过关系型数据库来完成。

                                     ----持久层:在系统逻辑层面上,专注于实现数据持久化的一个相对独立的领域。“层”表示了应该有一个相对独立的逻辑层面,而不是“模块/  单元”,应该有一个较为清晰和严格的逻辑边界。

    ————

             |______什么是半自动化: 因为ibatis还要程序员自己编写访问数据库的sql语句。 ------{提高了可控性,但是当数据库设计改变时,ibatis配置文件中的sql也要随之更改。}

    2.ibatis的特点

    优点:

    1) 简单,配置文件只有两个jar包:     一个是ibatis本身的jar包,一个是连接数据库的jar包

    2)关注点分离: 使用ibatis,使用与对象打交道,不会有零散的结果集

    3)可移植: 可移植,可以在java,ruby,#c平台上使用

    缺点:

    1)只能在关系型数据库上使用

    2)sql需要程序员编写。如果数据库设计改变,需要改ibatis的配置文件,有点麻烦。

    3.实例讲解ibatis

    首先配置ibatis的jar包(两个,我使用的是ibatis-2.3.4.726.jar和mysql-connector-java-5.0.4-bin.jar)

    工程文件如图:

    java文件 :

    User: POJO,是持久层对象,也是ibatis直接操作的对象

    UserDAO :把参数(User)传到给User.xml上 。


    配置文件包括

    JDBC连接的属性文件:sqlMap.properties.

    ibatis总配置文件sqlMapConfig.xml

    每个实体的映射文件,这里是User类的映射文件。 User.xml    在这里由程序员手动编写sql语句


    sqlMap.properties 中定义了数据库的连接:

    资源文件即key 和value的键值对

    driver=com.mysql.jdbc.Driver  
    url=jdbc:mysql://localhost:3306/tt  
    username=root  
    password=123456
    

     总配置文件: 注意--我在总配置文件中直接加入了JDBC数据源,并没有用到工程中的sqlMap.properties。

        <?xml version="1.0" encoding="UTF-8"?>  
        <!DOCTYPE sqlMapConfig       
            PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"       
            "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">  
          
        <sqlMapConfig>  
          <!-- <span class="comments"><span style="color:#008200;">定义了ibatis的事务管理器有3中(JDBC,JTA,EXTERNAL)</span></span> -->  
          <transactionManager type="JDBC" commitRequired="false">  
            <span class="comments"><span style="color:#008200;"><!--type属性指定了数据源的链接类型,也有3种类型(SIMPLE,DBCP,JNDI)--></span></span><span> </span>  
            <dataSource type="SIMPLE">  
              <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>  
              <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/tt"/>  
              <property name="JDBC.Username" value="root"/>  
              <property name="JDBC.Password" value=""/>  
            </dataSource>  
          </transactionManager>  
          
          <!--配置映射文件-->  
          <sqlMap resource="com/tt/User.xml"/>  
        </sqlMapConfig>  

    解释:

    关于ibatis的事务管理器和数据源 :http://blog.csdn.net/not_a_baby/article/details/6756943

    如果引用sqlMap.properties,即以下:

        <?xml version="1.0" encoding="UTF-8"?>  
        <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"  
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd">  
        <sqlMapConfig>  
              <properties resource="com/tt/sqlMap.properties" />  
              <transactionManager type="JDBC">  
                    <dataSource type="SIMPLE">  
                          <property name="JDBC.Driver" value="${driver}" />  
                          <property name="JDBC.ConnectionURL" value="${url}" />  
                          <property name="JDBC.Username" value="${username}" />  
                          <property name="JDBC.Password" value="${password}" />  
                    </dataSource>  
              </transactionManager>   
              <sqlMap resource="com/tt/User.xml"/>     
        </sqlMapConfig>  

    User的映射文件:【对user的增删改查我只实现了增和改作为示例】

    以下就是经常能看到的sqlMap.xml的实例~这部分的代码编写占据ibatis开发的70%左右。

        <?xml version="1.0" encoding="UTF-8"?>  
          
        <!DOCTYPE sqlMap  
          PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"  
          "http://www.ibatis.com/dtd/sql-map-2.dtd">  
          
        <sqlMap>  
            <select id="selectUser" parameterClass="int" resultClass="com.tt.User">  
            </select>  
          
            <insert id="insertUser" parameterClass="com.tt.User">  
               <![CDATA[ 
                         insert into user (name, age,sex, location) 
                         values ( 
                                      #name:VARCHAR#, 
                                      #age:INT#, 
                                      #sex:VARCHAR#, 
                                      #location:VARCHAR# 
                                     )]]>  
                <selectKey resultClass="int" keyProperty="id">  
                    SELECT  
                    LAST_INSERT_ID() AS ID  
                 </selectKey>  
            </insert>  
          
          
            <delete id="deleteUser" parameterClass="int">  
            </delete>  
          
          
            <select id="selectUsers" parameterClass="com.tt.User">  
            </select>  
          
            <update id="updateUser" parameterClass="com.tt.User">  
                update user  
                <dynamic prepend="set">  
                    <isNotNull prepend="," property="name">  
                        name = #name:VARCHAR#  
                                 </isNotNull>  
                    <isNotNull prepend="," property="sex">  
                        sex = #sex:VARCHAR#  
                                 </isNotNull>  
                    <isNotNull prepend="," property="location">  
                        location = #location:VARCHAR#  
                                 </isNotNull>          
                    <isNotNull prepend="," property="age">  
                        age = #age#  
                                </isNotNull>  
                </dynamic>  
                where id = #id#  
            </update>  
          
        </sqlMap>  

    解释:

    ibatis映射 :

    1) 关于主键:

    ibatis支持数据库逐渐的自动生成,包括与预生成主键(插入数据之前就知道哪个是主键 eg:oracle)和 后生成主键(插入数据之后知道谁是主键, eg:mysql)

    生成的主键会设置到同名属性中   -----keyProperty属性指定主键属性

    selectKey的位置表示 是预生成主键 还是 后生成主键

    2)对于sql语句中包含> 或者 <号的情况(where条件中可能会有),使用<![CDATA[*********]]> 来包含。*******表示被包含的sql语句,也可以只包含一个> 或者<符号

    3)sql的输入参数parameterClass

    插入语句入参: parameterClass = ‘包.类’

    查询语句入参:可以设为类名,map,或者string,int ,long 等。 只有一个原声类型(string,int,long)作为入参是,可以使用#value#来引用。

       例如:

        <select id ="selectUser" parameterClass ='long' resultClass = 'com.tt.User'>  
         select * from User where id = #value#  
        </select>  

    我的例子中,没有id。以上是用法示例

    4)返回值参数类型

    resultClass = 'com.tt.User'   -当结果集列名和类属性名完全对应的时候,使用resultClass

    resultMap = 'xxx';                    ---当有些列不对应的时候。  resultMap 是一个POJO的映射,需要先定义xml的映射,才能被使用。

                        例如:

        <resultMap id="mapUser" class="com.tt.mapUser">  
                <result property="name" column="name"/>  
                <result property="age" column="age"/>  
            </resultMap>  

    则需要在com.tt包下建立一个POJO类对应,属性成员为name, age 。 只表示想知道的列

    5)sql中参数的引用

    引用parameterClass有三种方式 :

    1. 原生类型 -- int , string , long  ---使用#value#         #value#不是关键字,可变

    2. map类型参数,使用#keyName#来引用,keyName为健名

    3.对象参数,  使用#propertyName# 使用对象的属性的名字。    比如上面的name =#name# 等。

    6)模糊查询中参数的引用

    了解## 和$$ 的区别。

    #xxxx#是把 xxxx作为一个参数传入

    $xxxx$是把xxxx整体直接拼接到sql语句上

    在模糊查询是,要----》 ‘%$Name$%’


    7)动态sql --ibatis的亮点

    prepend表示链接关键字,可以为任何字串,当为sql关键字是,ibatis子欧诺个判断是否添加该关键字。


    8)结果集映射继承

    继承是为了映射定义的复用。

    例如:

        <resultMap id="baseUser" class="com.tt.User">  
                <result property="name" column="name"/>  
                <result property="age" column="age"/>  
            </resultMap>  
            <resultMap id="User2" class="com.tt.User" extends="com.tt.User.baseUser">  
                <result property="sex" column = "sex"/>  
            </resultMap>  

    9)ibatis的分页查询   ---【待完善】

    10)sql注入    ---【待完善】

    11)ibatis可以配置缓存

    12)ibatis各种id的命名

    DAO层中接口名字SQL语句id的名字保持一致,


    User.java    --注意属性名要与User.xml文件中的属性相对应、

        package com.tt;  
          
        /**对象模型 
         *  
         * @author taoyutong.pt 
         * 
         */  
        public class User {  
            private int id;  
            private String name;  
            private int age;  
            private String sex;  
            private String location;  
            public void setLocation(String location) {  
                this.location = location;  
            }  
            public String getLocation() {  
                return location;  
            }  
            public void setGender(String gender) {  
                this.sex = gender;  
            }  
            public String getGender() {  
                return sex;  
            }  
            public void setAge(int age) {  
                this.age = age;  
            }  
            public int getAge() {  
                return age;  
            }  
            public void setName(String name) {  
                this.name = name;  
            }  
            public String getName() {  
                return name;  
            }  
            public void setId(int id) {  
                this.id = id;  
            }  
            public int getId() {  
                return id;  
            }  
          
        }  

    UserDAO 接口:

        package com.tt;  
          
        import java.sql.SQLException;  
        import java.util.List;  
          
        /** 
         * UserDAO  
         * @author taoyutong.pt 
         * 
         */  
        public interface  UserDAO {  
              
            //
            public int insertUser(User user)throws SQLException;  
            //
            public int deleteUser(int id)throws SQLException;  
            //
            public int updateUser(User user)throws SQLException;  
            //
            public User queryUser(int id) throws SQLException;  
              
            public List<User> queryUserByDynamic(User user)throws SQLException;  
          
          
        }  

    UserDAOImpl 实现类:

        package com.tt;  
          
        /** 
         * UserDAO实现类 
         */  
        import java.io.IOException;  
        import java.io.Reader;  
        import java.sql.SQLException;  
        import java.util.List;  
        import com.ibatis.sqlmap.client.SqlMapClient;  
          
          
        public class UserDAOImpl implements UserDAO{  
            //sqlMapClient  
            private static SqlMapClient sqlMapClient =null;  
              
            static {  
                try {  
                    Reader reader = com.ibatis.common.resources.Resources  
                            .getResourceAsReader("com/tt/sqlMapConfig.xml");  
                    sqlMapClient = com.ibatis.sqlmap.client.SqlMapClientBuilder  
                            .buildSqlMapClient(reader);  
                    reader.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
              
            @Override  
            public int insertUser(User user)throws SQLException{  
                return (Integer)sqlMapClient.insert("insertUser",user);  
            }  
              
            @Override  
            public int deleteUser(int id)throws SQLException{  
                  
                return (Integer)sqlMapClient.delete("deleteUser" ,id);  
            }  
              
            @Override  
            public int updateUser(User user)throws SQLException{  
                  
                return sqlMapClient.update("updateUser",user);  
            }  
              
            @Override  
            public User queryUser(int id) throws SQLException{  
                  
                return (User)sqlMapClient.queryForObject("selectUser",id);            
            }  
          
            @Override  
            public List<User> queryUserByDynamic(User user)throws SQLException{  
                return sqlMapClient.queryForList("selectUsers",user);  
                      
            }  
        }  

    AppMain.java   测试

        package com.tt;  
          
        import java.sql.SQLException;  
          
        public class AppMain {  
          
            public static void main(String args[]) throws SQLException{  
                UserDAO userDAO = new UserDAOImpl();  
                  
                User user =new User();  
                user.setAge(22);  
                user.setGender("man");  
                user.setLocation("dalian");  
                user.setName("bulu");  
                System.out.println(userDAO.insertUser(user));//返回自增ID  
                user.setName("tt");  
                System.out.println(userDAO.updateUser(user));//  
            }  
        }  

    本文摘自:http://blog.csdn.net/not_a_baby/article/details/6752719,如有侵权,请联系本人删除。

  • 相关阅读:
    C#中的扩展方法
    对象的序列化存入数据库,与反序列化
    PowerDesigner15:EAM(Enterprise Architecture Model)企业架构模组
    WPF优化:加速启动时间
    LINQ优化:将GroupBy换做Distinct
    WPF:CheckBox竖向的滑块效果
    微軟提議﹕c#編程四個注意
    Remoting:于.net框架下的序列化機制
    c#編寫聖誕樹算法﹐及相關問題。
    72
  • 原文地址:https://www.cnblogs.com/streamice/p/MyIbatis.html
Copyright © 2011-2022 走看看