`

iBatis的基础知识

阅读更多
 
(1)
在数据库持久层的框架中,大家一定听过Hibernate的大名了吧,经典的SSH框架就有它的一份哦!可是我今天要说的却是另外一个持久层的框架,它就是iBatis。与Hibrenate相比,它的主要优势就是简单、小巧、轻量级,但是它的功能却丝毫不亚于Hibernate,下面让我们来看看iBatis在项目中的应用吧!
iBatis确实很简单,它的工作原理就是通过SQL Map映射文件将sql语句和java对象对应起来(如:在利用对象属性的getter从属性中获取值,查询结果后,将各值用setter方法放到对象中).在iBatis中,sql语句是我们手工编写好的,这一点与Hibernate不同,Hibernate是通过映射java对象和数据库表字段来自动生成的sql语句。
 
(2)
ibatis中的namespace与resultMap
<sqlMap namespace="admin">在运用时如下:
this.getSqlMapClient().update(“admin.update”, entity);
 
分析:
ibatis配置文件中的useStatementNamespaces:是否使用Statement命名空间。这里的命名空间指的是映射文件中,sqlMap节点的namespace属性,如:<sqlMap namespace="User">。这里,指定了此sqlMap节点下定义的操作均从属于"User"命名空间。
在useStatementNamespaces="true"的情况下,Statement调用需追加命名空间,如:sqlMap.update("User.updateUser",user);否则直接通过Statement名称调用即可,如:sqlMap.update("updateUser",user);
好处:
在实际应用中,利用namespace可以防止两个同名的方法而引起冲突。如有两个updateUser,可以通过A updateUser/B. updateUser来区分。
另一种方法:
但有一种更方便的方法,可以在不采用namspace的情况下,解决上面的问题:即直接在方法的前面直接命名为A updateUser/B. updateUser。调用时,直接调用A updateUser/B. updateUser即可
。如下:
<sqlMap> 
       <typeAlias type="com.admin.entity.Admin" alias="Admin" />
 
       <select id="Admin.findUserByLoginName" parameterClass="java.lang.String"
              resultMap="AdminResult">
              select * from T_ADMINISTRATORS where longinName = #value#
              and status != 4
       </select>
调用时,getSqlMapClientTemplate.queryForList(“Admin.findUserByLoginName”,”test”);即可。
 
请注意:
此时需要保证所有映射文件中,Statement定义无重名。 
 
第二:
resultMap:结果映射,需结合resultMap节点对映射关系加以定义。
<sqlMap> 
       <typeAlias type="com.admin.entity.Admin" alias="Admin" />
       <resultMap id="AdminResult" class="Admin">
              <result column="staff_id" property="id" />
              <result column="loginName" property="loginName" />
              <result column="password" property="password" />
              <result column="staff_name" property="username" />
              <result column="status" property="status" />
              <result column="phone" property="phone" />
              <result column="email" property="email" />
       </resultMap>
 
       <select id="Admin.findUserByLoginName" parameterClass="java.lang.String"
              resultMap="AdminResult">
              select * from T_ADMINISTRATORS where longinName = #value#
              and status != 4
       </select>
</sqlMap>
 
(3)关于ibatis中输入/输出各种类型的参数分析
在ibatis,输入的参数对象常以parameterClass来定义,输出的结果集常以resultMap来定义。(resultMap:方便JAVABEAN属性及字段的映射,调用JAVABEAN的setter进行设置值。通常我们不采用resultClass属性进行映射,因为它不具备映射数据库表字段的持久化特性。)
 
在ibateis中,parameterClass的类型大都是:string,int/对象/hashmap
                        resultclass/resultMap的类型大都是:对象/hashmap
当parameterClass为string,int时,可用#value#表示或直接用传入的值名表示。
当parameterClass/resultMap的类型是对象时用#属性#表示。程序会调用JAVABEAN的getter方法,进行获取属性值。
当parameterClass/resultMap的类型是hashmap(Map是key-value结构的)时,那程序会直接通过key来分析取参数。
 
具体请见以下两部分:
ibatis各种参数数据集
原型参数 
<select id="select1" parameterClass="java.lang.String" resultClass="AppLog">
    select
      ID as id,
      TYPE as type,
      DESCR as descr
    from APP_LOG
    where ID = #id#
 </select>
sqlMapper.queryForObject("select0", id);
--参数名与传入值名称一样。--应该也可用参数#value#表示

Map类参数 
<select id="select2" parameterClass="java.util.HashMap" resultClass="AppLog">
    select
      ID as id,
      TYPE as type,
      DESCR as descr
    from APP_LOG
    where ID = #ids#
 </select>      
map.put("ids", id);
AppLog log = (AppLog) sqlMapper.queryForObject("select0", map);
--通过key来获取值

对象参数 
   <select id="select3" parameterClass="AppLog" resultClass="AppLog">
    select
      ID as id,
      TYPE as type,
      DESCR as descr
    from APP_LOG
    where ID = #id#
 </select> 
AppLog p=new AppLog();
p.setId(id);
AppLog log = (AppLog) sqlMapper.queryForObject("select3", p);
 
动态字段、表 
<select id="selectd" resultClass="java.util.HashMap" parameterClass="java.util.HashMap"
remapResults="true">
    select $fieldList$      
    from $table$
    where ID = #id#
 </select> 
Map p = new HashMap();
p.put("id", id);
p.put("table","APP_LOG");
p.put("fieldList", "ID,TYPE,DESCR");
Map map = (Map) sqlMapper.queryForObject("selectd", p);
String id1 = (String) map.get("ID");
String type = (String) map.get("TYPE");
String descr = (String) map.get("DESCR");
注意:#与$区别:
1.#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by "id",这当然会报错..
2.$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了. 
 $方式一般用于传入数据库对象.例如传入表名.
#方式一般用于传入插入/更新的值或查询/删除的where条件
 
ibatis各种返回数据集
别名映射->实体类 + resultClass 
 <select id=" selectAll" resultClass="AppLog">
    select
      ID as id,
      TYPE as type,
      DESCR as descr
    from APP_LOG
    where ID = #id#
 </select> 
List list = sqlMapper.queryForList("selectAll");
for (int i = 0; i < list.size(); i ) {
    AppLog log = (AppLog) list.get(i);
   //add your code here;

注意:
为什么定义了resultClass="AppLog",而queryForList出来的是list?
这里的resultClass="AppLog",是指查询出来的每条记录的格式是AppLog。
当我们queryForList时,系统会将各条记录(即各个AppLog放到list中)传回给我们。当我们queryForObject时,就只传回一个AppLog。

别名映射->Map类+resultClass --》把每条记录放于map中,字段名为key,值为value.
 <select id=" selectAll" resultClass="java.util.HashMap">
    select
      ID as id,
      TYPE as type,
      DESCR as descr
    from APP_LOG
    where ID = #id#
 </select> 
List list = sqlMapper.queryForList("selectAll");
for (int i = 0; i < list.size(); i ) {
    Map map = (Map) list.get(i);
    String id = (String) map.get("id");
    String type = (String) map.get("type");
    String descr = (String) map.get("descr");
   //add your code here;
}
无映射 
<select id="selectAll3" resultClass="java.util.HashMap">
    select * from APP_LOG
 </select> 
List list = sqlMapper.queryForList("selectAll3");
for (int i = 0; i < list.size(); i ) {
    Map map = (Map) list.get(i);
    String id = (String) map.get("ID");
    String type = (String) map.get("TYPE");
    String descr = (String) map.get("DESCR");
}

显式映射->实体类:resultMap 
 <resultMap id="AppLogResult" class="AppLog">
    <result property="id" column="ID"/>
    <result property="type" column="Type"/>
    <result property="descr" column="DESCR"/>    
 </resultMap>
 
<select id="selectAll" resultMap="AppLogResult">
    select * from APP_LOG
 </select> 
List list = sqlMapper.queryForList("selectAll");
for (int i = 0; i < list.size(); i ) {
    AppLog log = (AppLog) list.get(i);
   //add your code here;
}

显式映射->Map类:resultMap  --》把每条记录放于map中,字段名为key,值为value.
    <resultMap id="map-result" class="java.util.HashMap">
       <result property="id" column="ID"/>
    <result property="type" column="Type"/>
    <result property="descr" column="DESCR"/>
    </resultMap>
 
<select id="selectAll2" resultMap="map-result">
    select * from APP_LOG
 </select> 
List list = sqlMapper.queryForList("selectAll2");
       for (int i = 0; i < list.size(); i ) {
           Map map = (Map) list.get(i);
           String id = (String) map.get("id");
           String type = (String) map.get("type");
           String descr = (String) map.get("descr");        
       }
 
又如:
map.put("appIds", Ids);
executor.update("Device.OpenClientApp", map);
下面的property属性及循环变量,都是对应map的key名。
                 -----证明,ibatis对于hashmap,都是通过key来获取值的。所以,所有参数须用key来表示!!!
如下:
 <update id="Device.OpenClientApp" parameterClass="java.util.HashMap">
        update T_Device_App_R_Info set Opr='1' where App_ID in
        <iterate conjunction="," open="(" close=")" property="appIds">
            #appIds[]#
        </iterate>
 </update>
例子:
<statement id=”statementName” parameterClass=” examples.domain.Product”>
insert into PRODUCT values (#id#, #description#, #price#, #classify.id#)
</statement>
蓝色部分#classify.id#翻译过来实际是product.getClassify().getId(),classify是Product对象的一个子对象。
(4)关于参数的三种设置方法 及 ParameterMap用法
前提:有一个user的javabean.
一,自动参数映射:
<insert id="insertUser7" parameterClass="user">
   <![CDATA[
    INSERT INTO t_user ( ID, NAME, PASS )VALUES( #id#,#name#,#pass# )
   ]]>
</insert>
二,内联参数映射:
<insert id="insertUser8" parameterClass="user">
   <![CDATA[
    INSERT INTO t_user ( ID, NAME, PASS ) VALUES( #id:INT#, #name:VARCHAR#, #pass:VARCHAR# )
   ]]>
</insert>
备注:  好像将属性对应的数据类型故意写错,程序也可正常执行,没报错.
三,外联参数映射:
以上二种方式都用paramClass,但此处用parameterMap.
<parameterMap id="parameterMap" class="user">
   <parameter property="id" jdbcType="INTEGER" />
   <parameter property="name" jdbcType="VARCHAR" />
   <parameter property="pass" jdbcType="VARCHAR" />
</parameterMap>
<insert id="insertUser9" parameterMap="parameterMap">
   <![CDATA[
    INSERT INTO t_user ( ID, NAME, PASS )VALUES( ?,?,? )
   ]]>
</insert>
若此处的对象不是javabean,而是一个hashMap.用法也一样,只是id,name,pass不是javabean的属性,而是hashMap的key.
String[] ids;
...........       
map.put("devId", ids[0]);
map.put("appId", ids[1]);
 
<!-- 自动参数映射方式 -->    
  <insert id="DAPermit.addAppDevMapping" parameterClass="java.util.HashMap"
    insert into T_Device_App_R_Info(Device_ID,App_ID,Opr) values (#devId#,#appId#,'2'); 
  </insert> 
     
<!--    
内联方式: 
  <insert id="DAPermit.addAppDevMapping" parameterClass="java.util.HashMap"> 
    insert into T_Device_App_R_Info(Device_ID,App_ID,Opr) values (#devId:varchar#,#appId:varchar#,'2'); 
  </insert> 

外联方式: 
  <parameterMap    id="dapermitParams" class="java.util.HashMap"
         <parameter property="devId" jdbcType="VARCHAR"/> 
         <parameter property="appId" jdbcType="VARCHAR"/> 
  </parameterMap> 
     
  <insert id="DAPermit.addAppDevMapping" parameterMap="dapermitParams"
    insert into T_Device_App_R_Info(Device_ID,App_ID,Opr) values (?,?,'2'); 
  </insert> 
-->
 
四,利用parameterMap调用存储过程:
<!-- example 11: 存储过程 --> 
<resultMap id="returnResultMap" class="user"
     <result property="id" column="ID" /> 
</resultMap> 
<parameterMap id="paramUser" class="java.util.Map"
     <parameter property="name" jdbcType="VARCHAR" javaType="string" mode="IN" /> 
     <parameter property="pass" jdbcType="VARCHAR" javaType="string" mode="IN" /> 
     <parameter property="id" jdbcType="INT" javaType="Integer" mode="INOUT" resultMap="returnResultMap" /> 
</parameterMap> 

<procedure id="pro_insertUser11" parameterMap="paramUser" resultClass="int"
     <![CDATA[ 
        {call proc_userinsert(?,?,?)} 
     ]]> 
</procedure> 
然后在UserDaoTest.java中增加如下一个方法: 
public static void example11() throws Exception { 
     try { 
        Map map = new HashMap(); 
        map.put("name""procedure"); 
        map.put("pass""123456"); 
        Integer returnValue = (Integer)sqlMapClient.insert("pro_insertUser11", map); 
        System.out.println(returnValue); 
     } catch (Exception e) { 
        e.printStackTrace(); 
     } 
}
分享到:
评论

相关推荐

    ibatis基础知识详解

    **Ibatis基础知识详解** Ibatis,全称MyBatis,是一个优秀的开源持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java应用中,Ibatis可以帮助开发者将数据库操作与业务逻辑分离,从而简化开发工作,提高代码...

    ibatis常用基础知识

    【ibatis基础知识详解】 Ibatis,作为一个开源的Java持久层框架,主要目的是简化数据库操作,减少繁琐的JDBC代码编写。它将SQL语句与Java代码分离,使得开发者可以更专注于业务逻辑,而不必过于关心数据访问细节。...

    Ibatis中文版教程

    通过本文对iBatis基础知识、配置方法及使用技巧的介绍,相信读者已经对其有了初步的了解和掌握。在后续的学习和实践中,继续探索iBatis的高级特性,将有助于进一步提升数据库操作的效率和质量。

    iBATIS实战

    第二部分 iBATIS基础知识 第3章 安装和配置iBATIS 44 3.1 获得一份iBATIS发布 45 3.1.1 二进制发布 45 3.1.2 从源代码构建 45 3.2 发布中包含的内容 47 3.3 依赖性 48 3.3.1 针对延迟加载的字节码增强 48 3.3.2 ...

    ibatis2.3.4.chm

    **iBATIS基础知识** iBATIS是Java平台上的一个开源持久层框架,它的主要功能是简化数据库操作,通过将SQL语句与Java代码分离,实现数据访问层的灵活设计。在2.3.4版本中,iBATIS提供了一种基于XML或注解的方式定义...

    ibatis-in-action

    ### 二、iBATIS基础知识 #### 2.1 安装与配置 - **安装步骤**:包括添加iBATIS库到项目中,创建配置文件等。 - **配置细节**:设置数据源、事务管理器、映射文件等。 #### 2.2 映射语句 - **概念介绍**:映射语句...

    ibatis基础教学文档

    iBATIS 是一个Java开发中的持久化框架,由Clinton Begin创建,现由Apache基金会支持。它主要用于简化JDBC编程,提供一种“半...学习和理解iBATIS的基础知识,可以帮助开发者更高效地构建和维护数据驱动的应用程序。

    iBATIS in Action

    #### 二、iBATIS基础知识 **2.1 安装与配置iBATIS** 安装iBATIS涉及添加必要的JAR包到项目的类路径中,并创建一个包含数据库连接信息的配置文件。配置文件通常包含了数据源、事务管理器以及一系列的SQL映射规则。...

    ibatis知识点

    本篇文章将深入探讨Ibatis的核心知识点。 首先,Ibatis的配置文件是整个框架的基础。它包括了数据源配置、事务管理器配置以及SQL映射文件的引用。XML配置文件中,`&lt;transactionManager&gt;`定义了事务管理方式,如JDBC...

    ibatis基础项目

    【Ibatis基础项目】是一个旨在帮助开发者熟悉IBM开源的轻量级持久层框架Ibatis的实践项目。这个项目的核心目标是让开发者了解如何在实际开发环境中配置和使用Ibatis,以便进行数据库操作。通过这个小型项目,我们...

    iBATIS实战.pdf

    书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。《iBATIS实战》的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该...

    ibatis教程,ibatis帮助文档

    五、基础知识点 1. SqlMapClient:它是iBATIS的主要接口,负责执行SQL映射和批处理操作。提供多种方法如queryForObject、queryForMap等,用于执行不同的查询或更新操作。 2. sqlmapconfig.xml:这是iBATIS的全局配置...

    iBatis开发指南和一个iBatis实例

    首先,"iBatis精讲PDF"是理解iBatis基础概念和工作原理的重要资料。iBatis的核心理念是将SQL语句写在XML配置文件中,通过Mapper接口与Java代码交互,实现了SQL与业务逻辑的解耦。在这个PDF中,你可能会了解到如何...

    Ibatis3手册 Ibatis3参考手册

    ### Ibatis3手册知识点概述 Ibatis3作为一款流行的持久层框架,在软件开发领域具有重要的地位。本篇文章基于“Ibatis3...希望本文能够帮助开发者更好地理解和掌握Ibatis3的核心知识,为实际项目开发打下坚实的基础。

    01_传智播客ibatis教程_准备ibatis环境

    【标题】"01_传智播客ibatis教程_准备...通过这个教程,学习者可以全面了解iBatis的基础知识,为后续的数据库操作和实际项目开发打下坚实基础。同时,赖老师的讲解和传智播客的教学质量,将使学习过程更为高效和愉快。

    ibatis api 帮助文档+IBATIS 开发文档

    `ibatis-api.chm`是IBATIS的API帮助文档,它包含了所有核心类和接口的详细说明,是理解和使用IBATIS的基础。以下是一些主要组件和概念: 1. **SqlMapClient**:这是整个IBATIS框架的核心,负责管理所有的SQL映射...

    IBATIS_IN_ACTION

    ### iBATIS基础 - **安装与配置**:了解如何在项目中集成iBATIS,设置数据源,配置SQL映射文件等基本步骤。 - **使用映射语句**:掌握如何定义和使用SQL映射语句,包括参数传递、结果映射等关键概念。 - **非查询...

    ibatis基础教程

    ### iBatis基础教程知识点详解 #### 一、iBatis简介与背景 iBatis是一种流行的开源框架,主要用于在Java应用程序中实现数据库操作。它采用了一种称为映射(Mapping)的技术,允许开发人员将Java对象与SQL语句进行...

    ibatisDemo 入门源码

    接下来,我们将深入探讨IbatisDemo中的关键知识点。 一、Ibatis框架简介 Ibatis是由MyBatis团队开发的一款轻量级Java ORM(Object-Relational Mapping)框架,它的核心理念是将SQL语句与Java代码分离,使得SQL与...

Global site tag (gtag.js) - Google Analytics