iBatis小例子

     相对Hibernate提供了全面的数据库封装机制的“全自动化”ORM实现而言,ibatis要求开发者编写具体的SQL语句。ibatis以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。当系统性能要求苛刻、数据处理量大的时候,不失为一种上佳的选择!
   这次学习一下ibatis,首先还是来准备必备包:iBATIS_DBL-2.0.0.281-Final.zip、ibatis-common-2.jar、ibatis-dao-2.jar、ibatis-sqlmap-2.jar、commons-logging-1-0-3.jar、log4j-1.2.8.jar。(以上jar包都可以在iBATIS_DBL-2.0.0.281-Final.zip中找到)数据库仍然使用学习Hibernate时使用的Hsqldb。以上必备包可以在ibatis.apache.org和hsqldb.sourceforge.net下载到。


实例:

在Hsqldb中创建ibatisTest数据库,并创建一张T_USER表,编写User.java和User.xml(基于ibatis的O/R映射关系),编写SqlMapConfig.xml配置文件,编写UserAction.java的业务类,实现往T_USER表中插入一条id = 1,name = Erica,sex = 1的数据。

 

数据库:

使用Hsqldb,TYPE选择HSQL DataBase Engine Service,URL填写jdbc.hsqldb:ibatisTest,其余不变,创建好ibatisTest数据库。在执行框中输入以下SQL语句:

Create TABLE T_USER(
    ID INTEGER NOT NULL PRIMARY KEY,
    NAME VARCHAR NOT NULL,
    SEX INTEGER NOT NULL)

数据库建立成功!

 

O/R映射关系:

分别编写User.java和User.xml两个文件。

1、User.java类

package com.ibatis.sample;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;


public class User implements Serializable {
    private Integer id;
    private String name;
    private Integer sex;
    private Set addresses = new HashSet();

    
    public User() {

    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getSex() {
        return this.sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String toString() {
        return "[User] " + name + "(" + id + ") sex=" + sex;
    }

}


2、User.xml文件

<?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="User">

    <typeAlias alias="user" type="com.ibatis.sample.User"/>

    <insert id="insertUser" parameterClass="user">
<![CDATA[
Insert INTO T_USER (
ID,
NAME,
SEX)
VALUES (
#id#,
#name#,
#sex#
)
]]>
    </insert>

</sqlMap>

 

配置文件SqlMapConfig.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
        PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>

    <settings
            cacheModelsEnabled="true"
            enhancementEnabled="true"
            lazyLoadingEnabled="true"
            errorTracingEnabled="true"
            maxRequests="32"
            maxSessions="10"
            maxTransactions="5"
            useStatementNamespaces="false"
            />

    <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
            <property 
                      value="org.hsqldb.jdbcDriver"/>
            <property 
                      value="jdbc:hsqldb:DB/ibatisTest"/>
            <property value="sa"/>
            <property value=""/>
            <property value="10"/>
            <property value="5"/>
            <property value="120000"/>
            <property value="500"/>
            <property value="select 1 from ACCOUNT"/>
            <property value="false"/>
            <property value="1"/>
            <property value="1"/>
        </dataSource>
    </transactionManager>

    <sqlMap resource="com/ibatis/sample/User.xml"/>

</sqlMapConfig>

我们用这个文件配置数据库连接方式,并以<sqlMap resource="com/ibatis/sample/User.xml"/>告知ibatis,应该为User.xml建立映射关系等。

 

业务类UserAction.java:

package com.ibatis;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.engine.builder.xml.XmlSqlMapClientBuilder;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sample.User;

import java.io.Reader;

public class UserAction {

    public static void main(String[] args) throws Exception {
        String resource ="com/ibatis/sample/SqlMapConfig.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        XmlSqlMapClientBuilder xmlBuilder = new XmlSqlMapClientBuilder();
        SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
        //sqlMap系统初始化完毕

        User user = new User();
        user.setId(new Integer(1));
        user.setName("Erica");
        user.setSex(new Integer(1));
        System.out.println(user);
        
        try{
            sqlMap.startTransaction();
            sqlMap.insert("insertUser",user);
            sqlMap.commitTransaction();
            System.out.println(user);
        }
        catch(Exception e){
        }
        finally{
            sqlMap.endTransaction();
        }
    }

}
这也是一个没有SQL语句的业务类,但是并不像Hibernate的“全自动化”机制,所有SQL语句由Hibernate自动生成。在这里,我们将sqlMap.insert("insertUser",user);中“insertUser”对应的SQL语句写在了User.xml文件里,并在SqlMapConfig.xml文件里告知ibatis对其进行关系映射。ibatis正是以这种“半自动化”机制来运作的。

 

执行:

先将之前创建好的ibatisTest数据库文件ibatisTest.properties、ibatisTest.script(位于Hsqldb的data文件夹里),拷贝到工程目录的DB文件夹下。

一切都正常的话,运行后,我们可以在后台看到如下信息:

[User] Erica(1) sex=1
SimpleDataSource - Created connection 10973446.
Connection - {conn-100000} Connection
PreparedStatement - {pstm-100001} PreparedStatement:   Insert INTO T_USER ( ID, NAME, SEX) VALUES ( ?, ?, ? )      
PreparedStatement - {pstm-100001} Parameters: [1, Erica, 1]
PreparedStatement - {pstm-100001} Types: [java.lang.Integer, java.lang.String, java.lang.Integer]
[User] Erica(1) sex=1
SimpleDataSource - Returned connection 10973446 to pool.

这里ibatis和Hibernate略有不同。同样的数据库工具、同样是做insert操作,当我用Hibernate提交一个id为null的javabean的时候,由于Hibernate的“全自动化”机制,在SQL语句的执行过程中,Hibernate自动生成id号,并成功执行了SQL语句!但是,当我用ibatis提交一个id为null的javabean的时候,SQL语句执行就出错了!

将工程目录下的DB文件夹下的ibatisTest.data、ibatisTest.properties、ibatisTest.script三个文件拷贝到Hsqldb下的data文件夹下,覆盖原来创建的文件。使用原先的配置和数据库名进入,看看数据有没有插入成功!



[本日志由 admin 于 2007-09-22 11:35 PM 编辑]
文章来自: 本站原创
引用通告地址: http://www.is21.cn/trackback.asp?tbID=32
Tags:
评论: 0 | 引用: 0 | 查看次数: 2741
发表评论
你没有权限发表留言!