环境:
jdk1.8MySql 5.7Maven 3.6.1IDEA
回顾:
JDBCMySqlJava基础MavenJunit
框架:SSM学习通过查询官方文档
mybatis官方文档:mybatis – MyBatis 3 | 入门
1. 简介 1.1 什么是MyBatisMyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis。2013年11月迁移到Github。
如何获取MyBatis
maven仓库:
org.mybatis mybatis 3.5.9
GitHub
中文文档:mybatis – MyBatis 3 | 简介
1.2 持久化数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失数据库:(JDBC)io文件持久化生活:冷藏
为什么需要持久化
有些对象,不能让他丢失内存价格归 1.3 持久层
Dao层,Service层,Controller层
完成持久化工作的代码块层界限十分明显 1.4 为什么需要MyBatis
帮助程序员将数据存入数据库中方便传统的JDBC代码复杂,简化,自动化更容易上手优点:
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。提供映射标签,支持对象与数据库的orm字段关系映射。提供对象关系映射标签,支持对象关系组建维护。提供xml标签,支持编写动态sql。
重点 使用人多
1.5 MyBatis详细执行过程- Resources获取加载全局配置文件实例化SqlSessionFactoryBuilder构造器解析配置文件流xml ConfigBuilderConfiguration所有的配置信息SQL SessionFactory实例化transactional事务管理创建executor执行器创建SQL Session实现CRUD查看CRUD是否执行成功,不成功返回transactional事务管理重来提交事务关闭
思路:搭建环境->导入Mybatis->编写代码->测试!
2.1 搭建环境
数据库创建
CREATE TABLE user( id INT(20) not NULL PRIMARY KEY, name VARCHAr(30) DEFAULT(NULL), PASSWORD VARCHAr(30) DEFAULT NULL )ENGINE=INNODB; INSERT INTO USER(id,NAME,PASSWORD)VALUES (1,'缘昔','123456'), (2,'小红','456789'), (3,'小粉','147258')
新建项目
新建Maven项目
删除src
导入依赖
mysql mysql-connector-java 8.0.28 org.mybatis mybatis 3.5.9 junit junit 4.13.2 test
编写MyBatis核心文件
编写MyBatis工具类
//获取SqlSessionFactory对象,构建SqlSession
public class MyBatisUtils {
//提升作用域,注意将sqlSessionFactory提升为全局变量以后下文对应变量的定义
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用MyBatis第一步:获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例
//SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
//可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
2.3 编写代码
实体类
//实体类
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
", pwd='" + pwd + ''' +
'}';
}
}
Dao接口
public interface UserDao {
List getUserList();
}
接口实现类(由原来JDBC中的UserDaoImpl转换成一个mapper配置文件)
select * from mybatis.user
2.4 测试
注意:
org.apache.ibatis.binding.BindingException:Type interface com.Yurrize.dao.UserDao is not known to the MapperRegistry.
MapperRegistry是什么?
核心配置文件中注册mappers
解决办法:
注意:
java.lang.ExceptionInInitializerError 资源过滤问题,无法找到xml文件,由于Maven约定大于配置,我们之后可能遇到我们写的配置文件,无法导出或者生效的问题!
解决办法:
src/main/resources ***.xml false src/main/java ***.xml false
junit测试
@Test
public void test(){
//第一步:获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//执行SQL语句
//方式一:getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}
}
测试中可能遇到的问题:
- 配置文件没有注册绑定接口错误 .xml文件中检测接口绑定路径方法名打错 .xml文件中检测返回类型不对 .xml文件中检测Maven导出资源问题,过滤问题



