`
oaklet
  • 浏览: 108887 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iBatis的简单使用

    博客分类:
  • java
阅读更多
简介
使用 SQL Map,能够大大减少访问关系数据库的代码。SQL Map 使用简单的 XML配
置文件将 Java Bean 映射成 SQL 语句,对比其他的数据库持续层和 ORM 框架(如 JDO 的
实现,Hibernate 等) ,SQL Map 优点在于它简单易学。要使用 SQL Map,只要熟悉
Java Bean,XML 和 SQL,就能使您充分发挥 SQL 语句的能力。

适用情况
1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几
条 select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
2.开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由
存储过程实现
3.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高
度优化的SQL语句(或存储过程)才能达到系统性能设计指标。

ibatis-2.3.4.726
准备使用 SQL Map
如何建立 TEST 类与 TEST 数据表之间的映射呢?SQL Map对 Java Bean和数据表之间
的关系没有限制,如一个数据表映射成一个 Java Bean,或多个表映射成一个 Java Bean,或
多个 Java Bean 映射成一个数据表等。因为使用 SQL Map 您可以充分发挥 SQL 语句的全部
潜力而很少限制。下面这个例子,我们使用一个简单的表,将一个表映射成一个 Java Bean,
Java Bean 和表是一对一的关系。
建立表结构如下:
  CREATE TABLE TEST
  (
  TEST_ID NUMBER(10, 0),
  TEST_NAME VARCHAR2(50),
  TEST_TIME TIMESTAMP,
  TEST_TIME2 DATE,
  TEST_VALUE NUMBER(10, 3),
  TEST_VALUE2 INTEGER,
  TEST_VALUE3 FLOAT
  );

编写 Java Bean 如下:
import java.math.BigDecimal;
import java.sql.Timestamp;
public class TEST {
    public BigDecimal getTEST_ID() {
        return TEST_ID;
    }
    public void setTEST_ID(BigDecimal Test_id) {
        TEST_ID = Test_id;
    }
    public String getTEST_NAME() {
        return TEST_NAME;
    }
    public void setTEST_NAME(String Test_name) {
        TEST_NAME = Test_name;
    }
    public Timestamp getTEST_TIME() {
        return TEST_TIME;
    }
    public void setTEST_TIME(Timestamp Test_time) {
        TEST_TIME = Test_time;
    }
    public Timestamp getTEST_TIME2() {
        return TEST_TIME2;
    }
    public void setTEST_TIME2(Timestamp Test_time2) {
        TEST_TIME2 = Test_time2;
    }
    public BigDecimal getTEST_VALUE() {
        return TEST_VALUE;
    }
    public void setTEST_VALUE(BigDecimal Test_value) {
        TEST_VALUE = Test_value;
    }
    public BigDecimal getTEST_VALUE2() {
        return TEST_VALUE2;
    }
    public void setTEST_VALUE2(BigDecimal Test_value2) {
        TEST_VALUE2 = Test_value2;
    }
    public BigDecimal getTEST_VALUE3() {
        return TEST_VALUE3;
    }
    public void setTEST_VALUE3(BigDecimal Test_value3) {
        TEST_VALUE3 = Test_value3;
    }
    private BigDecimal TEST_ID;
    private String TEST_NAME;
    private Timestamp TEST_TIME;
    private Timestamp TEST_TIME2;
    private BigDecimal TEST_VALUE;
    private BigDecimal TEST_VALUE2;
    private BigDecimal TEST_VALUE3;
}

SQL Map的配置文件
配置文件是 SQL MAP的配置信息统一设置的地方。 SQL Map 配置文件是 XML 文件,
我们可以它设置各种属性,JDBC DataSource和 SQL Map。在配置文件中,可以
方便地统一配置 DataSource 不同的实现。SQL Map 框架包括
DataSource的 iBATIS 实现: SimpleDataSource 类, Jakarta DBCP (Commons),
和可通过 JNDI上下文查找的 DataSource(即应用服务器中的 DataSource)。
对于上面的例子,配置非常简单,如下所示:
SqlMapConfig.xml
<?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>

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

    <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>
            <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@127.0.0.1:1521:test"/>
            <property name="JDBC.Username" value="user"/>
            <property name="JDBC.Password" value="user"/>
            <property name="JDBC.DefaultAutoCommit" value="true"/>
            <property name="Pool.MaximumActiveConnections" value="10"/>
            <property name="Pool.MaximumIdleConnections" value="5"/>
            <property name="Pool.MaximumCheckoutTime" value="120000"/>
            <property name="Pool.TimeToWait" value="20000"/>
            <property name="Pool.PingQuery" value="SELECT 1 FROM DUAL"/>
            <property name="Pool.PingEnabled" value="true"/>
            <property name="Pool.PingConnectionsOlderThan" value="300000"/>
            <property name="Pool.PingConnectionsNotUsedFor" value="180000"/>
        </dataSource>
    </transactionManager>

    <sqlMap resource="TEST.xml"/>

</sqlMapConfig>

参数描述
cacheModelsEnabled是否启用SqlMapClient上的缓存机制。建议设为"true"。
enhancementEnabled是否针对POJO启用字节码增强机制以提升 getter/setter 的调用效能,避免使用Java Reflect所带来的性能开销。同时,这也为Lazy Loading带来了极大的性能提升。建议设为"true"。
lazyLoadingEnabled是否启用延迟加载机制,建议设为"true"。
maxRequests最大并发请求数(Statement并发数)。
maxSessions最大Session数。即当前最大允许的并发SqlMapClient 数。
maxTransactions最大并发事务数。maxTransactions<maxSessions<maxRequests
useStatementNamespaces是否使用Statement命名空间。这里的命名空间指的是映射文件中,sqlMap节点的namespace属性。


SQL Map的映射文件
现在 DataSource 已经配置好了,并且有了统一的 SQL Map 配置文件,我们还需要 SQL
Map 的映射文件。映射文件包括 SQL 语句和参数对象和结果对象的映射。
继续上面的例子,为 TEST 类和 TEST 表之间创建一个 SQL Map 映射文件。
TEST.xml
<?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 namespace="TEST">
  <typeAlias alias="TEST" type="net.oaklet.jdbc.TEST"/>
  <select id="selectTESTById" parameterClass="TEST" resultClass="TEST">
      select
  TEST_ID,
  TEST_NAME,
  TEST_TIME,
  TEST_TIME2,
  TEST_VALUE,
  TEST_VALUE2,
  TEST_VALUE3
      from TEST where TEST_ID=#TEST_ID#
  </select>
  <select id="selectTEST" resultClass="TEST">
      select
  TEST_ID,
  TEST_NAME,
  TEST_TIME,
  TEST_TIME2,
  TEST_VALUE,
  TEST_VALUE2,
  TEST_VALUE3
      from TEST
  </select>
  <insert id="insertTEST" parameterClass="TEST">
      insert into TEST (
  TEST_ID,
  TEST_NAME,
  TEST_TIME,
  TEST_TIME2,
  TEST_VALUE,
  TEST_VALUE2,
  TEST_VALUE3
      ) values (
  #TEST_ID#,
  #TEST_NAME#,
  #TEST_TIME#,
  #TEST_TIME2#,
  #TEST_VALUE#,
  #TEST_VALUE2#,
  #TEST_VALUE3#
      )
  </insert>
  <update id="updateTEST" parameterClass="TEST">
    <![CDATA[
      update TEST set
  TEST_NAME = #TEST_NAME#,
  TEST_TIME = #TEST_TIME#,
  TEST_TIME2 = #TEST_TIME2#,
  TEST_VALUE = #TEST_VALUE#,
  TEST_VALUE2 = #TEST_VALUE2#,
  TEST_VALUE3 = #TEST_VALUE3#
      where TEST_ID=#TEST_ID#
    ]]>
  </update>
  <delete id="deleteTESTById" parameterClass="TEST">
      delete from TEST where TEST_ID=#TEST_ID#
  </delete>
</sqlMap>

该例子是 SQL Map最简单的形式。它使用了 SQL Map框架中一个特性,根据匹配
的名字将 ResultSet 的列映射成 Java Bean 的属性(或Map的 key值)。
#value#符号是输入参数,该符号表示使用了输入参数。

⑴ ID
指定了操作 ID,之后我们可以在代码中通过指定操作 id 来执行此节点所定
义的操作,如:
sqlMap.update("updateTEST",test);

⑵ parameterClass
指定了操作所需的参数类型,此例中 update 操作以 TEST 类型的对象作为参数,
目标是将提供的 TEST 实例更新到数据库。

⑶ <![CDATA[……]]>
通过<![CDATA[……]]>节点,可以避免 SQL 中与 XML 规范相冲突的字符对
XML映射文件的合法性造成影响。

⑷ 执行更新操作的 SQL,这里的 SQL 即实际数据库支持的 SQL 语句,将由
ibatis填入参数后交给数据库执行。

使用 SQL Map 框架编程
我们完成了所有的配置文件和映射文件,就剩下的应用的编码工作了。首先要设
置SQL Map, 读入刚创建好的SQL Map XML配置文件。 SqlMapClient 对象是线程安全
并且应持久生存。对于一个特定的应用,只需进行一次 SqlMap 配置。
因此,它可以作为基类的一个静态对象(即 DAO对象的基类) ,或者,
如果您想让它有更大的作用范围,可以把它封装在方便使用的类中。

例1:数据写入操作(insert):
FileReader fileReader = new FileReader("SqlMapConfig.xml");
SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(fileReader);
fileReader.close();
TEST test = new TEST();
test.setTEST_ID(BigDecimal.valueOf(51212));
test.setTEST_NAME("testString");
Object key = sqlMapClient.insert("insertTEST", test);

例2:数据更新操作(update):
TEST test = new TEST();
test.setTEST_ID(BigDecimal.valueOf(51212));
test.setTEST_NAME("testString2");
int update = sqlMapClient.update("updateTEST", test);

例3:数据删除操作(delete):
TEST test = new TEST();
test.setTEST_ID(BigDecimal.valueOf(51212));
int number = sqlMapClient.delete("deleteTESTById", test);

例4:数据查询操作(select):
List list = sqlMapClient.queryForList("selectTEST");


import java.io.FileReader;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class OracleTest {
    public static void main(String[] args) throws Exception {
        FileReader tarReader = new FileReader("SqlMapConfigOra.xml");
        SqlMapClient targetClient = SqlMapClientBuilder.buildSqlMapClient(tarReader);
        tarReader.close();

        long currentTimeMillis = System.currentTimeMillis();
        Timestamp timestamp = new Timestamp(currentTimeMillis);
        TEST t = new TEST();
        t.setTEST_ID(BigDecimal.valueOf(51212));
        t.setTEST_NAME("testString");
        t.setTEST_TIME(timestamp);
        t.setTEST_TIME2(timestamp);
        t.setTEST_VALUE(BigDecimal.valueOf(51200));
        t.setTEST_VALUE2(BigDecimal.valueOf(51200));
        t.setTEST_VALUE3(BigDecimal.valueOf(51200));
        targetClient.insert("insertTEST", t);

        for (TEST test : targetClient.queryForList("selectTEST")) {
            System.out.println(test);
        }
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics