首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

IBatis容易实现(附主键自动生成)

2012-11-11 
IBatis简单实现(附主键自动生成)相对 Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半

IBatis简单实现(附主键自动生成)
相对 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文件为:


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类:

Java代码
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文件:

Java代码
<?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类进行配置的

Java代码
<?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 id="personMap">            <result property="id" column="ID"/>            <result property="username" column="U_NAME"/>            <result property="password" column="U_PASSWORD"/>        </resultMap>        <!-- 添加用户 -->        <insert id="insertPerson" parameterresultkeyProperty="id" type="pre">                                    <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>                          </selectKey>-->                      <!-- 配置MSServer主键自动增长                       <selectKey resultkeyProperty="id">                             <![CDATA[SELECT SCOPE_IDENTITY() AS ID ]]>                        </selectKey>-->            <![CDATA[                INSERT PERSON(U_NAME,U_PASSWORD) VALUES(#username#,#password#)            ]]>        </insert>        <!-- 查看特定用户 -->        <select id="queryPersonById" parameterresultMap="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 id="personMap"><result property="id" column="ID"/><result property="username" column="U_NAME"/><result property="password" column="U_PASSWORD"/></resultMap><!-- 添加用户 --><insert id="insertPerson" parameterresultkeyProperty="id" type="pre">                                <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>                      </selectKey>-->                  <!-- 配置MSServer主键自动增长                   <selectKey resultkeyProperty="id">                         <![CDATA[SELECT SCOPE_IDENTITY() AS ID ]]>                    </selectKey>--><![CDATA[INSERT PERSON(U_NAME,U_PASSWORD) VALUES(#username#,#password#)]]></insert><!-- 查看特定用户 --><select id="queryPersonById" parameterresultMap="personMap"><![CDATA[SELECT * FROM PERSON WHERE ID=#id#]]></select><!-- 查看所有的用户 --><select id="queryAllPerson" resultMap="personMap"><![CDATA[SELECT * FROM PERSON]]></select></sqlMap>  
OK,现在所有的配置都已经完成啦,现在来做一个简单的测试:

Java代码
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){}        }    }  

热点排行