知识点:
- 简介
- CRUD
- 配置文件
- 结果集映射
- 分页
- 使用注解开发
- 一对多 多对一处理
- 动态SQL——重点
- 缓存——查询效率!极其重要
环境:
- JDK1.8
- MySQL 5.7
- Maven 3.8.1
- IDEA
回顾知识点:
- JDBC
- MySQL基础
- Java基础
- Maven
- Junit
-
MyBatis 是一款优秀的持久层框架,支持自定义 SQL、存储过程以及高级映射;
-
避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程;
-
可以使用简单的XML或注解来配置和映射原生信息,将接口和Java实体类 POJO(Plain Old Java Objects,普通老式Java对象)映射成数据库中的记录;
-
MyBatis本是apache的一个开源项目iBatis,2010年迁移到google code,改名为MyBatis;
-
2013年11月迁移到Github;
-
官方文档:https://mybatis.org/mybatis-3/zh/index.html
-
Github:https://github.com/mybatis/mybatis-3/releases
-
maven仓库:
org.mybatis mybatis 3.5.7
-
持久化是将程序数据在持久状态和瞬间状态间转换的机制。
- 把数据(如内存中的对象)保存在可永久保存的存储设备中,如磁盘。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等;
- 内存:断电即失;内存太贵了。有一些对象不能丢失,因此需要持久化;
- JDBC就是一种持久化机制,文件IO也是一种持久化机制。
-
持久层:完成持久化工作的代码块。
- 完成持久化工作的代码块,即dao层(DAO,Data Access Object, 数据访问对象);
- 大多数情况下,特别是企业级应用,数据持久化往往就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系型数据库来完成;
- 对于应用系统而言,数据持久功能大多是必不可少的部分。也就是说,系统中,已经天然的具备了”持久层”概念,也许是,但也行实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是持久模块、持久单元等待,就意味着,系统框架中,应该又一个相对独立的逻辑层面,专注于数据持久化逻辑的实现;
- 与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界,即就是用来操作数据库而存在的。
- MyBatis就是帮助开发人员将数据存入数据库中、以及从数据库中取数据;
- 传统的JDBC操作,有很多重复代码块,比如:数据取出时的封装、数据库的建立连接等等,通过MyBatis框架可以减少重复代码,提高开发效率;
- MyBatis是一个半自动化的ORM框架,即Object Relationship Mapping,对象关系映射;
- 所有的事情,不用MyBatis依旧可以实现,只是用了它,所有实现会更加简单;
- MyBatis的优点:
- 简单易学。没有任何第三方依赖,最简单安装只需两个jar+配置几个sql映射文件就可以了;
- 灵活。MyBatis不会对应用程序或者数据库的现有设计强加任何影响,sql写在xml里,便于统一管理类和优化,通过sql语句可以满足操作数据库的所有需求;
- 解除sql与程序代码的耦合。通过提供DAO层,将业务逻辑和数据访问逻辑分离,使得系统的设计更清晰,更易维护,更易单元测试,提高了可维护性;
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组件维护;
- 提供xml标签,支持编写动态sql;
- 使用的人多!
12.3.1 搭建环境思路:搭建环境 --> 导入Mybatis --> 编写代码 --> 测试!
-
创建一个数据库
CREATE DATAbase `mybatis`; USE `mybatis`; DROp TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` INT(20) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'ano','123456'),(2,'top','abcdef'),(3,'trouble','987654');
-
新建一个普通maven工程,删除src,这样就可以把此工程当做父工程了,并创建子工程;
-
导入maven依赖如下:
org.mybatis mybatis 3.5.7 mysql mysql-connector-java 5.1.47 junit junit 4.12 test
-
编写MyBatis核心配置文件
resources/mybatis-config.xml
-
编写MyBatis工具类
MybatisUtils.java
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
-
实体类
pojo/User.java
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; } } -
Dao接口–>Mapper
UserMapper.java
public interface UserMapper { ListgetUserList(); } -
接口实现类
由原来的UserDaoImpl.java转换为一个Mapper配置文件,注意这里第一行中encoding = “UTF8”。
UserMapper.xml
-
使用junit测试
public class UserMapperTest { @Test public void testGetUserList() { //第1步:获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //第2步:执行sql //method1: UserMapper mapper = sqlSession.getMapper(UserMapper.class); ListuserList = mapper.getUserList(); //method2: //List userList = sqlSession.selectList("com.ano.dao.UserMapper.getUserList"); for (User user : userList) { System.out.println(user); } //第3步:关闭sqlSession sqlSession.close(); } } -
测试结果:
-
报错1:
org.apache.ibatis.binding.BindingException: Type interface com.ano.dao.UserMapper is not known to the MapperRegistry.
原因:mybatis核心配置文件中没有配置此mapper.xml
解决:每一个Mapper.xml都需要在mybatis核心配置文件mybatis-config.xml中注册!
-
报错2:
原因:maven资源导出的问题。
解决:在pom.xml中的build下,配置resources节点,以防止资源导出失败的问题
src/main/resources ***.xml src/main/java ***.xml true



