batis学习总结

昨天用了一天的时间初步简单的学习了一下ibatis框架。由于这个框架比较小,所以学习的速度比较快,学了这一天,基本上就可以用到项目开发过程中了。

一、是什么

iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。

它的核心思想是将sql语句与项目代码分离,使得sql语句的灵活性大大加强。 

参考的资料:《ibatis in action》《sql map》、ibatis官网

Ibatis框架:

1、只有一个jar:ibatis.jar

2、需要两个配置文件:sqlMapConfig.xml和sqlMap.xml

其中sqlMapConfig.xml文件一般名字不改,而且只有一个,主要是配置数据源,类似于hibernate中的hibernateConfig.xml文件。

sqlmap.xml文件的文件名并不是固定的,可以由用户自定义,也不是必须唯一的,可以是多个,类似于hibernate中的hbm.xml文件,且需要将其配置到sqlMapConfig.xml中。

 

二、与hibernate简单比较

网上经常看到Hibernate和ibatis作比较,我也只是大概了解了一点。很多人说到ibatis的性能好一些。究竟性能高体现到哪里的具体的测试我并没有做过, 但是可以从理论上得到:

1、ibatis支持批处理,也就是ibatis支持批量更新数据,而hibernate是不支持的,理论上ibatis在这一点上的性能大大高于hibernate。

2、ibatis要程序员自己手写sql语句,而hibernate是hibernate框架生成sql,那么系统一个是直接执行sql,一个是要先经过hibernate N层复杂的框架,理论上,ibatis的性能要高。

         然而ibatis框架确实很小,功能尚缺,与hibernate相比,hibernate可以从实体类直接生成数据库,也可以从数据库直接生成映射实体 类,开发过程更加完善统一。而ibatis则需要必须首先建立数据库。并且ibatis现在支持的数据库较少。

         Hibernate的映射机制是实体类对应数据库表,采用注解或者配置文件来映射,相当于一对一直接映射。而ibatis的映射机制是在sqlmap.xml文件中的sql语句中实现映射。如下图:

Hibernate的映射:

 Ibatis学习总结+ibatis与hibernate简单比较+示例_的

         Ibatis映射:

 Ibatis学习总结+ibatis与hibernate简单比较+示例_配置文件_02

三、示例

下面的示例中讲解了大部分ibatis中的内容,当然也不全面,比如rowhandler部分、动态sql、事务管理等就没有写到这个示例中:

步骤:

1、建立数据库

2、新建java project

3、引入相关jar:ibatis.jar和数据库驱动jar

4、编写配置文件sqlMapConfig.xml

5、编写sqlMap.xml

6、编写测试代码

 

代码:

1、entity class:

  1. public class Account {  
  2.     private int userid;  
  3.     private String username;  
  4.     private String password;  
  5.     private String groupname;  
  6.       
  7.     public int getUserid() {  
  8.         return userid;  
  9.     }  
  10.     public void setUserid(int userid) {  
  11.         this.userid = userid;  
  12.     }  
  13.     public String getUsername() {  
  14.         return username;  
  15.     }  
  16.     public void setUsername(String username) {  
  17.         this.username = username;  
  18.     }  
  19.     public String getPassword() {  
  20.         return password;  
  21.     }  
  22.     public void setPassword(String password) {  
  23.         this.password = password;  
  24.     }  
  25.     public String getGroupname() {  
  26.         return groupname;  
  27.     }  
  28.     public void setGroupname(String groupname) {  
  29.         this.groupname = groupname;  
  30.     }     
  31. }  

2、sqlMapConfig :

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"  
  4.     "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">  
  5.   
  6. <sqlMapConfig>      
  7.     <properties resource="sqlmap.properties"/>      
  8.   <transactionManager type="JDBC">  
  9.     <dataSource type="SIMPLE">  
  10.       <property value="com.mysql.jdbc.Driver" name="JDBC.Driver"/>  
  11.       <property value="mysql://localhost/demo1" name="JDBC.ConnectionURL"/>  
  12.       <property value="root" name="JDBC.Username"/>  
  13.       <property value="root" name="JDBC.Password"/>  
  14.     </dataSource>  
  15.   </transactionManager>  
  16.   
  17.   <sqlMap resource="userAccount.xml"/>  
  18.   
  19. </sqlMapConfig>  

