MyBatis 概述

Mybatis 是一种持久层的框架,通过建立接口的方法和 XML 注册的 SQL 语句的映射关系来实现对数据库的操作。

入门

获取数据库连接之前

首先获取数据库的连接实例 SqlSession 的连接池 SqlSessionFactory:

1
2
3
4
5
6
7
8
9
10
11
12
13
private static SqlSessionFactory factory; //连接池
static {
try {
String resource="MyBatis-config.xml"; //连接池的配置文件
InputStream inputstream = Resources.getResourceAsStream(resource); //将配置文件读入流中
factory = new SqlSessionFactoryBuilder().build(inputstream); //按照配置文件建造 SqlSession 连接池
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() { //从连接池获取连接
return factory.openSession();
}

获取连接池需要在服务器启动的时候进行,所以放到静态代码块里面执行。上面的 SqlSessionFactoryBuilder 作用就是按照配置文件建造连接池,此实例用完就扔,所以不给外部引用,让 GC 把它回收了。留着 SqlSessionFactory 作为单独一个连接池管理 SQL 连接。

数据库连接

MyBatis-config.xml 连接池配置中加入数据库连接环境,其中 <property> 标签中的 value 中依次填入所有的信息即可。

或者外部引入一个 properties 文件,里面写上数据库连接数据,然后用 ${PropertyName} 的方式引用。

外部文件 DataBase.properties

1
2
3
4
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456

然后配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<properties resource="DataBase.properties"></properties> <!--引入外部的文件-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>

建立 DAO 层方法和 SQL 语句的映射

DAO 层的接口:

1
2
3
4
5
6
7
8
public interface UserMapper {
List<User> getUsers();
int addUser(User user);
int updateUser(User user);
int deleteUserByUserName(String userName);
User queryUserById(Integer id);
User queryUserByUserName(String userName);
}

新建数据库操作接口映射的 XML 文件:

1
2
3
4
5
6
7
8
9
<?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="space.xorex.mapper.UserMapper">
<select id="getUsers" resultType="space.xorex.pojo.User">
select * from user
</select>
</mapper>

注意上面的 namespace 是下方的 SQL 语句映射的执行方法名称所在的定义空间(就是定义这些方法的接口),接口只能写完整的类名,不可以用别名。然后每一条就是执行方法映射的 SQL 语句。

对于这些映射标签,比如下面的,就一定要注意对应的接口方法名称的 参数 和 返回值,写对应的信息,而对于常见的数据类型,MyBatis 进行了别名映射,可以不区分大小写的使用这些别名。然后就是占位符的填充,使用 #{} 里面写数据名,是从 parameterType 中寻找的(但其实这个属性完全可以不写)。

1
2
3
4
5
6
<select id="queryUserByUserName" resultType="space.xorex.pojo.User" parameterType="string"> 
<!--这里 string 就是一个规定好的 java.lang.String 的别名-->
select *
from user
where userName=#{userName}
</select>

获取 Mapper 实例

直接用 MybatisUtils 里面的 getSession() 获取连接,然后调用 SqlSession 的 getMapper() 获取对应 Mapper 接口的实现对象。都用完之后,SqlSession 需要提交 commit() 和关闭 close()。

1
2
3
4
5
6
7
8
9
10
11
public class UserMapperTest {
SqlSession session=MybatisUtils.getSession();

@Test
public void insertUser() {
UserMapper mapper=session.getMapper(UserMapper.class);
mapper.insertUser("This", "That");
session.commit(); //修改完数据库需要提交
session.close(); //使用完连接记得关闭
}
}

需要说一下的是,这里获取的 Mapper 接口实现类,其实是一个动态代理类,叫作 MapperProxy,这个动态代理类是 Mybatis 根据配置文件自动生成的。