1. 概述
MyBatis 是支持定制化 SQL 、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
MyBatis 的中文文档:http://www.mybatis.org/mybatis-3/zh/index.html
用 Maven 构建项目,在 pom.xml 加入如下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2. 快速入门
1.先写个 POJO
public class User {
private int id;
private String name;
private int age;
//get,set方法
}
2.再添加 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:///mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
3.定义操作 users 表的 sql 映射文件 UserMapper.xml ,其中id
是其唯一标识,#{id}
表示从传递过来的参数中取出 id 值。
<?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="com.chen.userMapper">
<select id="getUser" parameterType="int" resultType="com.chen.entity.User">
SELECT * FROM users where id = #{id}
</select>
</mapper>
4.在 mybatis-config.xml 中注册 UserMapper.xml 文件
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
5.写测试代码
public class MyBatisTest {
@Test
public void test() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = factory.openSession();
try {
User user = sqlSession.selectOne("com.chen.userMapper.getUser", 2);
//打印结果:User{id=2, name='Jack', age=11},即测试成功
System.out.println(user);
} finally {
sqlSession.close();
}
}
}
3. 通过自定义接口实现
1.定义一个接口 UserMapper
public interface UserMapper {
public User getUser(Integer id);
}
2.将接口与 UserMapper.xml 配置文件绑定(修改 namespace
为接口全类名和 修改id
为接口的方法)
<?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="com.chen.dao.UserMapper">
<select id="getUser" parameterType="int" resultType="com.chen.entity.User">
SELECT * FROM users where id = #{id}
</select>
</mapper>
3.编写测试代码
@Test
public void test() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = factory.openSession();
try {
//通过 getMapper 方法得到接口实现对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUser(2);
//打印结果:User{id=2, name='Jack', age=11},即测试成功
System.out.println(user);
} finally {
sqlSession.close();
}
}
1.SqlSession 的实例不是线程安全的,因此是不能被共享的。
2.SqlSession每次使用完成后需要正确关闭。
3.SqlSession可以直接调用方法的id进行数据库操作,但是我们一般还是推荐使用 SqlSession 获取到 dao 接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作。
4.两个重要的配置文件:
- mybatis 的全局配置文件:包含数据库连接池信息等
- sql 映射文件:包含每一个 sql 语句的映射信息