3、sqlMap.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2.   
  3. <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"  
  4.    "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  5.   
  6. <sqlMap>  
  7.   
  8.     <select id="getAllUsers" resultClass="com.air.Account">  
  9.         SELECT * FROM USER_ACCOUNT order by USERID   
  10.     </select>  
  11.   
  12.   
  13.     <!-- 无映射  -->  
  14.     <select id="getAllUsers1" resultClass="com.air.Account"  
  15.         parameterClass="string">  
  16.         SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#  
  17.     </select>  
  18.   
  19.     <!-- 内联映射->实体类    -->  
  20.     <select id="getAllUsers2" resultClass="com.air.Account"  
  21.         parameterClass="string">  
  22.         SELECT USERID as userid, USERNAME as username, PASSWORD as  
  23.         password, GROUPNAME as groupname FROM USER_ACCOUNT WHERE  
  24.         GROUPNAME=#groupName#  
  25.     </select>  
  26.   
  27.     <!-- 内联映射->MAP类   -->  
  28.     <select id="getAllUsers3" resultClass="hashmap"  
  29.         parameterClass="string">  
  30.         SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#  
  31.     </select>  
  32.   
  33.     <!-- 显示映射->实体类    -->  
  34.     <resultMap id="accoutResult" class="com.air.Account">  
  35.         <result property="userid" column="USERID" />  
  36.         <result property="username" column="USERNAME" />  
  37.         <result property="password" column="PASSWORD" />  
  38.         <result property="groupname" column="GROUPNAME" />  
  39.     </resultMap>  
  40.     <select id="getAllUsers4" resultMap="accoutResult"  
  41.         parameterClass="string">  
  42.         SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#  
  43.     </select>  
  44.   
  45.     <!-- 显示映射->MAP类   -->  
  46.     <resultMap id="mapResult" class="hashmap">  
  47.         <result property="userid" column="USERID" />  
  48.         <result property="username" column="USERNAME" />  
  49.         <result property="password" column="PASSWORD" />  
  50.         <result property="groupname" column="GROUPNAME" />  
  51.     </resultMap>  
  52.     <select id="getAllUsers5" resultMap="mapResult"  
  53.         parameterClass="string">  
  54.         SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#  
  55.     </select>  
  56.   
  57.     <!-- XML -->  
  58.     <select id="selectXML" parameterClass="string" resultClass="xml"  
  59.         xmlResultName="log">  
  60.         SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#  
  61.     </select>  
  62.   
  63.     <select id="getOneUser" resultClass="com.air.Account"  
  64.         parameterClass="string">  
  65.         SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#  
  66.     </select>  
  67.   
  68.     <!-- 自动参数映射  -->    
  69.     <insert id="insertOneUser1" parameterClass="com.air.Account">  
  70.         INSERT INTO USER_ACCOUNT   
  71.         (   
  72.             USERNAME, PASSWORD, GROUPNAME  
  73.         )VALUES(  
  74.             #username#,#password#,#groupname#   
  75.         )  
  76.     </insert>  
  77.   
  78.     <!-- 内联参数映射  -->    
  79.     <insert id="insertOneUser2" parameterClass="com.air.Account">  
  80.         INSERT INTO USER_ACCOUNT   
  81.         (   
  82.             USERNAME, PASSWORD, GROUPNAME  
  83.         )VALUES(  
  84.             #username:VARCHAR#,  
  85.             #password:VARCHAR#,  
  86.             #groupname:VARCHAR#   
  87.         )  
  88.     </insert>  
  89.   
  90.     <!-- 外联参数映射  -->    
  91.     <parameterMap  id="parameterMapEx" class="com.air.Account">  
  92.         <parameter property="username" jdbcType="VARCHAR"/>  
  93.         <parameter property="password" jdbcType="VARCHAR"/>  
  94.         <parameter property="groupname" jdbcType="VARCHAR"/>  
  95.     </parameterMap>  
  96.     <insert id="insertOneUser3" parameterMap="parameterMapEx">  
  97.         INSERT INTO USER_ACCOUNT   
  98.         (   
  99.             USERNAME, PASSWORD, GROUPNAME  
  100.         )VALUES(  
  101.             ?,?,?   
  102.         )  
  103.     </insert>  
  104.       
  105.     <!-- 自动生成的键  -->    
  106.     <insert id="insertOneUser4" parameterClass="com.air.Account">  
  107.         INSERT INTO USER_ACCOUNT   
  108.         (   
  109.             USERID,USERNAME, PASSWORD, GROUPNAME  
  110.         )VALUES(  
  111.             #userid#,  
  112.             #username#,  
  113.             #password#,  
  114.             #groupname#    
  115.         )  
  116.         <selectKey     
  117.             keyProperty="userid"  
  118.             resultClass="int">  
  119.             SELECT LAST_INSERT_ID()           
  120.         </selectKey>  
  121.     </insert>   
  122.   
  123.     <!-- 存储过程    -->        
  124.     <parameterMap id="pro" class="java.util.Map">  
  125.         <parameter property="name" jdbcType="VARCHAR"   
  126.              javaType="string" mode="IN"/>  
  127.     </parameterMap>  
  128.     <procedure id="pro_insert" parameterMap="pro">  
  129.         {call new_proc(?)}  
  130.     </procedure>  
  131.       
  132. </sqlMap>  

