MyBatis

一、MyBatis简介
1.MyBatis本来是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并改名为MyBatis。2013年11月迁到Github。iBATIS一词来源于”internet”和”abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(sDAO)。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
2.Hibernate与MyBatis
1)Hibernate 对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。
2)iBATIS 的着力点,则在于POJO 与SQL之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。
3.Mybatis的功能架构分为三层(图片借用了百度百科):
1) API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
二、MyBatis安装
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可
官网 http://mybatis.github.io/
下载路径:https://github.com/mybatis/mybatis-3/releases
文档:http://mybatis.github.io/mybatis-3/zh/getting-started.html

三、配置MyBatis
1.从XML中构建SqlSessionFactory:
每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例
这里写图片描述
2.数据库配置文件Jdbc.properties内容
这里写图片描述
3.实体类:
这里写图片描述
4.mybatis.xml内容:
这里写图片描述
5.foodMapper.xml内容:
这里写图片描述

通过接口直接映射sql(xml)
1)接口定义:
这里写图片描述
2)mybatis.xml内容:
这里写图片描述
3)foodMapper.xml:
这里写图片描述
通过接口直接映射Sql(注解)
1)接口定义:
这里写图片描述
2)mybatis.xml内容:
这里写图片描述
测试:
这里写图片描述
四、xml映射配置文件
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。文档的顶层结构如下:
configuration 配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
Properties:
属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。例如:

<properties  resource="config.properties"> 
<property name="username" value="dev_user"/> 
<property name="password" value="F2Fa3!33TYyg"/> </properties>

其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值。比如:

<dataSource type="POOLED">
 <property name="driver" value="${driver}"/>
 <property name="url" value="${url}"/> 
<property name="username" value="${username}"/>
 <property name="password" value="${password}"/> </dataSource>

属性也可以被传递到 SqlSessionBuilder.build()方法中。例如:

 SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props); // ... or ... 
   SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);

typeAliases:
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:

<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/> <typeAlias alias="Blog" type="domain.blog.Blog"/>
</typeAliases>

当这样配置时,Blog可以用在任何使用domain.blog.Blog的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

<typeAliases> <package name="domain.blog"/> </typeAliases>

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为author;若有注解,则别名为其注解值。看下面的例子:

@Alias("author") public class Author { ... }

这里写图片描述

五、Mapper XML文件
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
1.select语句:

<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} 
</select>

这个语句被称作 selectPerson,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。
注意参数符号:

{id}

这里写图片描述
2.select多条件查询:
parameterType 用于传递 参数多参数可以使用传入对象以及map的方式传递多个参数。

{}表示传递的参数值 类同jdbc的 ?

${}表示直接将参数值替换 类同 ‘%值%’
比如:

  <select id=”selectPerson” parameterType=”map”    resultType=”person”> SELECT * FROM PERSON WHERE ID = #{id} and name like ‘%${name}%’ 
  </select>
Map中必须存在id和name的键值对

3.select 调用存储过程:
创建存储过程prg_add(p1 in number,p2 in number p3 out number)
Mybatis映射文件中使用select调用存储过程

<select id=“prgAdd" statementType="CALLABLE">  <![CDATA[  
{call pro_hello (
    #{p1,mode=IN,jdbcType=NUMBER},
    #{p2,mode=IN,jdbcType=NUMBER},
    #{result,mode=OUT,jdbcType=NUMBER})}  
   ]]>  
 </select>  

测试调用过程

Map<String, String> param = new HashMap<String, String>();  
param.put(“p1”, 1);  param.put(“p2”, 2);  
String returnValue = (String) session.selectOne(" prgAdd ", param);  
System.out.println("result=" + param.get("result"));  
System.out.println("returnValue=" + returnValue);  

4.insert,update和delete
数据变更语句 insert,update 和 delete 的实现非常接近

<insert id="insertAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="" timeout="20">
 <update id="updateAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20"> 
<delete id="deleteAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">

这里写图片描述
5.selectKey
这里写图片描述
6.Sql
这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化.
这里写图片描述
7.If
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
if
choose (when, otherwise)
trim (where, set)
foreach
8.Result Maps
resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事 情。 事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。 ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们 的关系。

<select id="selectUsers" resultType="map"> select id, username, hashedPassword from some_table where id = #{id} 
</select> 

9.高级结果映射
这里写图片描述

这里写图片描述

这里写图片描述
这里写图片描述

六、动态sql
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
if
choose (when, otherwise)
trim (where, set)
foreach
1.If
动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:

<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ 
<if test="title != null">
 AND title like #{title} 
</if> 
</select>

这里写图片描述
2.choose, when, otherwise
们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
还是上面的例子,但是这次变为提供了“title”就按“title”查找,提供了“author”就按“author”查找,若两者都没有提供,就返回所有符合条件的BLOG(实际情况可能是由管理员按一定策略选出BLOG列表,而不是返回大量无意义的随机结果)。

<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ 
    <choose> 
        <when test="title != null"> AND title like #{title} </when> 
        <when test="author != null and author.name != null"> AND author_name like #{author.name}</when> 
        <otherwise> AND featured = 1 </otherwise> 
    </choose> 
</select>

这里写图片描述
3.trim, where, set

<select id="findActiveBlogLike" 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 author_name like #{author.name} </if> 
</select>

如果这些条件没有一个能匹配上将会怎样?最终这条 SQL 会变成这样:
SELECT * FROM BLOG WHERE

<select id="findActiveBlogLike" 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 author_name like #{author.name} </if> 
    </where> 
</select> 

where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。
如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:
类似的用于动态更新语句的解决方案叫做 set。set 元素可以被用于动态包含需要更新的列,而舍去其他的。比如:

<update id="updateAuthorIfNecessary"> 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>

prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。

<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
<trim prefix="SET" suffixOverrides=","> ... </trim>  

这里写图片描述
4.foreach
动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:

<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>

这里写图片描述
七、Mybatis一级和二级缓存
Mybatis一级缓存为sqlSession级别的缓存 默认开启 相同的sqlsession对象 查询相同条件的结果时 存在一级缓存只会查询一次,sqlSession关闭后缓存失效 调用cleanCache后 缓存被清除,执行过增删改后缓存会被清除
二级缓存为sqlSessionFactory级别的缓存 默认不开启
开启方式为如下:

     <settings>
        <setting name="cacheEnabled" value="true"/>
     </settings>
  在映射文件中添加cache标签 默认使用LRU算法 也可以不适用默认  的配置
  <cache eviction="FIFO"  //回收策略为先进先出
      flushInterval="60000" //自动刷新时间60s
      size=“512//最多缓存512个引用对象 readOnly="true"/> //只读

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
八、MyBatis集成Spring
分为以下步骤:
1.下载mybatis-spring插件或者添加maven依赖

<!--Mybatis集成spring的依赖  -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.3</version>
</dependency>

2.配置数据源
这里写图片描述
3.配置SQLSessionFactoryBean设置数据源以及mybatis配置文件的位置
这里写图片描述
4. 配置SqlSessionTemplate 通过构造器注入SqlSessionFactoryBean
这里写图片描述
5. 配置DataSourceTransactionManager注入数据源配置事务
这里写图片描述
6.配置MapperScannerConfigurer扫描注解对应的mapper文件对应的包
这里写图片描述
7.配置spring事物的切面以及通知
这里写图片描述
注意:expression="execution(* cn.*..*.service.*.*(..))"
第一个*:返回值
..:任意多个包
第四个*:代表所有的类
第五个*:代表类所有方法
最后一个..代表所有的参数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值