相对 Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半
自动化”的ORM实现。
所谓“半自动” ,可能理解上有点生涩。纵观目前主流的 ORM,无论 Hibernate 还是
Apache OJB,都对数据库结构提供了较为完整的封装,提供了从 POJO 到数据库表的全
套映射机制。 程序员往往只需定义好了POJO 到数据库表的映射关系, 即可通过 Hibernate或者 OJB 提供的方法完成持久层操作。程序员甚至不需要对 SQL 的熟练掌握,
Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执
行。
“半自动化” ,是相对Hibernate等提供了全面的数据库封装机制的 “全自动化”
ORM 实现而言, “全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动
生成和执行。 而ibatis 的着力点, 则在于POJO 与 SQL之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。
看了这种描述,对你有何感想呢。
出于对技术的热情,花时间把Ibatis看了一下,觉得真的还不错,就写个简单的例子,供大家参考,有什么不足的地方还请各位指出来。
本例子所用到的Jar文件为:
首先还是老一套,创建一张数据库表(使用Mysql数据库)。
然后呢,创建POJO类:
大家也看到啦,Person类里的属性与person表的字段并不一致,不过没有关系的,在SqlMap中可以使用ResultMap元素进行配置的。
现在呢,就要配置Ibatis的两个关键配置SqlMapConfig映射文件和SqlMap映射文件。
首先要配置的当然是SqlMapConfig文件:
setting元素可以配置和优化SqlMapClient对象的各选项,因为本例只是简单的使用,所有并没有必要去配置。
现在配置SqlMap文件person.xml,此文件是专门针对您的POJO类进行配置的
OK,现在所有的配置都已经完成啦,现在来做一个简单的测试:
自动化”的ORM实现。
所谓“半自动” ,可能理解上有点生涩。纵观目前主流的 ORM,无论 Hibernate 还是
Apache OJB,都对数据库结构提供了较为完整的封装,提供了从 POJO 到数据库表的全
套映射机制。 程序员往往只需定义好了POJO 到数据库表的映射关系, 即可通过 Hibernate或者 OJB 提供的方法完成持久层操作。程序员甚至不需要对 SQL 的熟练掌握,
Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执
行。
“半自动化” ,是相对Hibernate等提供了全面的数据库封装机制的 “全自动化”
ORM 实现而言, “全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动
生成和执行。 而ibatis 的着力点, 则在于POJO 与 SQL之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。
看了这种描述,对你有何感想呢。
出于对技术的热情,花时间把Ibatis看了一下,觉得真的还不错,就写个简单的例子,供大家参考,有什么不足的地方还请各位指出来。
本例子所用到的Jar文件为:
- ibatis-2.3.jar
- mysql-connecter.jar
ibatis-2.3.jar mysql-connecter.jar
首先还是老一套,创建一张数据库表(使用Mysql数据库)。
- CREATE DATABASE IBATISSTUDY;
- CREATE TABLE PERSON(
- ID INT PRIMERY KEY AUTU_INCREMENT,
- U_NAME VARCHAR(20),
- U_PASSWORD VARCHAR(20)
- )
CREATE DATABASE IBATISSTUDY; CREATE TABLE PERSON( ID INT PRIMERY KEY AUTU_INCREMENT, U_NAME VARCHAR(20), U_PASSWORD VARCHAR(20) )
然后呢,创建POJO类:
- package com.jack.ibatis.pojo;
- public class Person {
- private int id;
- private String username;
- private String password;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
package com.jack.ibatis.pojo; public class Person { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
大家也看到啦,Person类里的属性与person表的字段并不一致,不过没有关系的,在SqlMap中可以使用ResultMap元素进行配置的。
现在呢,就要配置Ibatis的两个关键配置SqlMapConfig映射文件和SqlMap映射文件。
首先要配置的当然是SqlMapConfig文件:
- <?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>
- <!-- 唯一的Properties文件,加载数据库连接信息 -->
- <properties resource="mysql.properties"/>
- <!--配置和优化SqlMapClient实例的各选项,是可选的
- <settings
- cacheModelsEnabled="true"
- enhancementEnabled="true"
- lazyLoadingEnabled="true"
- errorTracingEnabled="true"
- maxRequests="32"
- maxSessions="10"
- maxTransactions="5"
- useStatementNamespaces="false"
- />
- -->
- <!-- 配置Ibatis事务管理,使用JDBC事务类型,数据源使用Simple类型 -->
- <transactionManager type="JDBC">
- <dataSource type="SIMPLE">
- <property name="JDBC.Driver" value="${mysql.driver}"/>
- <property name="JDBC.ConnectionURL" value="${mysql.url}"/>
- <property name="JDBC.Username" value="${mysql.username}"/>
- <property name="JDBC.Password" value="${mysql.password}"/>
- </dataSource>
- </transactionManager>
- <!-- 配置Ibatis要使用的SqlMap文件信息 -->
- <sqlMap resource="com/jack/ibatis/pojo/map/person.xml"/>
- </sqlMapConfig>
<?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> <!-- 唯一的Properties文件,加载数据库连接信息 --> <properties resource="mysql.properties"/> <!--配置和优化SqlMapClient实例的各选项,是可选的 <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> --> <!-- 配置Ibatis事务管理,使用JDBC事务类型,数据源使用Simple类型 --> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${mysql.driver}"/> <property name="JDBC.ConnectionURL" value="${mysql.url}"/> <property name="JDBC.Username" value="${mysql.username}"/> <property name="JDBC.Password" value="${mysql.password}"/> </dataSource> </transactionManager> <!-- 配置Ibatis要使用的SqlMap文件信息 --> <sqlMap resource="com/jack/ibatis/pojo/map/person.xml"/> </sqlMapConfig>
setting元素可以配置和优化SqlMapClient对象的各选项,因为本例只是简单的使用,所有并没有必要去配置。
现在配置SqlMap文件person.xml,此文件是专门针对您的POJO类进行配置的
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE sqlMap
- PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
- "http://ibatis.apache.org/dtd/sql-map-2.dtd">
- <sqlMap>
- <!-- 为Person类设置一个别名 -->
- <typeAlias alias="person" type="com.jack.ibatis.pojo.Person"/>
- <!-- 配置表和类之间的映射关系 -->
- <resultMap class="com.jack.ibatis.pojo.Person" id="personMap">
- <result property="id" column="ID"/>
- <result property="username" column="U_NAME"/>
- <result property="password" column="U_PASSWORD"/>
- </resultMap>
- <!-- 添加用户 -->
- <insert id="insertPerson" parameterClass="person">
- <!-- 配置Mysql主键自动增长 -->
- <selectKey keyProperty="id" resultClass="int">
- SELECT LAST_INSERT_ID() as value
- </selectKey>
- <!-- 配置Oracle主键自动增长
- <selectKey resultClass="int" keyProperty="id" type="pre">
- <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
- </selectKey>-->
- <!-- 配置MSServer主键自动增长
- <selectKey resultClass="int" keyProperty="id">
- <![CDATA[SELECT SCOPE_IDENTITY() AS ID ]]>
- </selectKey>-->
- <![CDATA[
- INSERT PERSON(U_NAME,U_PASSWORD) VALUES(#username#,#password#)
- ]]>
- </insert>
- <!-- 查看特定用户 -->
- <select id="queryPersonById" parameterClass="int" resultMap="personMap">
- <![CDATA[
- SELECT * FROM PERSON WHERE ID=#id#
- ]]>
- </select>
- <!-- 查看所有的用户 -->
- <select id="queryAllPerson" resultMap="personMap">
- <![CDATA[
- SELECT * FROM PERSON
- ]]>
- </select>
- </sqlMap>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap> <!-- 为Person类设置一个别名 --> <typeAlias alias="person" type="com.jack.ibatis.pojo.Person"/> <!-- 配置表和类之间的映射关系 --> <resultMap class="com.jack.ibatis.pojo.Person" id="personMap"> <result property="id" column="ID"/> <result property="username" column="U_NAME"/> <result property="password" column="U_PASSWORD"/> </resultMap> <!-- 添加用户 --> <insert id="insertPerson" parameterClass="person"> <!-- 配置Mysql主键自动增长 --> <selectKey keyProperty="id" resultClass="int"> SELECT LAST_INSERT_ID() as value </selectKey> <!-- 配置Oracle主键自动增长 <selectKey resultClass="int" keyProperty="id" type="pre"> <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]> </selectKey>--> <!-- 配置MSServer主键自动增长 <selectKey resultClass="int" keyProperty="id"> <![CDATA[SELECT SCOPE_IDENTITY() AS ID ]]> </selectKey>--> <![CDATA[ INSERT PERSON(U_NAME,U_PASSWORD) VALUES(#username#,#password#) ]]> </insert> <!-- 查看特定用户 --> <select id="queryPersonById" parameterClass="int" resultMap="personMap"> <![CDATA[ SELECT * FROM PERSON WHERE ID=#id# ]]> </select> <!-- 查看所有的用户 --> <select id="queryAllPerson" resultMap="personMap"> <![CDATA[ SELECT * FROM PERSON ]]> </select> </sqlMap>
OK,现在所有的配置都已经完成啦,现在来做一个简单的测试:
- package test.com.jack.ibatis;
- import java.io.Reader;
- import org.junit.Test;
- import com.ibatis.common.resources.Resources;
- import com.ibatis.sqlmap.client.SqlMapClient;
- import com.ibatis.sqlmap.client.SqlMapClientBuilder;
- import com.jack.ibatis.pojo.Person;
- public class TestPerson {
- @Test
- public void testInsert(){
- String resource = "sqlMapConfig.xml";
- try {
- //读取配置文件
- Reader reader = Resources.getResourceAsReader(resource);
- //得到SqlMapClient
- SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
- Person person = new Person();
- person.setUsername("jack");
- person.setPassword("jack");
- //开始Ibatis事务
- sqlMap.startTransaction();
- sqlMap.insert("insertPerson", person);
- //结束IBatis事务
- sqlMap.commitTransaction();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Test
- public void testQuery(){
- String resource = "sqlMapConfig.xml";
- try {
- //读取配置文件
- Reader reader = Resources.getResourceAsReader(resource);
- //得到SqlMapClient
- SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
- //查看全部的用户
- sqlMap.queryForList("queryAllPerson");
- //查看特定的用户
- sqlMap.queryForObject("queryPersonById", 1);
- }catch(Exception e){}
- }
- }
package test.com.jack.ibatis; import java.io.Reader; import org.junit.Test; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; import com.jack.ibatis.pojo.Person; public class TestPerson { @Test public void testInsert(){ String resource = "sqlMapConfig.xml"; try { //读取配置文件 Reader reader = Resources.getResourceAsReader(resource); //得到SqlMapClient SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); Person person = new Person(); person.setUsername("jack"); person.setPassword("jack"); //开始Ibatis事务 sqlMap.startTransaction(); sqlMap.insert("insertPerson", person); //结束IBatis事务 sqlMap.commitTransaction(); } catch (Exception e) { e.printStackTrace(); } } @Test public void testQuery(){ String resource = "sqlMapConfig.xml"; try { //读取配置文件 Reader reader = Resources.getResourceAsReader(resource); //得到SqlMapClient SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); //查看全部的用户 sqlMap.queryForList("queryAllPerson"); //查看特定的用户 sqlMap.queryForObject("queryPersonById", 1); }catch(Exception e){} } }