MyBatis是支持定制化SQL、存储过程和高级映射的优秀且轻量级的持久层框架。其避免了几乎所有的JDBC代码和手动设置参数和获取结果集的繁琐工作,开发人员只需要掌握好SQL语句,方便进行性能优化;另外,MyBatis可以使用简单的XML或注解来配置原始映射,将JavaBean映射成数据库中的记录。
其中,MyBatis概述与HelloWorld的具体实现代码下载地址:http://download.csdn.net/download/bingbeichen/9812888。
1. 概述
MyBatis原是Apache的开源项目iBatis,2010年6月该项目由Apache Software Foundation迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis 3.x正式更名为MyBatis ,代码于2013年11月迁移到Github(下载地址:https://github.com/mybatis/mybatis-3/)。
其中,iBatis一词来源于internet和abatis的组合,是一个基于Java的持久层框架,iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
2. HelloWorld
①. 在MySQL的mybatis数据库中创建一张测试数据表
CREATE TABLE tbl_employee(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(255),
gender CHAR(1),
email VARCHAR(255)
)
②. 在Eclipse中创建新的工程,新建lib目录并添加所依赖的jar包
③. 创建测试数据表所对应的JavaBean
package com.qiaobc.mybatis.bean;
public class Employee {
private Integer id;
private String lastName;
private String gender;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", gender="
+ gender + ", email=" + email + "]";
}
}
④. 创建SQL映射文件,用于保存SQL语句的映射信息,将SQL语句与Java代码解耦
<!-- EmployeeMapper.xml文件 -->
<?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">
<!--
namespace:命名空间
id:SQL语句的唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中获取id值
-->
<mapper namespace="com.qiaobc.mybatis.EmployeeMapper">
<select id="selectEmployee" resultType="com.qiaobc.mybatis.bean.Employee">
select id, last_name lastName, gender, email from tbl_employee where id = #{id}
</select>
</mapper>
⑤. 创建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" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 将SQL映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中 -->
<mappers>
<mapper resource="EmployeeMapper.xml" />
</mappers>
</configuration>
⑥. 具体测试
package com.qiaobc.mybatis.test;
public class MyBatisTest {
@Test
public void test() throws Exception {
// 1. 根据MyBatis全局配置文件,创建SqlSessionFactory实例
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 获取SqlSession实例:其能够执行已经映射的SQL语句,且一个SqlSession对象代表和数据库的一次会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3. 执行已经映射的SQL语句
// SQL语句的唯一标识:statement Unique identifier matching the statement to use.
// 执行SQL语句所需参数:parameter A parameter object to pass to the statement.
try {
Employee employee = sqlSession.selectOne("selectEmployee", 1);
System.out.println(employee);
} finally {
// 4. 关闭SqlSession
sqlSession.close();
}
}
}
3. 接口式编程
主要问题:使用XML文件的方式创建SqlSessionFactory实例,进而获取SqlSession对象进行数据库操作时,已映射SQL语句的唯一标识信息较长且执行SQL所需要参数的类型与返回值类型没有限制。
在此,当使用MyBatis框架时,通常使用接口式的编程方式,具体步骤如下:
①. 创建待操作对象对应的接口类和相应的方法,如EmployeeMapper
package com.qiaobc.mybatis.dao;
import com.qiaobc.mybatis.bean.Employee;
public interface EmployeeMapper {
// 根据员工ID获取员工信息
public Employee getEmployeeByID(Integer id);
}
②. 将所创建的EmployeeMapper接口和对应的方法与SQL映射文件进行动态绑定
<?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">
<!--
namespace:命名空间; 指定为接口的全类名
id:SQL语句的唯一标识; 指定为接口对应方法的名称
resultType:返回值类型
#{id}:从传递过来的参数中获取id值
-->
<mapper namespace="com.qiaobc.mybatis.dao.EmployeeMapper">
<select id="getEmployeeByID" resultType="com.qiaobc.mybatis.bean.Employee">
select id, last_name lastName, gender, email from tbl_employee where id = #{id}
</select>
</mapper>
③. 具体测试
@Test
public void test2() throws Exception {
// 1. 根据MyBatis全局配置文件,创建SqlSessionFactory实例
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 获取SqlSession实例,一个SqlSession实例对应一次数据库会话
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 3. 获取接口的实现类对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
// 将接口与SQL映射文件动态绑定后,MyBatis会为该接口自动地创建一个代理对象,代理对象来执行数据库操作
System.out.println(mapper); //org.apache.ibatis.binding.MapperProxy@46e91e2f
// 4. 调用接口的查询方法
Employee employee = mapper.getEmployeeByID(1);
System.out.println(employee);
} finally {
sqlSession.close();
}
}
④. 总结
接口式编程只需要声明接口和对应的数据库操作方法,再将接口和方法与SQL映射文件进行动态绑定即可;MyBatis会为该接口自动地创建一个代理对象,用于进行数据库的增删改查操作,而方法的具体实现可以看做是由SQL映射文件来完成的。
4. 小结
/**
* 1. 接口式编程
* 原生方式: Dao ====> DaoImpl
* MyBatis: Mapper ====> XxxMapper.xml
*
* 2. SqlSession代表与数据库的一次会话,使用完毕必须释放
* 3. SqlSession与Connection都是非线程完全的,每次使用都应该去获取新的对象
*
* 4. Mapper接口没有实现类,但将该接口与XML文件动态绑定后,MyBatis会为其自动生成一个代理对象
* EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
*
* 5. 两个重要的配置文件
* 1). MyBatis全局配置文件:包含数据库连接池、事务管理器等系统运行环境信息;
* 2). SQL映射文件:保存每一个SQL语句的映射信息,将SQL语句抽取出来
*/