1、安装
要使用MyBatis,您只需要在类路径中包含mybatis-x.x.x.jar文件。
如果您使用Maven,只需将以下依赖项添加到您的pom.xml:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2、从XML构建SqlSessionFactory
每个MyBatis应用程序都以SqlSessionFactory的一个实例为中心。可以使用SqlSessionFactoryBuilder获取SqlSessionFactory实例。
SqlSessionFactoryBuilder可以从XML配置文件或配置类的自定义准备实例构建SqlSessionFactory实例。
从XML文件构建SqlSessionFactory实例非常简单。建议您为此配置使用类路径资源,但是您可以使用任何InputStream实例,包括从文字文件路径或文件:// URL创建的实例。
MyBatis包含一个名为Resources的实用程序类,它包含许多方法,可以简化从类路径和其他位置加载资源的过程。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
配置XML文件包含MyBatis系统核心的设置,包括用于获取数据库连接实例的数据源,以及用于确定事务范围和控制方式的TransactionManager。
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文档所必需的。环境元素的主体包含用于事务管理和连接池的环境配置。映射器元素包含映射器列表——XML文件和/或包含SQL代码和映射定义的带注释的Java接口类。
3、不使用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类。Mapper类是包含SQL映射注释的Java类,它避免了对XML的需要。然而,由于Java注释的一些限制和一些MyBatis映射的复杂性,大多数高级映射(例如嵌套连接映射)仍然需要XML映射。由于这个原因,MyBatis将自动查找并加载一个存在的对等XML文件(在本例中,将根据类路径和BlogMapper.class的名称加载BlogMapper.xml)。稍后将对此进行详细介绍。
4、从SqlSessionFactory获取一个SqlSession
现在您已经有了一个SqlSessionFactory,正如其名称所暗示的那样,您可以获取一个SqlSession实例。SqlSession包含对数据库执行SQL命令所需的所有方法。您可以直接针对SqlSession实例执行映射的SQL语句。例如:
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
}
虽然这种方法是可行的,并且以前版本的MyBatis的用户也很熟悉,但是现在有一种更简洁的方法。使用正确描述给定语句的参数和返回值的接口(例如BlogMapper.class),现在可以执行更干净、更类型安全的代码,而不会出现容易出错的字符串常量和类型转换。
例如:
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
}
现在,让我们看看这里到底执行了什么。
5、探索映射的SQL语句
此时,您可能想知道SqlSession或Mapper类究竟在执行什么。映射SQL语句的主题是一个很大的主题,这个主题可能会主导本文档的大部分内容。但是为了让你知道到底是什么在运行,这里有一些例子。
在上面的两个示例中,语句可以由XML或注释定义。让我们先来看看XML。MyBatis提供的所有功能都可以通过使用基于XML的映射语言来实现,这种语言使得多年来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声明中获得很多好处。该文件的其余部分非常容易理解。它在名称空间“org.mybatis.example”中为映射的语句“selectBlog”定义了一个名称。“BlogMapper”,它允许您通过指定“org.mybatis.example.BlogMapper”的完全限定名来调用它。selectBlog”,就像我们在下面的例子中做的那样:
Blog blog = session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
注意,这与在完全限定的Java类上调用方法是多么相似,这是有原因的。这个名称可以直接映射到与名称空间同名的Mapper类,并使用与名称、参数和返回类型匹配的方法作为映射的select语句。这允许你非常简单地调用Mapper接口的方法,正如你在上面看到的,但在下面的例子中它再次出现:
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
第二种方法有很多优点。首先,它不依赖于字符串文字,因此更安全。其次,如果您的IDE具有代码完成功能,那么您可以在导航映射的SQL语句时利用这一点。
请注意关于名称空间的注意事项。
在以前的MyBatis版本中,名称空间是可选的,这既混乱又没有帮助。现在需要名称空间,它的用途不仅仅是将语句与更长的、完全限定的名称隔离。
正如您在这里看到的,名称空间支持接口绑定,即使您认为现在还不会使用它们,您也应该遵循这里列出的这些实践,以防您改变主意。一次性使用名称空间,并将其放在适当的Java包名称空间中,将清理您的代码,并在长期内提高MyBatis的可用性。
名称解析:为了减少键入量,MyBatis对所有命名配置元素(包括语句、结果映射、缓存等)使用以下名称解析规则。
完全限定的名称(例如“com.mypackage.MyMapper.selectAllThings”)将被直接查找并在找到时使用。
短名称(例如“selectAllThings”)可用于引用任何明确的条目。然而,如果有两个或更多的(例如:“com.foo。然后您将收到一个错误报告,短名称是不明确的,因此必须是完全限定的。
对于像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,反之亦然。
6、范围和生命周期
理解到目前为止我们已经讨论过的各种作用域和生命周期类是非常重要的。不正确地使用它们可能会导致严重的并发问题。
注意对象生命周期和依赖注入框架
依赖注入框架可以创建线程安全的事务性SqlSessions和映射器,并将它们直接注入到bean中,这样您就可以忽略它们的生命周期。您可能想了解一下mybatiss - spring或mybatiss - guice子项目,以了解更多关于在DI框架中使用MyBatis的信息。
SqlSessionFactoryBuilder
这个类可以实例化、使用和丢弃。一旦创建了SqlSessionFactory,就没有必要保留它。因此,SqlSessionFactoryBuilder实例的最佳作用域是方法作用域(即局部方法变量)。您可以重用SqlSessionFactoryBuilder来构建多个SqlSessionFactory实例,但是最好不要保留它,以确保所有XML解析资源都被释放出来,用于更重要的事情。
SqlSessionFactory
一旦创建,SqlSessionFactory应该在应用程序执行期间存在。应该很少或没有理由去处理或重新创建它。最好不要在应用程序运行时多次重建SqlSessionFactory。这样做应该被认为是一种“坏味道”。因此,SqlSessionFactory的最佳范围是应用程序范围。这可以通过多种方式实现。最简单的是使用单例模式或静态单例模式。
SqlSession
每个线程都应该有自己的SqlSession实例。SqlSession的实例不能被共享,也不是线程安全的。因此,最好的范围是请求或方法范围。永远不要在静态字段甚至类的实例字段中保留对SqlSession实例的引用。永远不要在任何托管范围内保留对SqlSession的引用,例如Servlet框架的HttpSession。如果您正在使用任何类型的web框架,请考虑使用与HTTP请求范围类似的SqlSession。换句话说,在接收到HTTP请求时,您可以打开SqlSession,然后在返回响应时,您可以关闭它。结束会议非常重要。您应该始终确保它在finally块中关闭。下面是确保关闭SqlSessions的标准模式:
try (SqlSession session = sqlSessionFactory.openSession()) {
// do work
}
在整个代码中始终使用此模式将确保正确关闭所有数据库资源。
映射器实例
映射器是用来绑定到映射语句的接口。mapper接口的实例是从SqlSession获取的。因此,从技术上讲,任何mapper实例最广泛的作用域与请求它们的SqlSession相同。然而,mapper实例的最佳作用域是方法作用域。也就是说,应该在使用它们的方法中请求它们,然后丢弃它们。它们不需要显式地关闭。虽然让他们保持ar不是问题
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
}
原文:https://www.cnblogs.com/ganguixu/p/12499296.html