用Hibernate也有一段时间了,项目中也用过CMP以及.net的DataSet,也想体验一下iBatis的SqlMap方式的魅力了,以前总是看iBatis介绍一的文章,现在应是亲自动手心临其境的时候了。
做这个实验基本是遵照 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) 进行许可。