MyBatis介绍和入门一

一.什么是mybatis?
mybatis是一种支持传统SQL,存储过程和高级映射的类持久化的框架。mybatis消除了几乎所有JDBC的代码,手工设置的参数和检索的结果集。mybatis配置和原生map可以通过使用简单的XML或者注解来实现,map接口和JAVA的POJO(简单JAVA对象)来进行数据库记录。(mybatis 英文介绍
二.开始学习mybatis
1.安装
(1)如果你要使用mybatis,你只需要在你的classpath下面包含 mybatis-x.x.x.jar的路径就可以。
(2)如果你正在使用maven,那么你就只需要在你maven中的pom.xml文件中加入下面这段依赖代码就可以:

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

2.在XML中创建SqlSessionFactory
(1)每个mybatis应用中心都会有一个SqlSessionFactory的实例,通过使用SqlSessionFactoryBuilder可以获取SqlSessionFactory的实例。在XML配置文件或者一个定制好的配置类中SqlSessionFactoryBuilder可以创建一个SqlSessionFactory的实例。
(2)在一个XML文件中创建一个SqlSessionFactory的实例很简单,你使用路径资源来进行配置的方式是被推荐的,但是你可以使用任何的InputStream的实例,包括从一个原生(literal )文件路径或者一个文件URL创建的实例。mybatis包括一个多功能的类,被称之为资源,该类里面有大量的方法,可以使得从classpath或者其他位置加载资源变的更加简单。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

(3)这个XML配置文件包含了mybatis系统的核心设置,包括数据源获取数据库连接的实例,也包含一个事务管理来决定事务如何被审视(scoped)和控制。在这个文档的后面可以看到XML配置文件的所有细节。下面是一个简单的例子:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

在XML配置文件中有很多配置,上面的例子只是指出了最典型的部分。注意XML的头信息,要求校验XML文档。body中的environment元素对事务管理和连接池进行了environment的配置。mappers 元素包含了一系列的mappers,XML文件或者被加注解的JAVA接口类包含了SQL代码和映射的定义。
(4)不用XML来创建SqlSessionFactory
如果你更喜欢直接的用java创建配置,而不使用XML,或者你有自己的配置创建器。mybatis提供了一个完整的配置类,该类提供了和XML文件所有相同的配置。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
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);

注意,在这个例子中添加了一个mapper类,该类是一个包含SQL,映射,注解的不需要XML文件的JAVA类。然而,由于JAVA注解和某些mybatis及XML映射的限制仍然需要更高级的映射,(比如Nested Join Mapping)。由于这个原因,如果这个XML文件存在,mybatis会自动的查找和加载一个同等的XML文件(在这个例子中,BlogMapper.xml 将被加载基于BlogMapper类的名字和路径)
(5)从SqlSessionFactory获取一个SqlSession
既然你有一个SqlSessionFactory,正如它名字所暗示,你可以获得一个SqlSession的实例,SqlSession 包含每个独立的方法,这些方法是需要对数据库执行SQL命令。你可以通过SqlSession 的实例直接的执行SQL语句,例如:

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

当这个方法起作用时,对于使用者来说就好像以前mybatis的版本一样。这里有个更好的办法,使用接口(例如 BlogMapper.class)来恰当的描述参数和所给声明的返回值,你现在可以执行更好更安全的代码,没有字符串和类型转换错误。例如:

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

(6)探索映射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头和doctype声明中获取了很多(mileage ),文件的其余部分都有很充足的自我解释。它给映射语句定义了一个名字“selectBlog”,在命名空间为“org.mybatis.example.BlogMapper”中允许你通过指定完全限定名称“org.mybatis.example.BlogMapper.selectBlog”调用。正如我们在上面的例子。

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

这和指定JAVA类的全名来调用一个方法是很相似的。这个名字可以直接映射到具有相同名字的命名空间的Mapper 类,有个方法来匹配名字、参数和返回类型,比如映射查询语句。正如你看到的可以通过Mapper 的接口使得你非常简化的调用该方法。

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

