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.环境搭建:
下载相应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
基本类型:包含int,String,Date等,基本数据类型作为传入参数,只能传入一个。通过#{参数名}即可获取传入的值.
复杂类型:包含java实体类,Map,通过#{属性名}或#{Map的KeyName}即可获取传入的值。
mapper接口方法一般接受一个参数,可以通过使用@Param注释将多个参数绑定到一个map做为输入参数。
- 简单数据类型
mapper接口方法:
1User selectByPrimaryKey(Integer id);
sql映射:
123456<
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来引用这个参数了。像这样:
12345678<
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来引用。
- 对象类型
传入JAVA复杂对象类型的话,sql映射语句中就可以直接引用对象的属性名了,这里的属性名是实实在在的真实的名字,不是随意指定的。
mapper接口方法:1int
insert(User user);
sql影射:
123<
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"
>
- map类型
传入map类型,直接通过#{keyname}就可以引用到键对应的值。使用@param注释的多个参数值也会组装成一个map数据结构,和直接传递map进来没有区别。
mapper接口:
1int
updateByExample(
@Param
(
"user"
) User user,
@Param
(
"example"
) UserExample example);
sql映射:
1234567<
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.集合类型
可以传递一个List或Array类型的对象作为参数,MyBatis会自动的将List或Array对象包装到一个Map对象中,List类型对象会使用
list作为键名,而Array对象会用array作为键名。
集合类型通常用于构造IN条件,sql映射文件中使用foreach元素来遍历List或Array元素。
mapper接口:
1User selectUserInList(List<Interger> idlist);
sql动态语句映射:
123456789<
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.对象类型中的集合属性-
对于单独传递的List或Array,在SQL映射文件中映射时,只能通过list或array来引用。但是如果对象类型有属性的类型为List或Array,则在sql映射文件的foreach元素中,可以直接使用属性名字来引用。
mapper接口:1List<User> selectByExample(UserExample example);
sql映射文件:
123<
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