从 Hibernate 到 iBatis,初次体验 SqlMap,领略另番 OR-Mapping
用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脚本
第二步:创建Java对应实体类, Person.java, 要有一个默认的构造函数,也就是符合JavaBean规范
第三步:创建SqlMap配置文件,相当于Hibernate的hibernate.cfg.xml配置文件,十分类似
第四步:创建SqlMap映射文件 Person.xml,相当于Hibernate的映射文件 *.hbm.xml,只是它的映射不靠POJO的属性到数据库字段的一一映射,靠的是Sql语句,所以谓之 SqlMap, 注意每条语句中参数的写法。
第五步:创建一个获取SqlMapClient的工厂类,相当于MyEclipse为Hibernate应用程序生成的HibernateSessionFactory类
第六步:终极体验,创建你的测试类 Client.java, 进行 CRUD 操作,SqlMapClient有如Hibernate的Session一般,仔细看看其中的方法吧。
补充:
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's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
做这个实验基本是遵照 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脚本
1create table person(
2 id integer,
3 name varchar2(16),
4 passwd varchar2(16)
5)第二步:创建Java对应实体类, Person.java, 要有一个默认的构造函数,也就是符合JavaBean规范
1package com.unmi;
2
3public class Person
4{
5 private Integer id;
6 private String name;
7 private String passwd;
8
9 public Person()
10 {
11
12 }
13
14 public Person(Integer id)
15 {
16 this.id = id;
17 }
18
19 public Integer getId()
20 {
21 return id;
22 }
23 public void setId(Integer id)
24 {
25 this.id = id;
26 }
27 public String getName()
28 {
29 return name;
30 }
31 public void setName(String name)
32 {
33 this.name = name;
34 }
35 public String getPasswd()
36 {
37 return passwd;
38 }
39 public void setPasswd(String passwd)
40 {
41 this.passwd = passwd;
42 }
43
44 public String toString()
45 {
46 return "Person[ID:"+id+",NAME:"+name+",PASSWD:"+passwd+"]";
47 }
48}第三步:创建SqlMap配置文件,相当于Hibernate的hibernate.cfg.xml配置文件,十分类似
1<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
2"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
3<sqlMapConfig>
4
5 <!-- SqlMap的环境属性配置 -->
6 <settings cacheModelsEnabled="true" enhancementEnabled="true"
7 lazyLoadingEnabled="true" maxRequests="32" maxSessions="10"
8 maxTransactions="5" useStatementNamespaces="false" />
9
10 <!-- 配置SqlMap的连接池属性,默认使用SimpleDataSource实现-->
11 <transactionManager type="JDBC">
12 <dataSource type="SIMPLE">
13 <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />
14 <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@192.168.0.1:1521:test" />
15 <property name="JDBC.Username" value="scott" />
16 <property name="JDBC.Password" value="tiger" />
17 </dataSource>
18 </transactionManager>
19
20 <!-- SqlMap的映射文件 -->
21 <sqlMap resource="com/unmi/Person.xml" />
22</sqlMapConfig>第四步:创建SqlMap映射文件 Person.xml,相当于Hibernate的映射文件 *.hbm.xml,只是它的映射不靠POJO的属性到数据库字段的一一映射,靠的是Sql语句,所以谓之 SqlMap, 注意每条语句中参数的写法。
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
3"http://www.ibatis.com/dtd/sql-map-2.dtd">
4<sqlMap namespace="Person">
5 <!-- 传入包装类型(Integer)参数,查询到结果集组装成一个Person对象返回 -->
6 <select id="getPerson" parameterClass="int" resultClass="com.unmi.Person">
7 SELECT ID as id, NAME as name, PASSWD as passwd
8 FROM PERSON WHERE ID = #value#
9 </select><br/><br/>
10 <!-- 插入一条Person对应的记录到数据库中 -->
11 <insert id="insertPerson" parameterClass="com.unmi.Person">
12 INSERT INTO PERSON (ID, NAME, PASSWD) VALUES (#id#,#name#, #passwd#)
13 </insert><br/><br/>
14 <!-- 关联ID更新一条Person记录到数据库中 -->
15 <update id="updatePerson" parameterClass="com.unmi.Person">
16 UPDATE PERSON SET NAME = #name#, PASSWD = #passwd# WHERE ID = #id#
17 </update><br/><br/>
18 <!-- 根据ID从数据库中删除一条Person记录 -->
19 <delete id="deletePerson" parameterClass="com.unmi.Person">
20 DELETE PERSON WHERE ID = #id#
21 </delete>
22</sqlMap>第五步:创建一个获取SqlMapClient的工厂类,相当于MyEclipse为Hibernate应用程序生成的HibernateSessionFactory类
1package com.unmi;
2
3import java.io.Reader;
4
5import com.ibatis.common.resources.Resources;
6import com.ibatis.sqlmap.client.SqlMapClient;
7import com.ibatis.sqlmap.client.SqlMapClientBuilder;
8
9public class SqlMapConfig
10{
11 private static final SqlMapClient sqlMap;
12 static
13 {
14 try
15 {
16 String resource = "SqlMapConfig.xml";
17 Reader reader = Resources.getResourceAsReader(resource);
18 sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
19 }
20 catch (Exception e)
21 {
22 e.printStackTrace();
23 throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e);
24 }
25 }
26
27 public static SqlMapClient getSqlMapInstance()
28 {
29 return sqlMap;
30 }
31}第六步:终极体验,创建你的测试类 Client.java, 进行 CRUD 操作,SqlMapClient有如Hibernate的Session一般,仔细看看其中的方法吧。
1package com.unmi;
2
3import com.ibatis.sqlmap.client.SqlMapClient;
4
5public class Client
6{
7
8 /** *//**
9 * @param args
10 * @throws Exception
11 */
12 public static void main(String[] args) throws Exception
13 {
14 SqlMapClient sqlMap = SqlMapConfig.getSqlMapInstance(); // as coded above
15 Integer personPk = new Integer(1);
16 Person person = (Person) sqlMap.queryForObject("getPerson", personPk);
17 System.out.println(person);
18
19 person.setName("Unmi");
20 sqlMap.update("updatePerson",person);
21
22 person.setId(2);
23 sqlMap.insert("insertPerson",person);
24
25 sqlMap.delete("deletePerson", person);
26 }
27}补充:
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's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。