MyBatis学习笔记

   MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

   MyBatis 最强大的特性之一就是它的动态语句功能。MyBatis能通过在任何映射SQL语句中使用强大的动态SQL。

   对Mybatis来说主要的过程是以下几步:

  1>.从XML配置文件中获取SessionFactory,然后由SessionFactory产生相应的Session。

  2>在session中是用Session对象对业务数据完成相应的CRUD操作(增删改查)和相应的事务控制。

  3> 使用完毕后关闭相应的Session,以免过度占用资源

  4>使用配置相应的Mapper.xml文件进行业务实体的JavaBean与数据库表之间做相应的Map操作。

框架架构讲解:
  (1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个 MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
  (2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型), Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
  (4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

1.环境搭建:

下载相应Jar包:

mybatis-3.2.3.zip 解压后拿出 mybatis-3.2.3.jar(Mybatis核心包)

mybatis-generator-core-1.3.1.jar (Mybatis自动生成配置文件包)

      并将其拷贝到 web工程的lib目录。

To use the MyBatis you just need to include the mybatis-x.x.x.jar file in the classpath.

If you are using Maven just add the following dependency to yourpom.xml:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

配置参考博客:http://www.cnblogs.com/daviddai/p/3485574.html

点击打开链接

MyBatis的配置文件 (**-config.xml文件)、SQL映射文件(Mapper.xml)

2.从 SqlSessionFactory 中获取 SqlSession

http://mybatis.github.io/mybatis-3/zh/getting-started.html

现在,我们已经知道如何获取 SqlSessionFactory 对象了,基于同样的启示,我们就可以 获得 SqlSession 的实例了。 SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的 方法。你可以用 SqlSession 实例来直接执行已映射的 SQL 语句。例如:

SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
  session.close();
}

这种方法起到的作用, 和我们使用之前的 MyBatis 版本是相似的, 现在有一种更简洁的 方法。使用合理描述参数和 SQL 语句返回值的接口(比如 BlogMapper.class) ,这样现在就 可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误。

例如:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
} finally {
  session.close();
}

现在我们来探究一下这里到底执行了什么。

探究已映射的 SQL 语句

这里你也许想知道通过 SqlSession 和 Mapper 对象到底执行了什么操作。已映射的 SQL 语句是一个很大的主题, 而且这个主题会贯穿本文档的大部分内容。 为了给出一个宏观的概 念,这里有一些示例。 上面提到的任何一个示例,语句是通过 XML 或注解定义的。我们先来看看 XML。使 用基于 XML 的映射语言,在过去的几年中使得 MyBatis 非常流行,他为 MyBatis 提供所有 的特性设置。如果你以前用过 MyBatis,这个概念应该很熟悉了,但是 XML 映射文件也有 很多的改进,后面我们会详细来说。这里给出一个基于 XML 映射语句的示例,这些语句应 该可以满足上述示例中 SqlSession 对象的调用。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

这个简单的例子中看起来有很多额外的东西, 但是也相当简洁了。 你可以在一个单独的 XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得到很 多 方 便 之 处 。 在 文 件 的 剩 余 部 分 是 很 好 的 自 我 解 释 。 在 命 名 空 间 “com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这 样它允许你使用完全限定名 “org.mybatis.example.BlogMapper.selectBlog” 来调用映射语句, 我们下面示例中所有的写法也是这样的。

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

要注意这个使用完全限定名调用 Java 对象的方法是相似的,这样做是有原因的。这个 命名可以直接给相同命名空间下的的映射类, 使用一个名称, 参数和返回值和已映射的查询 语句都一样的方法即可。 这就允许你非常容易地调用映射器接口中的方法, 这和你前面看到 的是一样的,下面这个示例中它又出现了。

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

第二种方式有很多有点,首先它不是基于文字的,那就更安全了。第二,如果你的 IDE 有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转 换,同时 BlogMapper 接口可以保持简洁,返回值类型很安全(参数类型也很安全) 。


重要 命名空间的一点注释

命名空间 在之前版本的 MyBatis 中是可选项,非常混乱也没有帮助。现在,命名空间 是必须的,而且有一个目的,它使用更长的完全限定名来隔离语句。

