target
了解什么是MyBatis
了解Hibernate 和 MyBatis 的区别
掌握如何创建一个MyBatis程序
1. 概述

MyBatis 的前身是 Apache 的开源项目 iBatis。MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架。
MyBatis 与 JDBC 相比,减少了 50% 以上的代码量。并且满足高并发和高响应的要求,所以它成为最流行的 Java 互联网持久框架。
在移动互联网时代,MyBatis 成为了目前互联网 Java持久框架的首选。
MyBatis 本是 Apache 的一个开源项目——iBatis,2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis。
MyBatis 是一个基于 Java 的持久层框架。MyBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。
MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
目前,Java 的持久层框架产品有许多,常见的有 Hibernate 和 MyBatis。
2. Hibernate 和 MyBatis 的区别
1) sql优化方面
- Hibernate 不需要编写大量的 SQL,就可以完全映射,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)对 POJO 进行操作。但会多消耗性能。
- MyBatis 手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对大些。
2)开发方面
- MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、SQL 和映射关系。
- Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。
3)Hibernate 优势
- Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis需要维护 SQL 和结果映射。
- Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
- Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
- Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。
4)Mybatis优势
- MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
- MyBatis 容易掌握,而 Hibernate 门槛较高。
总的来说,MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。
所以对于性能要求不太苛刻的系统,比如管理系统、ERP 等推荐使用 Hibernate,而对于性能要求高、响应快、灵活的系统则推荐使用 MyBatis。
3. 下载
MyBatis 的版本可以通过”https://github.com/mybatis/mybatis-3/releases”网址下载。在下载时只需选择 mybatis-3.4.5.zip 即可。

解压后得到如图所示的目录。

图中的 mybatis-3.4.5.jar 是 MyBatis 的核心包,mybatis-3.4.5.pdf 是 MyBatis 的使用手册,lib 文件夹下的 JAR 是 MyBatis 的依赖包。
在使用 MyBatis 框架时需要将它的核心包和依赖包引入到应用程序中。如果是 Web 应用,只需将核心包和依赖包复制到 /WEB-INF/lib 目录中。
4. 第一个Mybatis程序
在创建项目之前,首先在 MySQL数据库中创建 mybatis 数据库和 user 表,sql 语句如下所示:
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` tinyint(2) AUTO_INCREMENT NOT NULL,
`uname` varchar(20) DEFAULT NULL,
`usex` varchar(10) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT into user(uname,usex) VALUES ('张晓三','男');
INSERT into user(uname,usex) VALUES ('李晓四','女');
INSERT into user(uname,usex) VALUES ('王晓五','男');
下面通过一个实例讲解如何使用 Eclipse 开发 MyBatis 入门程序,创建Web项目mybatis-01
:
1)导入 JAR 包
将 MyBatis 的核心 JAR 包、依赖 JAR 包以及 MySQL 数据库的驱动 JAR 包一起复制到 /WEB-INF/lib 目录下。
log4j-1.2.17.jar
log4j-api-2.3.jar
log4j-core-2.3.jar
mybatis-3.4.5.jar
mysql-connector-java-8.0.15.jar
2)创建日志文件
MyBatis 默认使用 log4j 输出日志信息,如果开发者需要查看控制台输出的 SQL 语句,那么需要在 classpath 路径下配置其日志文件。在 myBatis应用的 src 目录下创建 log4j.properties
文件,其内容如下:
# Global logging configuration
log4j.rootLogger=ERROR,stdout
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在日志文件中配置了全局的日志配置、MyBatis 的日志配置和控制台输出,其中 MyBatis 的日志配置用于将 com.mybatis 包下所有类的日志记录级别设置为 DEBUG。该配置文件内容不需要开发者全部手写,可以从 MyBatis 使用手册中的 Logging 小节复制,然后进行简单修改。
3)创建实体类
创建持久化类 MyUser,注意在类中声明的属性与数据表 user 的字段一致。
package com.mybatis.po;
public class User {
private Integer uid; // 主键
private String uname;
private String usex;
// 此处省略setter和getter方法
@Override
public String toString() { // 为了方便查看结果,重写了toString方法
return "User[uid=" + uid + ",uname=" + uname + ",usex=" + usex + "]";
}
}
4)创建User的映射文件
在 src 目录下创建一个名为 com.mybatis.mapper 的包,在该包中创建映射文件 UserMapper.xml。
UserMapper.xml 文件的内容如下:
select * from user where uid = #{uid}
select * from user
insert into user (uname,usex) values(#{uname},#{usex})
update user
set uname =#{uname},usex = #{usex} where uid = #{uid}
delete from user where uid = #{uid}
在上述映射文件中, 元素是配置文件的根元素,它包含了一个 namespace 属性,该属性值通常设置为“包名+SQL映射文件名”,指定了唯一的命名空间。
子元素 、
、
以及
中的信息是用于执行查询、添加、修改以及删除操作的配置。在定义的 SQL 语句中,
#{}
表示一个占位符,相当于?
,而#{uid}
表示该占位符待接收参数的名称为 uid。
5)创建User的接口
接口中的内容和映射文件有千丝万缕的联系,后面会一一说到。
package com.mybatis.mapper;
public interface UserMapper {
User selectUserById(Integer id);
List selectAllUser();
int addUserUser (User user);
int updateUser(User user);
int deleteUser(Integer id);
}
6)创建 MyBatis 的配置文件
在 src 目录下创建 MyBatis 的核心配置文件 mybatis-config.xml,在该文件中配置了数据库环境和映射文件的位置,具体内容如下:
上述映射文件和配置文件都不需要读者完全手动编写,都可以从 MyBatis 使用手册中复制,然后做简单修改。
7)创建测试类
在测试类中首先使用输入流读取配置文件,然后根据配置信息构建 SqlSessionFactory 对象。
接下来通过 SqlSessionFactory 对象创建 SqlSession 对象,并使用 SqlSession 对象的方法执行数据库操作。 MyBatisTest 测试类的代码如下:
package com.mybatis.test;
public class MyBatisTest {
SqlSession sqlSession = null;
@BeforeEach
public void before() throws IOException {
// 读取配置文件 mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
// 通过 SqlSessionFactory 创建 SqlSession
sqlSession = ssf.openSession();
}
@Test
public void test01() {
// 查询一个用户
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectUserById(1);
System.out.println(user);
}
@Test
public void test02() {
// 添加一个用户
User u2 = new User();
u2.setUname("赵晓六");
u2.setUsex("男");
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int count = userMapper.addUserUser(u2);
System.out.println("成功添加" + count + "条记录!");
}
@Test
public void test03() {
// 修改一个用户
User updateU1 = new User();
updateU1.setUid(1);
updateU1.setUname("张三");
updateU1.setUsex("女");
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int count = userMapper.updateUser(updateU1);
System.out.println("成功修改" + count + "条记录!");
}
@Test
public void test04() {
// 删除一个用户
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int count = userMapper.deleteUser(1);
System.out.println("成功删除" + count + "条记录!");
}
@Test
public void test05() {
// 查询所有用户
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List allUsers = userMapper.selectAllUser();
for (User myUser : allUsers) {
System.out.println(myUser);
}
}
@AfterEach
public void after() {
// 提交事务
sqlSession.commit();
// 关闭 SqlSession
sqlSession.close();
}
}
分别运行每个测试方法,会发现mybatis做增删改查如此简单美妙。