`

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 相关jar包

    这个压缩包包含的“ibatis 相关jar包”是用于在Java Web项目中集成Ibatis所必需的库文件。 1. **Ibatis简介**: Ibatis 是由Clinton Begin 创建的一个开源项目,最初叫做MyBatis,后来更名为Ibatis。它的核心理念...

    ibatis相关

    ibatis相关

    ibatis 相关使用文档及安装包ibatis 相关使用文档及安装包

    这个压缩包包含了iBATIS的相关使用文档和安装包,是学习和使用iBATIS的重要参考资料。 《iBATIS-SqlMaps-2.pdf》可能是关于iBATIS SQL映射器的详细指南,它会介绍如何编写SQL Map配置文件,这些文件定义了数据库...

    ibatis相关的3个文档

    本资源包含三个与Ibatis相关的文件,分别是一份中文教程、一个PDF格式的帮助文档和一个简单的示例,这些资料对于理解和掌握Ibatis有着重要的作用。 首先,`ibatis的中文教程`是初学者入门的最佳选择。Ibatis中文...

    ibatis相关的common,dao,sqlmap包

    Ibatis 是一个流行的数据持久层框架,它在Java开发中被广泛应用,特别是在处理与数据库交互的任务上。这个压缩包包含了Ibatis的三个关键组件:common、dao和sqlmap,它们各自扮演着不同的角色,共同构成了Ibatis框架...

    ibatis相关资料

    ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料ibatis相关资料

    iBATIS相关资料.rar

    总的来说,了解和掌握iBATIS的相关知识,可以帮助开发者更好地理解数据访问层的设计,尤其是在处理复杂SQL和优化性能方面。即使在使用Hibernate或其他ORM框架时,这些经验也能提供有价值的参考。

    ibatis jar包.zip

    【标题】"ibatis jar包.zip" 是一个包含与iBATIS相关的Java库的压缩文件。iBATIS是一个优秀的开源持久层框架,它允许开发者将SQL、Java代码和结果映射进行分离,使得数据库访问更加灵活和易于维护。在Java应用中,...

    ibatis插件

    标题 "ibatis插件" 指的是在Eclipse集成开发环境中使用的Ibatis相关的插件。Ibatis是一款轻量级的Java持久层框架,它允许开发者将SQL语句直接写在配置文件中,实现了数据库操作与业务逻辑的解耦。这款插件的主要作用...

    ibatis3.1官方中文帮助文档

    《iBatis 3.1 官方中文帮助文档》是开发者们学习和掌握iBatis框架的重要参考资料,尤其对于那些使用中文作为主要工作语言的程序员来说,这是一份非常...同时,这份文档也是开发者解决iBatis相关问题的重要参考资料。

    iBATIS官方

    8. MyBatis Generator:这是一个实用工具,可以自动生成iBATIS相关的Java代码和XML配置文件,减轻了开发者的重复劳动。 9. Spring集成:iBATIS可以很好地与Spring框架集成,利用Spring的依赖注入特性,实现更灵活的...

    Castle+ibatis代码示例

    这些文件可能展示了如何使用Castle Windsor来注册iBATIS相关的组件,以及如何配置和使用事务管理设施。此外,它们也可能包含了具体的iBATIS映射文件,展示了如何将SQL查询与业务对象关联起来。 学习这个示例,...

    ibatis学习

    在"压缩包子文件的文件名称列表"中,只提到了"ibatis",这可能包含了一系列Ibatis相关的文件,比如配置文件(mybatis-config.xml)、映射文件(mapper.xml)、Java模型类、以及Ibatis的核心库依赖等。这些文件通常会...

    ibatis.util包

    9. **Exceptions**: `ibatis.util.Exceptions`类提供了一系列与Ibatis相关的异常,如`IOException`和`SQLException`的包装,便于统一处理错误。 在EMIS系统中,`ibatis.util`包的缺失可能会导致以下问题: - SQL...

    Ibatis教程

    除了Ibatis教程本身,压缩包中的其他文档可能涉及实际项目中与Ibatis相关的应用场景: - **人像系统集成设计**和**人像系统集成表结构设计**可能涉及如何使用Ibatis进行大数据量的人脸识别系统的数据库操作。 - **...

    Spring对IBatis的整合

    ### Spring对IBatis的整合 #### 一、Spring与IBatis整合概述 Spring框架与IBatis(现称为...通过本章节的学习,开发者应该能够掌握如何使用Spring来有效地管理IBatis相关的事务处理、异常处理以及数据访问逻辑。

    abator插件,ibatis插件

    Abator 插件是针对 iBatis 框架的一个自动化工具,它的主要功能是帮助开发者自动生成与 iBatis 相关的各种代码,从而提高开发效率,减少手动编写重复代码的工作量。iBatis 是一个优秀的 Java 数据库访问框架,它提供...

    ibatis in action 电子书(pdf)

    8. **高级话题**:涵盖与iBATIS相关的高级主题,如批处理、延迟加载、自定义类型处理器、插件扩展等,提升开发者对iBATIS框架的深度理解。 9. **最佳实践**:提供实用的项目开发建议,如如何设计合理的映射文件结构...

    ibatis jar文件

    标题中的“ibatis jar文件”指的是与iBATIS相关的Java归档(JAR)文件,这是一个流行的持久层框架,主要用于简化数据库操作。iBATIS在Java应用中扮演着数据库访问层的角色,允许开发者将SQL语句直接嵌入到Java代码中...

Global site tag (gtag.js) - Google Analytics