命名空间使得接口绑定成为可能,就像你看到的那样,如果之前不了解,那么现在你 就会使用它们了,你应该按照下面给出示例的来练习,以免改变自己的想法。使用命名空 间,并将它放在合适的 Java 包空间之下,将会使你的代码变得简洁,在很长的时间内提高 MyBatis 的作用。

命名解析: 为了减少输入量,MyBatis 对所有的命名配置元素使用如下的命名解析规 则,包括语句,结果映射,缓存等。

  • 直接查找完全限定名(比如“com.mypackage.MyMapper.selectAllThings”,如果 ) 发现就使用。
  • 短名称(比如“selectAllThings” )可以用来引用任意含糊的对象。而如果有两个 或两个以上的(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings” ), 那么就会得到错误报告,说短名称是含糊的,因此就必须使用完全限定名。

如 BlogMapper 这样的映射器类来说,还有一个妙招。它们中间映射的语句可以不需要 在 XML 中来写,而可以使用 Java 注解来替换。比如,上面的 XML 示例可以如下来替换:

package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

对于简单语句来说,使用注解代码会更加清晰,然而 Java 注解对于复杂语句来说就会 混乱, 应该限制使用。 因此, 如果你不得不做复杂的事情, 那么最好使用 XML 来映射语句。

当然这也取决于你和你的项目团队的决定, 看哪种更适合你来使用, 还有以长久方式来 使用映射语句的重要性。也就是说,不要将自己局限在一种方式中。你可以轻松地将注解换 成 XML 映射语句,反之亦然。

3.MyBatis传入参数与parameterType

在MyBatis的select,insert,update,delete这些元素中都提到了parameterType这个属性。parameterType有基本类型和java复杂数据类型。

基本类型:包含int,String,Date等,基本数据类型作为传入参数,只能传入一个通过#{参数名}即可获取传入的值.

复杂类型:包含java实体类,Map,通过#{属性名}或#{Map的KeyName}即可获取传入的值。

