Mybatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代码,并提供了一个简单易用的 API 和数据库交互。
MyBatis 的前身是 iBATIS,iBATIS 于 2002 年由 Clinton Begin 创建。MyBatis3 是 IBATIS 的全新设计,支持注解和 Mapper。
MyBatis 流行的主要原因在于它的简单性和易使用性。在 Java 应用程序中,数据持久化层涉及到的工作有:将从数据库查询到的数据生成所需要的 Java 对象;将 Java 对象中的数据通过 SQL 持久化到数据库中。
MyBatis 通过抽象底层的 JDBC 代码,自动化 SQL 结果集产生 Java 对象、Java 对象的数据持久化数据库中的过程使得对 SQL 的使用变得容易。
当前有很多 Java 实现的持久化框架,而 MyBatis 流行起来的有以下原因:
- 它消除了大量的 JDBC 冗余代码
- 它有低的学习曲线
- 它能很好地与传统数据库协同工作
- 它可以接受 SQL 语句
- 它提供了与 Spring 框架的集成支持
- 它提供了与第三方缓存类库的集成支持
- 它拥有更好的性能
- 使用 MyBatis 开发一个简单的 Java 项目步骤:
- 新建表 STUDENTS,插入样本数据
- 新建一个 Java 项目,讲 MyBatis-3.3.0.jar 添加到 classpath 中
- 新建 MyBatisSqlSessionFactory 单例模式类
- 新建映射器 StudentMapper 接口和 StudentService 类
- 新建一个 JUnit 测试类来测试 StudentService
CREATE TABLE STUDENTS(
stud_id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
email varchar(50) NOT NULL,
dob date DEFAULT NULL,
PRIMARY KEY(stud_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
/* Sample Data for the students table */
insert into students(stud_id,name,email,dob) values (1,'Student1','[email protected]','1990-5-20');
insert into students(stud_id,name,email,dob) values (2,'Student2','[email protected]','1992-10-12');
- 下载 MyBatis 的包: https://github.com/mybatis/mybatis-3/releases;
- 创建 Java 工程,把 MyBatis-3.3.0.jar 以及它的可选的依赖包如 slf4j/log4j 日志 jar 包添加到工程的 lib 目录;
- 将 junit-4.11.jar 和 mysql-connector-java-5.1.22.jar 添加到 classpath 中;
- 新建 log4j.properties 文件,添加到 classpath 中
创建 MyBatis 的主要配置文件 mybatis-config.xml,其中包括数据库连接信息,类型别名等,然后将其加到 classpath 中;
创建 SQL 映射器 XML 配置文件 StudentMapper.xml 并且将它放在 xx.mybatis3.domain.mappers 包中:
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(#{studId},#{name},#{email},#{dob})
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisSqlSessionFactory {
private static final String resource = "mybatis3-config.xml";
private static SqlSessionFactory sqlSessionFactory;
private static InputStream inputStream;
static{
try{
inputStream = Resources.getResourceAsStream(resource);
}catch (IOException e) {
e.printStackTrace();
}
}
private MyBatisSqlSessionFactory(){}
public static synchronized SqlSessionFactory getInstance() {
if (null == sqlSessionFactory) {
// 1.创建会话工厂,传入 mybatis3 的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
return sqlSessionFactory;
}
}
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import xx.mybatis3.domain.Student;
import xx.mybatis3.factory.MyBatisSqlSessionFactory;
public class StudentService {
@Test
public void findAllStudents(){
String resource = "mybatis3-config.xml";
SqlSession sqlSession = null;
try{
SqlSessionFactory sqlSessionFactory =MyBatisSqlSessionFactory.getInstance();
// 2.通过工厂得到 SqlSession
sqlSession = sqlSessionFactory.openSession();
// 3.通过 sqlSession 操作数据库
List studentList = sqlSession.selectList("findAllStudents");
System.out.println(studentList);
}finally {
if(sqlSession !=null) {
sqlSession.close();
}
}
}
}