`
ufsmart
  • 浏览: 1477 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis3的项目使用的Mapping文件使用总结参考(一)

 
阅读更多

1.SqlSessionFactory 

每个ibatis应用都应该只有一个SqlSessionFactory的实例对象,所以一般设置为static属性或者使用spring管理时返回singleton类型,与spring集成时其实也是写一个怎样构建SqlSessionFactory的Bean, 
构建SqlSessionFactory一般是SqlSessionFactoryBuild通过读取ibatis的配置文件而进行build的: 
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); 
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuild().build(reader); 

配置文件SqlMapConfig.xml的一般结构(元素顺序不能变) 
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration      
    PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"      
    "
http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> 
<configuration> 
<properties resource="jdbc.properties" /> 
<settings> 
<setting name="cacheEnabled" value="false" /> 
<setting name="lazyLoadingEnabled" value="true" /> 
<setting name="multipleResultSetsEnabled" value="false" /> 
<setting name="useColumnLabel" value="true" /> 
<setting name="defaultExecutorType" value="SIMPLE" /> 
</settings> 

<typeAliases> 
<typeAlias alias="Person" type="test.Person"/> 
</typeAliases> 

<environments default="dev"> 
<environment id="dev"> 
<transactionManager type="jdbc"> 
<property name="" value="" /> 
</transactionManager> 
    <dataSource type="POOLED"> 
    <property name="driver" value="${driver}" /> 
<property name="url" value="${url}" /> 
<property name="username" value="${user}" /> 
<property name="password" value="${password}" /> 
</dataSource> 
</environment> 
</environments> 

<mappers> 
<mapper resource="sqlMappers/Person.xml" /> 
<mapper resource="sqlMappers/UserShop.xml" /> 
</mappers>  
</configuration> 

<settings />是配置ibatis的具体行为属性的, 
<typeAliases />是为了将较长的module类名简化,在<mappers />里可以使用 
<environment />是配置transaction manager和connection pooling的 
<mappers />是sql语句的构造地方,一般每个module对应一个文件 

2.SqlSession 
可以从SqlSessionFactory得到SqlSession: sessionFactory.openSession(); 
SqlSession是一切Sql相关数据库操作的中心,insert,select,update,delete... 
SqlSession不是线程安全的(也就是有状态的),所以它的作用域最好是在一个Thread下,每个Thread有自己的SqlSession对象实例,彼此不相关. 
Never keep references to a SqlSession instance in a static field or even an instance field of a class.  Never keep references to a 
SqlSession in any sort of managed scope, such as HttpSession of of the Servlet framework. 

默认sessionFacory.openSession()拿到的SqlSession不是自动commit的,所以如果是更新操作必须自己执行session.commit() 
关闭SqlSession很重要,必须保证在线程结束时关闭这个SqlSession,可以在finally中 
session.close(); 
那跟Spring集成是怎样做到这一点的呢,因为dataSource是由spring管理的,所以他可以保证在一个Thread的每个方法中拿到的Connection是同一个对象, 
虽然每个方法从sessionFactory.openSession()拿到的SqlSession对象是不同的,但是sqlSession对象中的connection是相同的,所以spring就可以在service层的方法结束之前将这个connection commit跟close,这样就实现了事务控制. 
我们往往在dao层是一个方法对应一个sql语句的,不在这里控制事务,控制事务应该在service层, dao的每个方法拿到的sqlsession对象都是不相同的(尽管它的connection可能相同). 
那我们应该怎样在没有spring的情况下实现ibatis的事务控制呢?还要保持dao的结构,以保持能跟spring随时切换? 
看来ThreadLocal要派上用场了 
---占位---- 

3.讲完了SqlSession这个大头,再来说说具体的配置信息 
配置文件结构 
configuration 
    properties 
    settings 
    typeAliases 
    typeHandlers 
    objectFactory 
    plugins 
    environments 
       environment 
           transactionManager 
           dataSource 
    mappers 
       
4.ibatis可以配置多个environment环境 
供开发,测试,上线等切换 
但是一个SqlSessionFactory只能对应一个environment, 
也就是 one SqlSessionFactory per database 

5.transactionManager 
There are two TransactionManager types (i.e. type=”?????”) that are included with iBATIS: 
    JDBC – This configuration simply makes use of the JDBC commit and rollback facilities directly.  It relies on the connection retrieved from the dataSource to manage the scope of the transaction.   
    MANAGED  – This configuration simply does nothing, quite literally.  It never commits, rolls back or closes a connection.  Instead, it lets the container manage the full lifecycle of the transaction (e.g. Spring or a JEE Application Server context). 

6.dataSource的配置 
类型可使用UNPOOLED,POOLED,JNDI三种 

7.接下来是重头戏mappers 
这里是我们直接写sql的地方,ibatis在这里也花了最多功夫,特别是关于select的mapper. 
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE mapper 
PUBLIC "-//ibatis.apache.org//DTD mapper 3.0//EN" 
"
http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> 

<mapper namespace="test.UserShop"> 
   <insert ...> ... </insert> 
   <select ...> ... </select> 
   <update ...> ... </update> 
   <delete ...> ... </delete> 
</mapper> 
select 元素的所有的如下:
<select
   id=""
   parameterType=""
   resultType=""
   resultMap=""
   flushCache=""
   useCache=""
   timeout=""
   fetchSize=""
   statementType=""
   resultSetType="">
   在Ibatis3中parameterMap已经不再使用。
(1).select 
<select id="getUser" parameterType="int" resultType="test.User"> 
       select * from user where userId = #{value} 
</select> 
注意#{value},resultType可以换成resultMap,这个resultMap就比较复杂了,也是最强大的工具,可以完成复杂的mapper(resultSet->object) 

(2).insert,update,delete 
这几个操作都比较类似,返回的一般是受影响的行数. 
insert 可以返回auto_increament的值 
<insert id="insertPerson" parameterType="Person" 
useGeneratedKeys="true" keyProperty="userId"> 
insert into person(name,age) values(#{name},#{age}) 
</insert> 
这样,传入的Person类对象的userId就会被set成auto_increament那个值. 

(3).可以使用<sql id="columns">name,age</sql>构造可重用的sql片段 
这样就可以在那四个主要的元素里用<include refid="columns">引用这个常用sql片段 

(4).resultMap很复杂,它可以处理一对一,一对多,多对多关系 
比如一个blog对应一个author, 一个blog对应多个post, 一个post对应多个comment 
resultMap的结构: 
resultMap 
    constructor (向java构造函数设置值) 
       idArg 
       arg 
    id (id result,同result) 
    result (字段映射注入) 
    association (一对一关系,它里面有自己的result映射) 
    collection  (一对多关系, 它里面有自己的result映射,和可能的collection) 
    discriminator 

(5).association (一个Blog对应一个Author) 
<resultMap id="blogResult" type="Blog"> 
    <association property="author" column="blog_author_id" javaType="Author"> 
        <id property="id" column="author_id" /> 
        <result property="username" column="author_username" /> 
    </associaton> 
</resultMap> 
当然association也可以使用 
<association property="author" column="blog_author_id" javaType="Author" resultMap="authorResult"/> 

在Blog类定义里会有一个Author类字段,会自动装载数据 
private Author author; 

(6).collection (一个Blog对应多个Post) 
<resultMap id="blogResult" type="Blog"> 
    <collection property="posts" column="blog_id" ofType="Post" javaType="ArrayList" resultMap="postResult" /> 
</resultMap> 
collection也可以精简为 
<collection property="posts" ofType="Post" resultMap="postResult" /> 
相就地,在Blog类定义里会有: 
private List<Post> posts 


8.cache 
其实我是不打算在ibatis这层做cache的,一般cache还是在service层做. 
ibatis对于select才会进行cache,而我觉得这个时候cache没多大意义,因为多次請求相同的select語句(sql相同)而又没有进行表的相关update的情况并不多. 
但还是看看ibatis是怎样处理cache的 
要开启cache,需要在mapper文件中加上一句: <cache /> 
(1).cache所有select的結果 
(2).在同一mapper文件中的insert,update,delete会flush cache 
(3).cache使用least recently used(LRU)算法 
(4).cache没有定时flush的功能 
(5).cache保存1024个对象或list引用 
(6).cache是read/write cache, 从cache拿出对象不是共享的,caller可以任意修改而不用担心其他caller也拿到相同的对象(相同的reference) 


9.动态SQL 
以前用jdbc时经常要根据输入条件而组装成不同的sql,这种就是动态sql 
ibatis的动态sql关键词: 
if, choose(when,otherwise),trim(where,set),foreach 

(1).if 
<if test="title != null"> 
   AND title like #{title} 
</if>    
<![CDATA[ 
]]> 

(2).choose(when,otherwise)只选择其中一种情况 
<select ...> 
<choose> 
    <when test="title != null"> 
          AND title like #{title} 
    </when> 
    <when test="author != null and author.name != null"> 
          AND title like #{author.name} 
    </when> 
    <otherwise> 
          AND featured = 1 
    </otherwise> 
</choose> 
</select> 

(3).trim, where, set 
<select id="findBlog" paramaterType="Blog" resultType="Blog"> 
    select * from blog 
    <where> 
        <if test=”state != null”> 
            state = ${state} 
        </if> 
        <if test=”title != null”> 
            AND title like ${title} 
        </if> 
        <if test=”author != null and author.name != null”> 
            AND title like ${author.name} 
        </if> 
    </where> 
</select>    

<update id="updateAuthorIfNecessary" 
          parameterType="domain.blog.Author"> 
    update Author 
      <set> 
        <if test="username != null">username=#{username},</if> 
        <if test="password != null">password=#{password},</if> 
        <if test="email != null">email=#{email},</if> 
        <if test="bio != null">bio=#{bio}</if> 
      </set> 
    where id=#{id} 
</update> 

(4).foreach 
<select id="selectPostIn" resultType="domain.blog.Post"> 
    SELECT * 
    FROM POST P 
    WHERE ID in 
    <foreach item="item" index="index" collection="list" 
        open="(" separator="," close=")"> 
          #{item} 
    </foreach> 
</select> 


10.ibatis的annotation 
ibatis3.0也增加了annotation,当然主要还是用在mapper这个问题上 
个人感觉是鸡肋,暂时不会使用.

分享到:
评论

相关推荐

    ibatis使用例子,源代码

    **标题与描述解析** 标题"ibatis使用例子,源代码"表明这是一个关于iBATIS(一个持久层...总结来说,这个压缩包提供了一个完整的iBATIS使用实例,对于学习和理解iBATIS的ORM工作原理和实践操作具有很高的参考价值。

    ibatis安装配置

    **Ibatis 安装配置详解** Ibatis 是一个优秀的轻量级 Java ORM(对象关系映射)框架,它允许开发者...对于更详细的使用技巧和 API,建议参考 Ibatis 的官方文档或在线教程,以便更好地理解和利用 Ibatis 的强大功能。

    ibatis jar

    【ibatis jar】是关于Java开发中的一个著名ORM框架——iBATIS的讨论。...通过深入学习和使用ibatis-3-core-3.0.0.190.jar中的API,以及参考源代码,开发者可以更有效地利用iBATIS提升开发效率和应用性能。

    iBATIS3 用户手册

    在XML配置中,iBATIS 使用一个名为`mybatis-config.xml`的主配置文件来定义数据源、事务管理器以及其他框架设置。配置文件中包含了数据源的信息、映射文件的位置等,映射文件(通常是`.xml`文件)包含了SQL语句和...

    ibatis2.3源码

    3. **code ibatis**:强调这是iBATIS项目的代码,对于熟悉或使用iBATIS的人来说,这是一个重要的标识。 【压缩包子文件的文件名称列表】:"src"通常代表源代码目录,这表明压缩包里包含了iBATIS 2.3的所有源代码...

    ibatis 使用

    - "ibatis 开发指南.pdf":这份指南可能是Ibatis的官方开发手册,涵盖了从安装、配置到实际使用的全方位指导,是学习和使用Ibatis的重要参考资料。 总之,Ibatis作为一款强大的持久层框架,不仅简化了数据库操作,...

    xml配置文件自动提示(Spring2.5,Hibernate3.0,Struts2,Ibatis3) Dtd 文件及操作

    通过参考这些文件,开发者可以更好地理解和应用SSH(Spring、Struts2、Hibernate)和Ibatis框架的XML配置,提升开发效率。 总的来说,理解和使用XML配置文件的自动提示以及DTD对于Java Web开发至关重要。它不仅可以...

    ibatis帮助文档

    这个文档是为初学者和有经验的开发者提供的一份宝贵的参考资料,旨在帮助读者更好地理解和应用Ibatis。 **Ibatis 的核心概念** 1. **SQL映射文件**: Ibatis 的核心是SQL映射文件,它包含了一系列的SQL语句和结果...

    ibatis-2.3.4 开发包 及 官方权威文档(开发指南+入门教程)

    2. **license.txt**:Ibatis 的授权协议文件,详细规定了软件的使用、修改和分发权限。 3. **notice.txt**:可能包含版权和第三方库的使用通知,提醒用户注意相关的法律义务。 4. **jar-dependencies.txt**:列出 ...

    iBATIS 学习 教程

    iBATIS,全称为“Java SQL Mapping Framework”,是一款开源的Java数据访问框架,它简化了数据库与应用程序之间的交互,使得开发者能够将SQL语句直接写在XML配置文件中,从而解耦业务逻辑代码和数据库操作。...

    ibatis开发指南(中英)和demo

    iBATIS,全称“Interactive Battery for SQL Mapping”,是一个优秀的开源持久层框架,它允许开发者将SQL语句直接写在配置文件中,从而避免了Java代码与SQL的耦合,提高了开发效率。本资料包提供了关于iBATIS的中英...

    Ibatis实战英文版书籍和源代码

    《Ibatis实战英文版书籍和源代码》是一个资源包,主要涵盖了Ibatis这一持久层框架的实战指导和配套源码。Ibatis,全称为“Java SQL...对于仍在使用或打算学习Ibatis的程序员来说,这个资源包无疑是一份宝贵的参考资料。

    iBATIS框架源码剖析-任钢

    3. **SqlMapConfig.xml**:这是iBATIS的主配置文件,它包含了数据源、事务管理器和SQL映射文件的配置信息。通过这个文件,iBATIS可以连接到数据库并管理事务。 4. **Executor执行器**:iBATIS的核心组件之一,它...

    将Hibernate和iBatis两Orm框架整合,取长补短

    3. 实现DAO接口:针对每个接口,编写两个实现类,一个使用Hibernate,一个使用iBatis。在实现类中,使用Spring的`@Autowired`注解注入数据源,并在方法内部调用相应的Session或SqlSessionFactory进行操作。 4. 使用...

    jsp+struct+hibernate+ibatis资源集锦珍藏

    对于初学者,可以从基础概念和安装配置开始,逐步学习如何创建JSP页面、搭建Struts框架、配置Hibernate实体以及编写iBatis映射文件。进阶学习者则可以通过示例项目和实战案例,提升在实际开发中的应用能力。 总之,...

    ibatis memcached

    MyBatis是一个轻量级的ORM(Object-Relational Mapping)框架,它允许开发者将SQL语句直接写在配置文件或Java代码中,避免了传统的JDBC繁琐的代码编写。而Memcached则是一个广泛使用的、基于内存的分布式缓存服务,...

    ibatics 官方网站正确实例

    IBATIS开发包使用实例使用出错 ①插入操作时会报SQL错误,原因如下 com.mydomain.data.Account.xml文件的insert部分ACC_EMIAL的后面没有括号,加上即可解决这个问题。 具体请参考网上的一篇博客:...

Global site tag (gtag.js) - Google Analytics