第二种方法有很多的优点。首先,它是不依赖于字符串的,因此会更加安全。其次,如果你使用IDE已经实现编码,当(navigating )你的SQL映射语句时你可以利用它。
注意:关于命名空间namespaces

  • mybatis以前版本的namespaces是可选择的,这种方式很容易造成编码者疑惑,而且帮助也不大。现在namespaces是必须的,而且是有目的的超过简单独立的语句,完全限定名称。
  • 正如你所看到的,namespaces使得接口绑定,即使你认为你今天不使用它们,万一你改变了你的注意,你应该按照下面的例子练习。从长远来看,一旦使用namespace ,把它放到一个合适的java包的命名空间将会净化你的代码而且会提高mybatis的可适用性。
  • 名称的分解:为了减少编码的量,对于所有已经命名好的配置元素(语句,结果集,缓存等),mybatis使用下面的名称分解规则。
  • 完全名称很直接被查找和使用 (比如:com.mypackage.MyMapper.selectAllThings)
  • 短名称可以被用来引用任何清楚的记录(比如:selectAllThings),然后如果存在两个或者更多相同的短名称,但是不在同一个包(比如:com.foo.selectAllThings and com.bar.selectAllThings),你将会受到一个错误报告,因为短名称并不是很清楚的说明属于哪个,此时你必须使用完全名称。
    这里有关于Mapper 类的诀窍,比如: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,反之亦然.
(7)范围和生命周期
到目前为止理解我们所讨论的各种范围和生命周期是很重要的。错误的使用它们可以造成严重的并发问题。
要点:对象生命周期和依赖注入框架
依赖注入框架可以创建线程安全、事务SqlSessions 和映射,并且直接把它们注入到你的bean实体类,因此你可以忘记它们的生命周期。或许你想看一下MyBatis-Spring或者MyBatis-Guice的子项目来了解更多关于通过依赖注入使用MyBatis.
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃。当你创建了SqlSessionFactory就没有必须继续创建这个类,因此SqlSessionFactoryBuilder 实例的最好的范围就是方法的范围(例如:一个本地方法变量)。你可以重新使用SqlSessionFactoryBuilder 来创建SqlSessionFactory 的多个实例。确定所有的XML解析资源被释放来获取更重要的东西时,最好不要持有SqlSessionFactoryBuilder 。
SqlSessionFactory
一旦被创建了,在你的应用执行期间SqlSessionFactory 时一直存在的。应该很少或没有理由去处理或者重新创建SqlSessionFactory。不要再应用程序运行的时候多次重建SqlSessionFactory是一种最佳的实践。这样做应该被认为是一种bad smell(这句话不太理解,但是不影响整个大意)。因此,SqlSessionFactory最好的范围就是应用程序的范围。这可以通过很多的途径来实现。最简单的方式就是使用一个单例模式或者静态单例模式。
SqlSession
每个线程应该有自己SqlSession的实例。SqlSession 的实例时不被共享的,也不是线程安全的。因此,最好的范围就是request或者方法范围。绝对不要再一个静态域或者一个类的实例域中保持对一个SqlSession实例的引用。不要在任何管理范围中保持SqlSession的引用,例如Servlet框架里的HttpSession,如果你i正在使用一个web框架,可以考虑把SqlSession当作一个类似于HTTP 请求遵循的范围。换句话说,当收到一个HTTP 请求,你可以打开一个SqlSession,接着,当返回一个回应的时候,你可以关掉它。关掉session是很重要的。你应该确定它在finally块中被关闭掉。下面的这段代码是确定关闭SqlSession的标准模式:

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}

在你的所有代码中坚持使用这种模式,可以确保你的所有数据库资源可以被在合适的时候关闭掉。
Mapper Instances
映射接口是你用来创建绑定你的映射语句。映射接口的实例可以从SqlSession来获取。正如,技术上的任何映射接口最广的范围就和SqlSession一样,他们都是必然要求的。然而,映射实例的最好的范围就是方法范围。那也就是说他们必须在一个他们所使用的方法里面,然后被不再使用。他们不需要被明确的关闭。然后在整个request中一直存在他们也不是问题,有点类似于SqlSession,你或许发现在这个级别管理太多的资源很快就会失控。保持简单,保持映射在方法范围内。下面这个例子演示了这种做法:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // do work
} finally {
  session.close();
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值