概述
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 xml 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用 SqlSessionFactory 实例的,一个 SqlSessionFactory 实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder 可以从一个 xml 配置文件或者一个预定义的配置类的实例获得。
用 xml 文件构建 SqlSessionFactory 实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://
开头的url创建的实例。MyBatis有一个实用类 —– Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
MyBatis 使用步骤
- 核心配置文件 mybatis-config.xml
- POJO 模型创建
- 映射文件配置
- 获取 SqlSessionFactory
- 获取 SqlSession
- CRUD 操作
- Transaction 操作
- 关闭 SqlSession
核心配置文件
本示例的项目工程视图为
MyBatis 的默认核心配置文件为 mybatis-config.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="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
<environment id="oracle">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:mybatis_demo"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
注:必须先在 pom.xml 中配置好 MyBatis 的依赖包,否则 mybatis-config.xml 会报 URI is not registered
的错。
environments 元素下可以配置多个 environment 来存放数据库连接,每个 environment 下配置了事务管理类型和连接池类型。
mappers 元素下,配置实体类的映射文件路径。
创建模型
根据数据库表创建实体类模型 User
package com.ggli.entity;
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
映射文件配置
对应于User模型,添加映射文件 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//org.mybatis//DTD mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserMapper">
<select id="queryUser" resultType="com.ggli.entity.User">
SELECT * FROM t_user
</select>
<select id="findUserById" resultType="com.ggli.entity.User" parameterType="java.lang.Long">
SELECT * FROM t_user WHERE id = #{id}
</select>
<select id="findUserByName" resultType="com.ggli.entity.User" parameterType="java.lang.String">
SELECT * FROM t_user WHERE name LIKE #{name}
</select>
<insert id="addUser" parameterType="com.ggli.entity.User">
INSERT INTO t_user (id, name) VALUES (#{id}, #{name})
</insert>
<update id="updateUser" parameterType="com.ggli.entity.User">
UPDATE t_user SET name = #{name} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="long">
DELETE FROM t_user WHERE id = #{id}
</delete>
</mapper>
上述文件配置了基本的CRUD操作。
获取 SqlSessionFactory
获取 SqlSessionFactory 有两种方式,第一种为通过核心配置文件 mybatis-config.xml,第二种为通过 Configuration 类。
- 通过读取 mybatis-config.xml 方式
package com.ggli.util;
public class SqlSessionFactoryUtil {
private static String XML_PATH = "conf/mybatis-config.xml";
private static SqlSessionFactory factory;
static {
try {
Reader reader = Resources.getResourceAsReader(XML_PATH);
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return factory.openSession();
}
public static void closeSqlSession(SqlSession session) {
if (session != null) {
session.close();
}
}
}
- 通过 Configuration 方式(实质就是将 xml 配置转化为对应的对象)
DataSource dataSource = new PooledDataSource(
"com.mysql.jdbc.Driver",
"jdbc:mysql://localhost:3306/mybatis_demo",
"root",
""
);
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("mysql", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(UserMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
单元测试
用JUnit进行测试
public class UserTest {
private SqlSession session;
@Before
public void getSqlSession() {
session = SqlSessionFactoryUtil.getSqlSession();
}
@After
public void closeSqlSession() {
SqlSessionFactoryUtil.closeSqlSession(session);
}
@Test
public void queryUser() {
List<User> users = session.selectList("UserMapper.queryUser");
for (User user : users) {
System.out.println(user.getId() + ": " + user.getName());
}
}
@Test
public void findUserById() {
Long id = 1L;
User user = session.selectOne("UserMapper.findUserById", id);
if (user != null) {
System.out.println(user.getId() + ": " + user.getName());
}
}
}
下一步
上述示例,从核心配置文件,到映射文件,到获取 SqlSessionFactory,到获取 SqlSession,到 Java API 操作,再到测试验证,完成了对 MyBatis 的基本操作。当然这只是最基本的用法。
比如核心配置可配置返回类型的简称,然后在映射文件 resultType 中采用。
比如示例中的 Java 操作,还可以改为通过 Mapper 接口的操作。
比如映射配置,可以改为在 Mapper 接口中通过注解的方式实现。
再比如 MyBatis 的动态 SQL、类型转换、拦截器等等,还有待进一步学习。