Ibatis介紹與用例
一、介紹
ibatis 是一種“半自動化”的ORM實現(xiàn)。iBATIS是以SQL為中心的持久化層框架。能支持懶加載、關(guān)聯(lián)查詢、繼承等特性。iBATIS不同于一般的OR映射框架(eg:hibernate)。OR映射框架,將數(shù)據(jù)庫表、字段等映射到類、屬性,那是一種元數(shù)據(jù)(meta-data)映射。iBATIS則是將SQL查詢的參數(shù)和結(jié)果集映射到類。因此可以說,iBATIS做的是SQL Mapping的工作。它把SQL語句看成輸入以及輸出,結(jié)果集就是輸出,而where后面的條件參數(shù)則是輸入。iBATIS能將輸入的普通POJO對象、Map、XML等映射到SQL的條件參數(shù)上,同時也可以將查詢結(jié)果映射到普通POJO對象(集合)、Map、XML等上面。iBATIS使用xml文件來映射這些輸入以及輸出。能大大減少數(shù)據(jù)庫存儲部分的代碼量,而且可以非常方便的利用SQL中的一些小技巧。
二、用例
1、需要的jar包,以oracle數(shù)據(jù)為例,可以到mybatis官網(wǎng)去下載
2、創(chuàng)建一個WEB Project項目,新建包com.ibatis.sample.config.以下的新創(chuàng)建文件都是在這個包下進(jìn)行創(chuàng)建。
3、創(chuàng)建ibatis的配置文件,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> <properties resource="com/ibatis/sample/config/db.properties" /> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${driver}"/> <property name="JDBC.ConnectionURL" value="${url}"/> <property name="JDBC.Username" value="${user}"/> <property name="JDBC.Password" value="${password}"/> <!-- <property name="JDBC.DefaultAutoCommit" value="true"/> --> <property name="Pool.MaximumActiveConnections" value="10"/> <property name="Pool.MaximumIdleConnections" value="5"/> <property name="Pool.MaximumCheckoutTime" value="9000"/> <property name="Pool.TimeToWait" value="10000"/> <property name="Pool.PingQuery" value="select 1 from dual"/> <property name="Pool.PingEnabled" value="true"/> <property name="Pool.PingConnectionsOlderThan" value="0"/> <property name="Pool.PingConnectionsNotUsedFor" value="3600000"/> <property name="Pool.QuietMode" value="true"/> </dataSource> </transactionManager> <sqlMap resource="com/ibatis/sample/config/Area.xml"/> <sqlMap resource="com/ibatis/sample/config/Industry.xml"/> </sqlMapConfig> |
說明:創(chuàng)建setting屬性,創(chuàng)建數(shù)據(jù)庫鏈接,配置sqlMap數(shù)據(jù)庫映射文件。這里引用參數(shù)配置文件db.properties,使用參數(shù)時用 ${參數(shù)名} 的方式引用參數(shù)值
4、創(chuàng)建參數(shù)配置文件db.properties,可以在SqlMapConfig.xml直接引用
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.1.18:1521:CMEBP
user=dev
password=easycode2008
5、創(chuàng)建POJO實體類,Area.java和Define_industry.java,對應(yīng)數(shù)據(jù)庫中表中的字段
Area.java代碼:
package com.ibatis.sample.config;
import java.io.Serializable;
public class Area implements Serializable{
private int area_id;
private String province;
private String area;
private String code;
private String regdate;
public int getArea_id() {
return area_id;
}
public void setArea_id(int areaId) {
area_id = areaId;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
}
Define_industry.java代碼:
package com.ibatis.sample.config;
import java.io.Serializable;
public class Define_industry implements Serializable{
private int industry_id;
private String title;
public Define_industry(){};
public Define_industry(int industry_id,String title){
this.industry_id=industry_id;
this.title=title;
}
public int getIndustry_id() {
return industry_id;
}
public void setIndustry_id(int industryId) {
industry_id = industryId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
6、創(chuàng)建針對Area對象和Define_industry對象的CRUD的xml映射配置:Area.xml和industry.xml
Area.xml主要以查詢?yōu)橹髯雠e例說明,代碼如下
<?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="Area">
<typeAlias alias="area" type="com.ibatis.sample.config.Area"/>
<select id="getArea" parameterClass="int" resultClass="area">
<![CDATA[
select province,area,code,to_char(regdate,'yyyy-mm-dd') as regdate from DEFINE_AREA where area_id=#id#
]]>
</select>
<select id="getArealist" resultClass="area">
<![CDATA[
select * from DEFINE_AREA
]]>
</select>
<select id="getArealist1" parameterClass="String" resultClass="area">
<![CDATA[
select area_id, province,area,code from DEFINE_AREA where area like '%'||#are#||'%'
]]>
</select>
<resultMap id="get_area_result" class="area">
<result property="area_id" column="area_id" jdbcType="NUMBER" javaType="int"/>
<result property="area" column="area" jdbcType="VARCHAR" javaType="String"/>
</resultMap>
<select id="getArealist2" parameterClass="area" resultMap="get_area_result">
select area_id, province,area,code from DEFINE_AREA
<dynamic prepend="where">
<isNotEmpty prepend="and" property="area">
area like '%'||#area#||'%'
</isNotEmpty>
</dynamic>
</select>
</sqlMap>
Industry.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="Industry">
<typeAlias alias="industry" type="com.ibatis.sample.config.Define_industry"/>
<select id="get_industryid" resultClass="int">
<![CDATA[
select seq_define_industry.nextval from dual
]]>
</select>
<insert id="insertIndustry" parameterClass="industry">
<!-- <insert> 元素的子元素 < selectKey> 來支持主鍵自動生成,并把值寫入相應(yīng)的keyproperty對應(yīng)的字段中-->
<selectKey resultClass="java.lang.Integer" keyProperty="industry_id" >
select seq_define_industry.nextval from dual
</selectKey>
insert into DEFINE_INDUSTRY(industry_id,title) values(#industry_id#,#title#)
</insert>
<update id="updateIndustry" parameterClass="industry">
update DEFINE_INDUSTRY set title=#title# where industry_id=#industry_id#
</update>
<delete id="delIndustry" parameterClass="int">
delete from DEFINE_INDUSTRY where industry_id=#industry_id#
</delete>
<parameterMap id="login_pro" class="map">
<parameter property="id" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="pwd" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="CompanyID" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
<parameter property="companyname" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="groupID" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
<parameter property="group_desc" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="selectLevel" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="updateLevel" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="addLelvel" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="delelteLevel" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="Account_id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
<parameter property="Grade" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
<parameter property="account" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="Name" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="Mobile" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
<parameter property="Result" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
</parameterMap>
<procedure id="login_user" parameterMap="login_pro">
<![CDATA[{ call procedure_ecsystem_login(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) }]]>
</procedure>
</sqlMap>
1).可以看出通過<insert>、<delete>、<update>、<select>四個節(jié)點,分別定義對象的增刪改查(CRUD)操作。其次,還有<Procesure>節(jié)點,用于存儲過程的操作。
2)ID: 指定了操作ID,之后我們可以在代碼中通過指定操作id 來執(zhí)行此節(jié)點所定義的操作. 3)ParameterClass: 指定了操作所需的參數(shù)類型
4)<![CDATA[……]]>
通過<![CDATA[……]]>節(jié)點,可以避免SQL 中與XML 規(guī)范相沖突的字符對
XML映射文件的合法性造成影響。
5). ResultClass: 指定了操作返回的參數(shù)類型
7、創(chuàng)建測試程序
package com.ibatis.sample.config;
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 ClientTest {
private static final String Integer = null;
public static void main(String args[]) {
try {
String resource = "com/ibatis/sample/config/SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader (resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
try{
sqlMap.startTransaction();//開始事務(wù)
Area area =(Area)sqlMap.queryForObject("getArea",new Integer(5));
System.out.println(area.getProvince());
System.out.println(area.getArea());
System.out.println(area.getRegdate());
List list=(List)sqlMap.queryForList("getArealist");
for (int i = 0; i < list.size(); i++) {
Area area1=(Area)list.get(i);
System.out.println(area1.getArea_id()+"--"+area1.getArea());
}
List list1=(List)sqlMap.queryForList("getArealist1","南");
for (int i = 0; i < list1.size(); i++) {
Area area1=(Area)list1.get(i);
System.out.println(area1.getArea_id()+"--"+area1.getArea());
}
Area varea =new Area();
varea.setArea("南");
List list2=(List)sqlMap.queryForList("getArealist2",varea);
for (int i = 0; i < list2.size(); i++) {
Area vmap=(Area)list2.get(i);
System.out.println("getArealist2="+vmap.getArea());
}
// int id=((java.lang.Integer) sqlMap.queryForObject("get_industryid")).intValue();
// System.out.println(id);
//=====<insert> 元素的子元素 < selectKey> 來支持主鍵自動生成,并可以通過get方法取得值=======
// Define_industry industry=new Define_industry();
// industry.setTitle("測試id");
// sqlMap.insert("insertIndustry",industry);
// System.out.println("獲取插入的ID值="+industry.getIndustry_id());
Define_industry industry=new Define_industry(10,"其它");
int rownum=sqlMap.update("updateIndustry",industry);
System.out.println("rownum="+rownum);
// sqlMap.delete("delIndustry",25);
//-------procedure testing 參數(shù)是按照parameterMap的property順序進(jìn)行填裝的---------------
Map<String,String> paramMap=new HashMap<String, String>();
paramMap.put("id", "admin");
paramMap.put("pwd", "admin");
sqlMap.queryForObject("login_user",paramMap);
System.out.println(paramMap.get("companyname"));
System.out.println(String.valueOf(paramMap.get("Grade")));
System.out.println(paramMap.get("account"));
System.out.println(paramMap.get("Mobile"));
System.out.println(paramMap.get("Name"));
sqlMap.commitTransaction();//提交事務(wù)
}finally{
sqlMap.endTransaction();
}
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e1){
e1.printStackTrace();
}
}
}
XmlSqlMapClientBuilder
XmlSqlMapClientBuilder是ibatis 2.0之后版本新引入的組件,用以替代1.x
版本中的XmlSqlMapBuilder。其作用是根據(jù)配置文件創(chuàng)建SqlMapClient實例。
SqlMapClient
SqlMapClient是ibatis的核心組件,提供數(shù)據(jù)操作的基礎(chǔ)平臺