MyBatis入门

SqlSessionFactory

SqlSessionFactory是Mybatis的核心,SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而SqlSessionFactoryBuilder会从XML配置文件或Configuration实例中获取配置信息来构建SqlSessionFactory实例。有了SqlSessionFactory就可以获取SqlSession用来执行执行在Mapper.xml中定义好的方法了。下面有一个简单的连接MySQL数据库并查询数据的demo。

工程结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
main
├─java
│ └─cn
│ └─gmfan
│ │ Main.java
│ │
│ └─domain
│ SysUser.java

└─resources
│ mybatis-config.xml

└─mapper
SysUserMapper.xml

maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
</dependencies>

SysUser.java

1
2
3
4
5
6
7
public class SysUser {

private String user_name;
private String nick_Name;

//get、set、toString...
}

SysUserMapp.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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="cn.gmfan.mapper.SysUserMapper">

<select id="selectAllSysUser"
resultType="cn.gmfan.domain.SysUser">
select user_name,nick_name from sys_user
</select>

</mapper>

mybatis-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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>
<!-- 配置mybatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- MySQL数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 连接数据库的URL -->
<property name="url"
value="jdbc:mysql://localhost:3306/database-name?characterEncoding=utf8" />
<property name="username" value="username" />
<property name="password" value="password" />
</dataSource>
</environment>
</environments>
<!-- 将mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="mapper/SysUserMapper.xml" />
</mappers>
</configuration>

Main.java

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) throws IOException {
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
SqlSession ss = ssf.openSession();
//全限定名调用映射语句
List<SysUser> users = ss.selectList("cn.gmfan.mapper.SysUserMapper.selectAllSysUser");
for (SysUser user : users) {
System.out.println(user);
}
}
}

映射SQL语句

MyBatis提供XML与注解映射,简单的映射语句使用注解来映射会使代码更加简介,但对于稍微复杂的SQL语句来说Java注解就没有使用XML映射来得优雅。

作用域和生命周期

依赖注入框架可以创建线程安全的、基于事务的SqlSession和映射器,因此可以直接忽略它们的生命周期。

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。最好不要一直保留它,以保证所有的XML解析资源可以被释放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 且SqlSession应该确保使用完后被关闭以释放资源

1
2
3
try (SqlSession session = sqlSessionFactory.openSession()) {
// 你的应用逻辑代码
}

映射器实例

映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的 SqlSession 相同。但方法作用域才是映射器实例的最合适的作用域。