随笔 - 72  文章 - 28  trackbacks - 0
<2014年1月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(4)

随笔分类(66)

随笔档案(72)

文章档案(19)

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜

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.javaDefine_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 参数是按照parameterMapproperty顺序进行填装的---------------

              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

XmlSqlMapClientBuilderibatis 2.0之后版本新引入的组件,用以替代1.x

版本中的XmlSqlMapBuilder。其作用是根据配置文件创建SqlMapClient实例。

SqlMapClient

SqlMapClientibatis的核心组件,提供数据操作的基础平台

 

 

 

 

posted on 2014-01-07 15:50 kelly 阅读(346) 评论(0)  编辑  收藏 所属分类: java 框架

只有注册用户登录后才能发表评论。


网站导航: