mybatis的使用

来源:互联网 发布:知乎 玄幻小说推荐 编辑:程序博客网 时间:2024/06/06 03:23

一、概念

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

二、从XML创建SqlSessionFactory实例

1、    每个mybatis应用程序主要是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得,SqlSessionFactoryBuilder可以从一个XML配置文件或一个预定义的配置类的实例获得。

2、(1)可使用类资源路径来加载配置文件,也可使用包括文本文件路径或者以file:// 开头URL 的方式。MyBatis 包括一个叫做Resources 的工具类,其中包含了一系列方法,使之能简单地从classpath 或其它地方加载配置文件。

String resource = "org/mybatis/example/Configuration.xml";Reader reader = Resources.getResourceAsReader(resource);sqlMapper = new SqlSessionFactoryBuilder().build(reader);

(2)通过java 代码而不是通过XML 创建配置选项,或者创建自己的配置生成器。MyBatis 提供了一个完整的配置类,它提供了与XML 文件相同的配置选项。

TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment =new Environment("development", transactionFactory, dataSource);Configuration configuration = new Configuration(environment);configuration.addMapper(BlogMapper.class);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(configuration);
这种方式下的配置添加一个映射类。映射类是包含SQL 映射注解的Java 类,从而避免了使用XML。但是,由于注解的一些局限性以及MyBatis 映射的复杂性,XML 仍然是一些高级的映射功能(如嵌套连接映射,Nested Join Mapping)所必须的方式。基于这个原因,如果存在XML 文件,MyBatis 自动寻找并加载这个XML 文件。在这种情况下BlogMapper.xml 将会被类路径下名称为BlogMapper.class 的类加载。
3、XML 配置文件包含MyBatis 框架的核心设置,包括获取数据库连接的DataSource 实例和包括决定事务作用域范围和控制的事务管理等。

4、XML 配置文件的头部,会使用DTD 验证文档来验证该XML 配置文件。body 部分的environment元素,包含了事务管理和连接池配置。mappers 元素指定了映射配置文件----包含SQL 语句和映射定义的XML文件。

三、从SqlSessionFactory获取SqlSession

1、SqlSession 包含了所有执行数据库SQL 语句的方法,能够直接地通过SqlSession 实例执行映射SQL 语句。

SqlSession session = sqlMapper.openSession();try {    Blog blog = (Blog) session.selectOne(    "org.mybatis.example.BlogMapper.selectBlog", 101);} finally {    session.close();}
2、可以对给定的映射语句,使用一个正确描述参数与返回值的接口(如BlogMapper.class),就能更清晰地执行类型安全的代码,从而避免错误和异常。
SqlSession session = sqlSessionFactory.openSession();try {    BlogMapper mapper = session.getMapper(BlogMapper.class);    Blog blog = mapper.selectBlog(101);} finally {    session.close();}

四、映射SQL语句

1、所有MyBatis 提供的功能特性都可以通过基于XML 映射配置文件配置来实现。

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.mybatis.example.BlogMapper">      //namespace:命名空间<select id="selectBlog" parameterType="int" resultType="Blog">      //id:映射语句的名称select * from Blog where id = #{id}</select></mapper>

可替换为:

public interface BlogMapper {    @Select("SELECT * FROM blog WHERE id = #{id}")    Blog selectBlog(int id);}
2、第一种方法

通过指定完整类名“org.mybatis.example.BlogMapper”来访问:直接映射到一个具在相同命名空间的映射类,这个映射类有一个方法的名称、参数及返回类型都与select映射语句相匹配。

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
3、第二种方法

第一它不依赖于字符串,所以更安全;第二,如果IDE 有自动完成功能,可以利用这功能很快导航到映射SQL 语句;第三,不需要关注返回类型,不需要进行强制转换,因为使用BlogMapper 接口已经限定了返回类型,它会安全地返回。

BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101); 
4、命名空间
(1)命名空间是必须的,并且不仅仅是简单地使用完整类名来隔离区分语句。命名空间能够进行接口绑定,即使现在不会使用到它。一旦使用了命名空间并且放入适当的java 包命名空间中将会使代码清晰,并提高MyBatis 的长期可用性。
(2)名称解析: 为了减少大量地输入, MyBatis 对所有的配置元素,包括statements、resultmaps、caches 等使用下面的名称解析规则:
完整类名:(例如: “com.mypackage.MyMapper.selectAllThings”)可用来直接查找并使用。
短名称: (例如: “selectAllThings”)可用来引用明确的实体对象。但是,如果出现有两个或更多(例如“com.foo.selectAllThings 和com.bar.selectAllThings”)实体对象,就必须使用完整类名。

五、作用域和声明周期

1、SqlSessionFactoryBuilder
这个类可以在任何时候被实例化、使用和销毁。一旦创造了SqlSessionFactory 就不需要再保留它了。所以SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法变量)。可以重用SqlSessionFactoryBuilder 创建多个SqlSessionFactory 实例,但最好不要把时间、资源放在解析XML 文件上,而是要从中解放出来做最重要事情。
2、SqlSessionFactory
一旦创建,SqlSessionFactory 将会存在于应用程序整个运行生命周期中。很少或根本没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建SqlSessionFactory。SqlSessionFactory 最好的作用域范围是一个应用的生命周期范围。这可以由多种方式来实现,最简单的方式是使用Singleton 模式或静态Singleton 模式。也可使用像Google Guice 或Spring 的依赖注入方式。这些框架允许创造一个管理器,用于管理SqlSessionFactory 的生命周期。
3、SqlSession
每个线程都有一个SqlSession 实例,SqlSession 实例是不被共享的,并且不是线程安全的。因此最好的作用域是request 或者method。决不要用一个静态字段或者一个类的实例字段来保存SqlSession 实例引用。也不要用任何一个管理作用域,如Servlet 框架中的HttpSession,来保存SqlSession 的引用。如果正在用一个WEB 框架,可以把SqlSession 的作用域看作类似于HTTP 的请求范围。也就是说,在收到一个HTTP 请求,可以打开一个SqlSession,当把
response 返回时,就可以把SqlSession 关闭。要确保会话在一个finally 块中被关闭。
SqlSession session = sqlSessionFactory.openSession();try {    ......} finally {    session.close();}
4、Mapper实例
Mappers 是创建来绑定映射语句的接口,该Mapper 实例是从SqlSession 得到的。因此,所有mapper 实例的作用域跟创建它的SqlSession 一样。但是,mapper 实例最好的作用域是method,也就是它们应该在方法内被调用,使用完即被销毁。并且mapper 实例不用显式地被关闭。虽然把mapper 实例保持在一个request 范围(与SqlSession 相似)不会产生太大的问题,在这个层次上管理太多资源可能会失控。保持简单,就是让Mappers 保持在一个方法内。
SqlSession session = sqlSessionFactory.openSession();try {    BlogMapper mapper = session.getMapper(BlogMapper.class);    ......} finally {    session.close();}

六、Mapper XML配置

