• ibatis实战之OR映射


    相对Hibernate等ORM实现而言,ibatis的映射配置更为简洁直接,以下是一个典型的配置文件。

    <?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="User">
    	<!-- 模块配置 -->
    	<typeAlias alias="user" type="com.itmyhome.User" />
    	
    	<cacheModel id="userCache" type="LRU">
    		<flushInterval hours="24"/> 
    		<flushOnExecute statement="updateUser"/>
    		<property name="size" value="1000" />
    	</cacheModel>
    
    	<!-- Statement配置 -->
    	<select id="getUser" parameterClass="java.lang.String" resultClass="user" cacheModel="userCache">
    		<![CDATA[
    		     select * from user where id = #id# 
    		]]>
    	</select>
    	
    	<insert id="insertUser" parameterClass="user">
    		insert into user values(#id#,#name#,#age#)
    	</insert>
    
    	<update id="updateUser" parameterClass="user">
    		update  user set name = #name# where id = #id#
    	</update>
    
    </sqlMap>
    能够看到,映射文件主要分为两个部分:模块配置和Statement配置

    一、模块配置包含:

    typeAlias节点:

    定义了本映射文件里的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类"com.itmyhome.User"定义了一个别

    名"user",这样在本配置文件的其它部分,须要引用"com.itmyhome.User"类时,仅仅需以其别名替代就可以。

    cacheModel节点

    定义了本映射文件里使用的Cache机制

    <cacheModel id="userCache" type="LRU">
    	<flushInterval hours="24"/> 
    	<flushOnExecute statement="updateUser"/>
    	<property name="size" value="1000" />
    </cacheModel>
    这里声明了一个名为"userCache"的cacheModel,之后能够在Statement声明中对其进行引用

    <select id="getUser" parameterClass="java.lang.String" resultClass="user" cacheModel="userCache">
    这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel"userCache"进行缓存。

    之后假设程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。

    cacheModel主要有以下几个配置点:

    flushInterval:设定缓存有效期,假设超过此设定值,则将此CacheModel的缓存清空。

    size:本CacheModel中最大容纳的数据对象数量。

    flushOnExecute:指定执行特定Statement时,将缓存清空。如updateUser操将更

    新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际

    数据发生偏差,因此必须将缓存清空以避免脏数据的出现。


    二、Statement配置

    Statement配置包含了数个与SQL Statement相关的节点,分别为:

    1)statement

    2)insert

    3)delete

    4)update

    5)select

    6)procedure

    当中,statement最为通用,它能够替代其余的全部节点。除statement之外的节点各自相应了SQL中的

    同名操作(procedure相应存储过程).使用statement定义全部操作固然能够达成目标,但缺乏直观性,

    建议在实际开发中依据操作目的,各自选用相应的节点名加以申明.一方面,使得配置文件

    更加直观,还有一方面,也可借助DTD对节点申明进行更有针对性的检查,以避免配置上的失误。


    基本的配置项例如以下:

    <statement id="queryUser" parameterClass="java.lang.Integer" resultClass="user">
    	select * from user where id = #id#
    </statement>
    
    <select id="getUser" parameterClass="java.lang.String" 
    		resultClass="user" cacheModel="userCache">
    	<![CDATA[
    		select * from user where id = #id# 
    	]]>
    </select>
    
    <insert id="insertUser" parameterClass="user">
    	    insert into user values(#id#,#name#,#age#)
    </insert>
    
    <update id="updateUser" parameterClass="java.lang.Integer">
    	update  user set name = #name# where id = #id#
    </update>
    
    <delete id="deleteUser" parameterClass="java.lang.Integer">
    	delete user where id = #id#
    </delete>
    參数描写叙述
    parameterClass參数类.指定了參数的完整类名(包含包路径).
    可通过别名避免每次反复书写冗长的类名.
    resultClass结果类.指定结果类型的完整类名(包含包路径)
    可通过别名避免每次反复书写冗长的类名.
    parameterMap參数映射,需结合parameterMap节点对映射关系加以定义.
    对于存储过程之外的statement而言,建议使用
    parameterClass作为參数配置方式,一方面避免了
    參数映射配置工,还有一方面其性能表现也更加出色
    resultMap结果映射,需结合resultMap节点对映射关系加以定义。
    cacheModelstatement相应的Cache模块。
    对于參数定义而言,尽量使用parameterClass,即直接将POJO作为statement的调用參数,

    这样在SQL中能够直接将POJO的属性作为參数加以设定,如:

    <update id="updateUser" parameterClass="com.itmyhome.User">
    	alter table user set name = #name# where id = #id#
    </update>
    这里将com.itmyhome.User类设定为updateUser的參数之后,我们就可以在SQL中通过#name#

    对POJO的属性进行引用。例如以下:

    set name = #name# where id = #id#
    执行期,ibatis将通过调用User对象的getName,getId方法获得相应的參数值,并将其作为SQL的參数。

    假设parameterClass中设定的是jdk的中的简单对象类型,如String、Integer,ibatis会直接将其作为SQL中的參数值。

    我们也能够将包含了參数数据的Map对象传递给Statement如:

    <update id="updateUser" parameterClass="java.util.Map">
    	update  user set name = #name# where id = #id#
    </update>
    
    Map<String, Object> map = new HashMap<String,Object>();
    map.put("id", "1");
    map.put("name", "hello");
    sqlMap.update("updateUser",map);
    这里传入的參数就是一个Map对象,ibatis将以key "id"、"name"从中提取相应的參数值

    在SQL中设定參数名时,能够同一时候指定參数类型,如:

    update  user set name = #name:VARCHAR# where id = #id:NUMBERIC#



  • 相关阅读:
    常用的16个Java实用工具类,Java开发人员请收藏!
    JVM内存区域与垃圾回收
    听说你还不知道Java代码是怎么运行的?
    Java 到底是值传递还是引用传递?
    Java线程池实现原理及其在美团业务中的实践
    别再说Java对象都是在堆内存上分配空间的了!
    面试常问的Java虚拟机内存模型,看这篇就够了!
    好用的Java工具类库,GitHub星标10k+你在用吗?
    MySQL 全文索引实现一个简单版搜索引擎
    laravel 数据库里的图片重命名
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3990445.html
Copyright © 2020-2023  润新知