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,如有侵权,请联系本人删除。

  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/streamice/p/MyIbatis.html
Copyright © 2011-2022 走看看