IBATIS是优秀的半ORM框架,原先一直在用HIBERNATE,不过对HIBERNATE过于强大但问题多多的ORM方案十分反感。遂翻阅了一下IBATIS。自己写了一个例子,不用SPRING+STRUTS。
首先去ibatis.apache.org下载最新的2.X的ibatis包,我用的是JAR包,没有用ibator插件调试安装。本地环境,ORACLE数据库,JDK1.6。
ibatis的核心是sqlmap框架。
新建一个JAVA工程即可,导入ibatisJAR包。我的是ibatis2.3.4-768.jar。新建一个XML文件,sql-map-config.xml,这个文件用于配置配置JDBC事务管理。
sql-map-config.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" <!--全局性地启用或禁用SqlMapClient的所有缓存model。调试程序时使用-->
enhancementEnabled="true" <!--全局性地启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能,同时优化延迟加载的性能。-->
lazyLoadingEnabled="true" <!--全局性地启用或禁用SqlMapClient的所有延迟加载。调试程序时使用。-->
maxRequests="32" <!--同时执行SQL语句的最大线程数-->
maxSessions="10" <!--同一时间内活动的最大session数-->
maxTransactions="5" <!--同一时间内允许的最大SqlMapClient.startTransaction()的线程数-->
useStatementNamespaces="false"
/>
<transactionManager type="JDBC" > <!--JDBC事务管理器-->
<dataSource type="SIMPLE">
<propertyname="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@192.168.0.16:1521:orcl"/>
<property name="JDBC.Username" value="procczg"/>
<property name="JDBC.Password" value="procczg"/>
</dataSource>
</transactionManager>
<sqlMap resource="ibatis/Taxpayer.xml" /> <!--这是引用所有的SQL配置文件,ibatis在此处声明要调用到的SQL文件-->
</sqlMapConfig>
我们在表里有一张数据表 :
create table TAXPAYER
(
ID NUMBER(10),
NSR_NAME VARCHAR2(256),
ORG_ID NUMBER,
NSRSBH VARCHAR2(20),
GXSJ VARCHAR2(20)
)
数据请自行录入。
taxpayer对应的JAVABEAN:
public class Taxpayer {
/** 业务字段 */
private int id;
private String nsr_name;
private String org_id;
private String nsrsbh;
private String gxsj;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNsr_name() {
return nsr_name;
}
public void setNsr_name(String nsr_name) {
this.nsr_name = nsr_name;
}
public String getOrg_id() {
return org_id;
}
public void setOrg_id(String org_id) {
this.org_id = org_id;
}
public String getNsrsbh() {
return nsrsbh;
}
public void setNsrsbh(String nsrsbh) {
this.nsrsbh = nsrsbh;
}
public String getGxsj() {
return gxsj;
}
public void setGxsj(String gxsj) {
this.gxsj = gxsj;
}
}
接下来,我们新建一个taxpayer.xml,所有对taxpayer表的SQL操作,全部写在这个文件里,
taxpayer.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="Taxpayer">
<statement id="getTaxpayer" resultClass="ibatis.Taxpayer">
select * from taxpayer where id = #id#
and org_id = #org# and nsr_name like '%$nsrmc$%'
</statement>
</sqlMap>
这里写了一个需要有3个条件的查询,并且把条件适当复杂一下,用个LIKE条件。注意,这个SQL配置里面,我们用到了3个参数。下面我们要在调用该SQL的时候,分别给这3个参数赋值。阅读了一下ibatis的中文手册,我们可以采用MAP的方式赋值。下面开始写测试类,需要调用ibatis库下的sqlMap框架类来实现:
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class IbatisTest {
/**
* @param args
* author by 刘峰
* 2010-6-22下午04:47:21
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SqlMapClient s = null;
try {
Reader reader = Resources.getResourceAsReader("ibatis/sql-map-config.xml");
s = SqlMapClientBuilder.buildSqlMapClient(reader);
Map mParameter = new HashMap();
mParameter.put("id", new Integer(10533));
mParameter.put("org", new Integer(16));
mParameter.put("nsrmc", "纳税人名称");
Taxpayer t = (Taxpayer)s.queryForObject("getTaxpayer", mParameter);
System.out.println(t.getId());
System.out.println(t.getNsr_name());
System.out.println(t.getNsrsbh());
System.out.println(t.getOrg_id());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
赋值时候,Integer,String, Character等常用的对象类型写到MAP里面去即可。不过Ibatis对Long的支持并不太好。本人是初学,望有知情者告知一下Long的支持情况。
新增,修改,删除操作请自行完成。
使用后感想,个人用下来,ibatis等于把业务中的代码部分和数据库操作部分完好地分离开来。使开发过程中的层次清晰。避免了在JAVA里出现SQL语句这样维护极其麻烦的处理方式。同时很好的支持存储过程,动态拼SQL等一些在实际应用中经常碰到的情况。
缺点:由于是半orm的东西,对于一张表的操作,定义非常繁琐,JAVABEAN和IBATIS里SQL的配置文件其实是没有任何关系。导致的问题是,如果客户在表里新增一个字段,并且要把这个字段作为查询字段,我们不光要改JAVA文件,添加属性,同时还要去改IBATIS的相应SQL文件,相应的查询、新增、修改,只要涉及到的,全部都要统一地做修改。这对开发人员来说,工作量极其繁琐,而且很容易报错。HIBERNATE不存在这个问题,但是HIBERNATE的性能实在有待商榷。