Ibatis介绍与用例
一、介绍
ibatis 是一种“半自动化”的ORM实现。iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性。iBATIS不同于一般的OR映射框架(eg:hibernate)。OR映射框架,将数据库表、字段等映射到类、属性,那是一种元数据(meta-data)映射。iBATIS则是将SQL查询的参数和结果集映射到类。因此可以说,iBATIS做的是SQL Mapping的工作。它把SQL语句看成输入以及输出,结果集就是输出,而where后面的条件参数则是输入。iBATIS能将输入的普通POJO对象、Map、XML等映射到SQL的条件参数上,同时也可以将查询结果映射到普通POJO对象(集合)、Map、XML等上面。iBATIS使用xml文件来映射这些输入以及输出。能大大减少数据库存储部分的代码量,而且可以非常方便的利用SQL中的一些小技巧。
二、用例
1、需要的jar包,以oracle数据为例,可以到mybatis官网去下载
2、创建一个WEB Project项目,新建包com.ibatis.sample.config.以下的新创建文件都是在这个包下进行创建。
3、创建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> |
说明:创建setting属性,创建数据库链接,配置sqlMap数据库映射文件。这里引用参数配置文件db.properties,使用参数时用 ${参数名} 的方式引用参数值
4、创建参数配置文件db.properties,可以在SqlMapConfig.xml直接引用
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.1.18:1521:CMEBP
user=dev
password=easycode2008
5、创建POJO实体类,Area.java和Define_industry.java,对应数据库中表中的字段
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、创建针对Area对象和Define_industry对象的CRUD的xml映射配置:Area.xml和industry.xml
Area.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="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> 来支持主键自动生成,并把值写入相应的keyproperty对应的字段中-->
<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>四个节点,分别定义对象的增删改查(CRUD)操作。其次,还有<Procesure>节点,用于存储过程的操作。
2)ID: 指定了操作ID,之后我们可以在代码中通过指定操作id 来执行此节点所定义的操作. 3)ParameterClass: 指定了操作所需的参数类型
4)<![CDATA[……]]>
通过<![CDATA[……]]>节点,可以避免SQL 中与XML 规范相冲突的字符对
XML映射文件的合法性造成影响。
5). ResultClass: 指定了操作返回的参数类型
7、创建测试程序
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();//开始事务
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 参数是按照parameterMap的property顺序进行填装的---------------
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();//提交事务
}finally{
sqlMap.endTransaction();
}
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e1){
e1.printStackTrace();
}
}
}
XmlSqlMapClientBuilder
XmlSqlMapClientBuilder是ibatis 2.0之后版本新引入的组件,用以替代1.x
版本中的XmlSqlMapBuilder。其作用是根据配置文件创建SqlMapClient实例。
SqlMapClient
SqlMapClient是ibatis的核心组件,提供数据操作的基础平台
posted on 2014-01-07 15:50
kelly 阅读(364)
评论(0) 编辑 收藏 所属分类:
java 框架