4、test class

  1. public class Demo1 {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      * @throws SQLException 
  6.      */  
  7.     @SuppressWarnings({ "unchecked""unchecked" })  
  8.     public static void main(String[] args) throws SQLException {  
  9.         // TODO Auto-generated method stub  
  10.         String resource = "./SqlMapConfig.xml";  
  11.         Reader reader;  
  12.         try {  
  13.             reader = Resources.getResourceAsReader(resource);  
  14.             SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);  
  15.   
  16.             //List list = sqlMap.queryForList("selectXML", "NBA");  
  17.   
  18. //          for (int i = 0; i < list.size(); i++) {  
  19. //              Account cc = (Account) list.get(i);  
  20. //              System.out.println(cc.getUserid() + " " + cc.getUsername()  
  21. //                      + " " + cc.getPassword() + " " + cc.getGroupname());  
  22. //          }  
  23.   
  24. //           for (int i=0;i<list.size();i++){  
  25. //           Map m=(Map)list.get(i);  
  26. //           System.out.print((String)m.get("userid").toString()+" ");  
  27. //           System.out.print((String)m.get("username")+" ");  
  28. //           System.out.print((String)m.get("password")+" ");  
  29. //           System.out.print((String)m.get("groupname")+" ");  
  30. //           System.out.println();  
  31. //           }  
  32.   
  33. //           for (int i = 0; i < list.size(); i++) {  
  34. //           String s = (String) list.get(i);  
  35. //           System.out.println(s);  
  36. //           }  
  37.   
  38. //           Account ac=(Account)sqlMap.queryForObject("getOneUser","IBM");  
  39. //           System.out.println(ac.getUserid());              
  40.               
  41.             //selectkey  
  42. //          Account iac=new Account();  
  43. //          iac.setUsername("ALEXhhhh");  
  44. //          iac.setPassword("DALIAN");  
  45. //          iac.setGroupname("MS");  
  46. //            
  47. //          Integer returnValue=(Integer)sqlMap.insert("insertOneUser4",iac);  
  48. //            
  49. //          System.out.println(returnValue.intValue());  
  50. //          //显示插入后的结果  
  51. //          @SuppressWarnings("unchecked")  
  52. //          List list = sqlMap.queryForList("getAllUsers1","MS");  
  53. //            
  54. //          for (int i = 0; i < list.size(); i++) {  
  55. //              Account cc = (Account) list.get(i);  
  56. //              System.out.println(cc.getUserid() + " " + cc.getUsername()  
  57. //                  + " " + cc.getPassword() + " " + cc.getGroupname());  
  58. //          }                 
  59.               
  60.             //调用存储过程  
  61. //          @SuppressWarnings("unchecked")  
  62. //          Map m=new HashMap(1);  
  63. //  
  64. //          m.put("name", new String("LISI"));  
  65. //          sqlMap.update("pro_insert",m);  
  66. //          //Integer i=(Integer)sqlMap.queryForObject("pro_insert",m);  
  67. //            
  68. //          System.out.println("call procedure ok!");  
  69.               
  70.             //批处理  
  71. //          Account c1=new Account();  
  72. //          c1.setUsername("ZHOUQI");  
  73. //          c1.setPassword("QINGDAO");  
  74. //          c1.setGroupname("CN");  
  75. //            
  76. //          Account c2=new Account();  
  77. //          c2.setUsername("WANGWU");  
  78. //          c2.setPassword("NANJING");  
  79. //          c2.setGroupname("CN");  
  80. //            
  81. //          sqlMap.startBatch();  
  82. //            
  83. //          sqlMap.insert("insertOneUser3",c1);  
  84. //          sqlMap.insert("insertOneUser3",c2);  
  85. //            
  86. //          sqlMap.executeBatch();  
  87.               
  88.             //显示插入后的结果  
  89. //          @SuppressWarnings("unchecked")  
  90. //          List ls = sqlMap.queryForList("getAllUsers1","CN");  
  91. //            
  92. //          for (int i = 0; i < ls.size(); i++) {  
  93. //              Account cc = (Account) ls.get(i);  
  94. //              System.out.println(cc.getUserid() + " " + cc.getUsername()  
  95. //                  + " " + cc.getPassword() + " " + cc.getGroupname());  
  96. //          }                 
  97.               
  98.             //RowHandle生产XML  
  99. //          XmlRowHandler rh=new XmlRowHandler();  
  100. //          sqlMap.queryWithRowHandler("getAllUsers1", "CN", rh);  
  101. //          String xmlDoc=rh.getXmlDocument();            
  102. //        
  103. //          System.out.println(xmlDoc);               
  104.               
  105.         } catch (IOException e) {  
  106.             // TODO Auto-generated catch block  
  107.             e.printStackTrace();  
  108.         }  
  109.     }