1、MyBatis 的XML 配置文件包含了设置和影响MyBatis 行为的属性。
2、XML 配置文件的层次结构如下:configuration、properties、settings、 typeAliases、typeHandlers、objectFactory、plugins、environments、environment、transactionManager、dataSource、mappers
(1)properties元素:它们都是外部化,可替代的属性
<properties resource="org/mybatis/example/config.properties">     <property name="username" value="dev_user"/>     <property name="password" value="F2Fa3!33TYyg"/> </properties>
在整个配置文件中,这些属性能够被可动态替换(即使用占位符)的属性值引用:username 和password 将会被替换为配置在properties 元素中的相应值。driver 和url 属性则会被config.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>
这些属性也可以传递给sqlSessionFactoryBuilder.build()方法。
SqlSessionFactory factory =sqlSessionFactoryBuilder.build(reader, props);......SqlSessionFactory factory =sqlSessionFactoryBuilder.build(reader, environment, props);
如果一个属性存在于多个地方,MyBatis 将使用下面的顺序加载: 首先读入properties 元素主体中指定的属性。然后会加载类路径或者properties 元素中指定的url 的资源文件属性。它会覆盖前面已 经读入的重复属性。通过方法参数来传递的属性将最后读取(即通过sqlSessionFactoryBuilder.build),同样也会覆盖从properties 元素指定的和resource/url 指定的重复属性。因此最优先的属性是通过方法参数来传递的属性,然后是通过resource/url 配置的属性,最 后是在MyBatis 的Mapper 配置文件中,properties 元素主体中指定的属性。
(2)settings元素:用于设置和改变MyBatis 运行中的行为。
cacheEnabled :全局性地启用或禁用所有在mapper 配置文件中配置的缓存。默认值为true 。
lazyLoadingEnabled: 全局性地启用或禁用延迟加载。当禁用时,所有关联的配置都会立即加载。默认值为true 。 
aggressiveLazyLoading: 当启用后,一个有延迟加载属性的对象的任何一个延迟属性被加载时,该对象的所有的属性都会被加载。否则,所有属性都是按需加载。默认值为true 。
multipleResultSetsEnabled :允许或禁止从单一的语句返回多个结果集(需要驱动程序兼容)。默认值为true 。 
useColumnLabel: 使用列的标签而不是列的名称。在这方面,不同的驱动程序可能有不同的实现。默认值为true 。 
useGeneratedKeys :允许JDBC 自动生成主键。需要驱动程序兼容。如果设置为true 则会强行自动生成主键,然而有些则不会自动生成主键(驱动程序不兼容),但依旧会工
作(如Derby)。默认值为true 。 
autoMappingBehavior :指定MyBatis 是否以及如何自动将列映射到字段/属性。
defaultExecutorType: 配置默认的执行器(executor)。
defaultStatementTimeout :设置查询数据库超时时间。任何正整数。
<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="true"/><setting name="useGeneratedKeys" value="false"/><setting name="enhancementEnabled" value="false"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="defaultStatementTimeout" value="25000"/></settings>
(3) typeAliases元素:与XML 配置文件相关联,减少输入多余的完整类名,用于定义一个 JavaBean 类的别名。
<typeAliases><typeAlias alias="Author" type="domain.blog.Author"/><typeAlias alias="Blog" type="domain.blog.Blog"/><typeAlias alias="Comment" type="domain.blog.Comment"/><typeAlias alias="Post" type="domain.blog.Post"/><typeAlias alias="Section" type="domain.blog.Section"/><typeAlias alias="Tag" type="domain.blog.Tag"/></typeAliases>
(4)typeHandlers元素:每当MyBatis 设置参数到PreparedStatement 或者从ResultSet 结果集中取得值时,就会使用TypeHandler 来处理数据库类型与java 类型之间转换。

七、mybatis接口注解

1、使用合理描述参数和SQL语句返回值的接口,代码更安全,没有容易发生的字符串文字和转换的错误。
@Select("select * from user where id= #{id}")

八、mybatis动态SQL语句

mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑。
1、if 语句 (简单的条件判断)
2、choose (when、otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似
3、trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
用来去处多余关键字的标签,它可以用来实现 where 和 set 的效果。prefixOverrides 属性会忽略通过管道分隔的文本序列。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。
4、where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。where 主要是用来简化 sql 语句中 where 条件判断,自动地处理 AND/OR 条件。若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。
5、set (主要用于更新时)
set 元素可以被用于动态包含需要更新的列,而舍去其他的。set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。
6、foreach (在实现 mybatis in 语句查询时特别有用)
对一个集合进行遍历,通常是在构建 IN 条件语句的时候。它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量,允许指定开闭匹配的字符串以及在迭代中间放置分隔符。
7、bind
bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。