iBatis的简单使用

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

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

ibatis-2.3.4.726
[b]准备使用 SQL Map [/b]
如何建立 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;
}

[b]SQL Map的配置文件[/b]
配置文件是 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>

[table]
|参数|描述
|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属性。
[/table]

[b]SQL Map的映射文件[/b]
现在 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填入参数后交给数据库执行。

[b]使用 SQL Map 框架编程[/b]
我们完成了所有的配置文件和映射文件,就剩下的应用的编码工作了。首先要设
置SQL Map, 读入刚创建好的SQL Map XML配置文件。 SqlMapClient 对象是[b]线程安全[/b],
并且应持久生存。对于一个特定的应用,只需进行一次 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);
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值