mapper接口方法一般接受一个参数,可以通过使用@Param注释将多个参数绑定到一个map做为输入参数。

  1. 简单数据类型

    mapper接口方法:

    1
    User selectByPrimaryKey(Integer id);

    sql映射:

    1
    2
    3
    4
    5
    6
    < select id = "selectByPrimaryKey" resultMap = "BaseResultMap" parameterType = "java.lang.Integer" >
       select
       < include refid = "Base_Column_List" />
       from base.tb_user
       where id = #{id,jdbcType=INTEGER}
    </ select >

    对于简单数据类型,sql映射语句中直接#{变量名}这种方式引用就行了,其实这里的”变量名”可以是任意的。mapper接口方法传递过来的值,至于其叫什么名字其实是不可考也没必要知道的。
    而且JAVA反射只能获取方法参数的类型,是无从得知方法参数的名字的。

    比如上面这个示例中,使用#{id}来引用只是比较直观而已,使用其他名字来引用也是一样的。所以当在if元素中test传递的参数时,就必须要用_parameter来引用这个参数了。像这样:

    1
    2
    3
    4
    5
    6
    7
    8
    < select id = "selectByPrimaryKey" resultMap = "BaseResultMap" parameterType = "java.lang.Integer" >
       select
       < include refid = "Base_Column_List" />
       from tb_user
       < if test = "_parameter != 0" >
       where id = #{id,jdbcType=INTEGER}
       </ if >
    </ select >

    如果test测试条件中使用id就会提示错误,因为这个参数其实没有名字,只是一个值或引用而已,只能使用_parameter来引用。

  2. 对象类型

    传入JAVA复杂对象类型的话,sql映射语句中就可以直接引用对象的属性名了,这里的属性名是实实在在的真实的名字,不是随意指定的。
    mapper接口方法:

    1
    int insert(User user);

    sql影射:

    1
    2
    3
    < insert id = "insert" parameterType = "User" useGeneratedKeys = "true" keyProperty = "id" >
       insert into tb_user (name, sex)
       values (#{name,jdbcType=CHAR}, #{sex,jdbcType=CHAR})

    虽然可以明确的引用对象的属性名了,但如果要在if元素中测试传入的user参数,仍然要使用_parameter来引用传递进来的实际参数,因为传递进来的User对象的名字是不可考的。如果测试对象的属性,则直接引用属性名字就可以了。

    测试user对象:

    1
    < if test = "_parameter != null" >

    测试user对象的属性:

    1
    < if test = "name != null" >
  3. map类型

    传入map类型,直接通过#{keyname}就可以引用到键对应的值。使用@param注释的多个参数值也会组装成一个map数据结构,和直接传递map进来没有区别。

    mapper接口:

    1
    int updateByExample( @Param ( "user" ) User user, @Param ( "example" ) UserExample example);

    sql映射:

    1
    2
    3
    4
    5
    6
    7
    < update id = "updateByExample" parameterType = "map" >
       update tb_user
       set id = #{user.id,jdbcType=INTEGER},
       ...
       < if test = "_parameter != null" >
         < include refid = "Update_By_Example_Where_Clause" />
       </ if >

    注意这里测试传递进来的map是否为空,仍然使用_parameter

    4.集合类型

  1. 可以传递一个List或Array类型的对象作为参数,MyBatis会自动的将List或Array对象包装到一个Map对象中,List类型对象会使用

    list作为键名,而Array对象会用array作为键名。

    集合类型通常用于构造IN条件,sql映射文件中使用foreach元素来遍历List或Array元素。

    mapper接口:

    1
    User selectUserInList(List<Interger> idlist);

    sql动态语句映射:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    < select id = "selectUserInList" resultType = "User" >
       SELECT *
       FROM USER
       WHERE ID in
       < foreach item = "item" index = "index" collection = "list"
           open = "(" separator = "," close = ")" >
             #{item}
       </ foreach >
    </ select >


    5.对象类型中的集合属性
  2. 对于单独传递的List或Array,在SQL映射文件中映射时,只能通过list或array来引用。但是如果对象类型有属性的类型为List或Array,则在sql映射文件的foreach元素中,可以直接使用属性名字来引用。
    mapper接口:

    1
    List<User> selectByExample(UserExample example);

    sql映射文件:

    1
    2
    3
    < where >
       < foreach collection = "oredCriteria" item = "criteria" separator = "or" >
         < if test = "criteria.valid" >

    在这里,UserExample有一个属性叫oredCriteria,其类型为List,所以在foreach元素里直接用属性名oredCriteria引用这个List即可

    item=”criteria”表示使用criteria这个名字引用每一个集合中的每一个List或Array元素


映射文件说明:

配置映射文件(**Mapper.xml)

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
  
<!-- 命名空间的使用使得接口绑定成为可能,目的是使用更长的完全限定名来隔离语句-->
<mapper namespace="DAO接口URL">
<!-- 解剖语句:这个语句被称为getfindbyid,使用一个int(或者Integer),并返回一个BlogBean类型的对象,其中的键是列名,值是列对应的值 #{id} 表示MyBatis创建一个PreparedStatement(预处理语句)参数-->


<select id="getfindbyid" parameterType="int" resultType="BlogBean">

select * from tbl_blog where id=#{id}
</select>
<!--sql这个元素定义可重用的SQL代码段-->
<sql id="selectConums">name,title</sql>
<select id="getfindbyid" parameterType="int" resultType="BlogBean">
select id,<include refid="selectConums" /> from tbl_blog where id=#{id}
</select>
<select id="getfind" parameterType="BlogBean" resultType="BlogBean">
   select * from blog where 1=1 
   <if test="name != null">
    and name=#{name}
   </if>
   <if test="title != null">
    and title like #{title}
   </if>
  </select>
  
  <insert id="addBlog" parameterType="BlogBean">  

<!-- 该处的parameterType中的值是在配置文件中设置的别名 -->
   insert into blog(id,<include refid="selectConums"/>) values(#{id},#{name},#{title})
  </insert>
  
  <update id="updateBlog" parameterType="BlogBean"> 

<!-- 该处的parameterType中的值是在配置文件中设置的别名 -->
   update blog set name=#{name} where id=#{id}
  </update>
  <delete id="deleteBlog" parameterType="int">
   delete from blog where id=#{id}
  </delete>
  
 </mapper> 

学习资料:http://blog.csdn.net/kutejava/article/details/9164353


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值