用Hibernate也有一段时间了,项目中也用过CMP以及.net的DataSet,也想体验一下iBatis的SqlMap方式的魅力了,以前总是看iBatis介绍一的文章,现在应是亲自动手心临其境的时候了。
 做这个实验基本是遵照 iBATIS SQL Maps 入门教程 中的例子做的,只是在原来的基础上还更简化了一些。
做这个实验基本是遵照 iBATIS SQL Maps 入门教程 中的例子做的,只是在原来的基础上还更简化了一些。
我用的开发工具是 Eclipse,如何建立你的工程和加入相应的 iBatis 包可不详叙。
iBatis的官网是 http://ibatis.apache.org/ ,可在这个网站上下载到需要的包, 我用的是2.1.5的版本,有三个jar包,分别是:ibatis-sqlmap-2.jar, ibatis-common-2.jar, ibatis-dao-2.jar, 最后注意加上你要用到的数据库驱动包,我在这个例子中用到的是 Oracle 数据库, JDBC 驱动包是 classes12.jar。
好啦,下面分六步介绍如何构建起一个最简单的IBatis应用程序
右边是下面几步创建文件的路径图,数据库表创建脚本就没列出来。
第一步:创建一个 测试数据库表,Person,SQL脚本
| 1 2 3 4 5 | create table person(     id integer,     name varchar2(16),     passwd varchar2(16) ) | 
第二步:创建Java对应实体类, Person.java, 要有一个默认的构造函数,也就是符合JavaBean规范
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package com.unmi; public class Person {     private Integer id;     private String name;     private String passwd;     public Person()     {     }     public Person(Integer id)     {         this.id = id;     }     public Integer getId()     {         return id;     }     public void setId(Integer id)     {         this.id = id;     }     public String getName()     {         return name;     }     public void setName(String name)     {         this.name = name;     }     public String getPasswd()     {         return passwd;     }     public void setPasswd(String passwd)     {         this.passwd = passwd;     }     public String toString()     {         return "Person[ID:"+id+",NAME:"+name+",PASSWD:"+passwd+"]";     } } | 
第三步:创建SqlMap配置文件,相当于Hibernate的hibernate.cfg.xml配置文件,十分类似
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlMapConfig>     <!-- SqlMap的环境属性配置 -->     <settings cacheModelsEnabled="true" enhancementEnabled="true"         lazyLoadingEnabled="true" maxRequests="32" maxSessions="10"         maxTransactions="5" useStatementNamespaces="false" />     <!-- 配置SqlMap的连接池属性,默认使用SimpleDataSource实现-->     <transactionManager type="JDBC">         <dataSource type="SIMPLE">             <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />             <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@192.168.0.1:1521:test" />             <property name="JDBC.Username" value="scott" />             <property name="JDBC.Password" value="tiger" />         </dataSource>     </transactionManager>     <!-- SqlMap的映射文件 -->     <sqlMap resource="com/unmi/Person.xml" /> </sqlMapConfig> | 
第四步:创建SqlMap映射文件 Person.xml,相当于Hibernate的映射文件 *.hbm.xml,只是它的映射不靠POJO的属性到数据库字段的一一映射,靠的是Sql语句,所以谓之 SqlMap, 注意每条语句中参数的写法。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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 namespace="Person">     <!-- 传入包装类型(Integer)参数,查询到结果集组装成一个Person对象返回 -->     <select id="getPerson" parameterClass="int" resultClass="com.unmi.Person">         SELECT ID as id, NAME as name, PASSWD as passwd          FROM PERSON    WHERE ID = #value#     </select>     <!-- 插入一条Person对应的记录到数据库中 -->     <insert id="insertPerson" parameterClass="com.unmi.Person">         INSERT INTO PERSON (ID, NAME, PASSWD) VALUES (#id#,#name#, #passwd#)     </insert>     <!-- 关联ID更新一条Person记录到数据库中 -->     <update id="updatePerson" parameterClass="com.unmi.Person">         UPDATE PERSON SET NAME = #name#, PASSWD = #passwd# WHERE ID = #id#     </update>     <!-- 根据ID从数据库中删除一条Person记录 -->     <delete id="deletePerson" parameterClass="com.unmi.Person">         DELETE PERSON WHERE ID = #id#     </delete> </sqlMap> | 
第五步:创建一个获取SqlMapClient的工厂类,相当于MyEclipse为Hibernate应用程序生成的HibernateSessionFactory类
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.unmi; import java.io.Reader; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; public class SqlMapConfig {     private static final SqlMapClient sqlMap;     static     {         try         {             String resource = "SqlMapConfig.xml";             Reader reader = Resources.getResourceAsReader(resource);             sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);         }         catch (Exception e)         {             e.printStackTrace();             throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e);         }     }     public static SqlMapClient getSqlMapInstance()     {         return sqlMap;     } } | 
第六步:终极体验,创建你的测试类 Client.java, 进行 CRUD 操作,SqlMapClient有如Hibernate的Session一般,仔细看看其中的方法吧。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.unmi; import com.ibatis.sqlmap.client.SqlMapClient; public class Client {     /** *//**      * @param args      * @throws Exception      */     public static void main(String[] args) throws Exception     {         SqlMapClient sqlMap = SqlMapConfig.getSqlMapInstance(); // as coded above         Integer personPk = new Integer(1);         Person person = (Person) sqlMap.queryForObject("getPerson", personPk);         System.out.println(person);         person.setName("Unmi");         sqlMap.update("updatePerson",person);         person.setId(2);         sqlMap.insert("insertPerson",person);         sqlMap.delete("deletePerson", person);     } } | 
补充:
2008-05-25 SqlMapClient 中有许多实用的方法。
iBatis 2.3.0 不再分 sqlmap/common/dao 多个包了,都放在一个包了
ibatis-2.3.0.677.jar
配置文件 SqlMapConfig.xml 的 DTD 是
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
Map 映射文件的 DTD 是
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
本文链接 https://yanbin.blog/hibernate-to-ibatis-or-mapping/, 来自 隔叶黄莺 Yanbin Blog
[版权声明]  本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。