MyBatis
学习本模块可见手册 MyBatis参考文档
1、框架概述
框架是一个半成品,已经对基础的代码进行了封装并提供相应的 API ,开发者在使用框架时直接调用封装好的 API 可以省去很多代码编写,从而提高工作效率和开发速度
框架是一种经过校验、具有一定功能 的半成品软件.
经过校验: 指框架本身经过测试,且框架自身所具有的功能已经实现
具有一定功能: 指框架可以完成特定的功能,不同的框架功能不同
半成品软件: 指框架自身是一个软件,但是该软件无法直接运行,需要配合其他的程序才可以完成指定的工作
框架的工作模式:
开发工程师建立在框架的基础之上完成开发部分功能 加 框架自身完成部分功能组成一个完整的产品
例子: 小店卖早餐
1 自给自足
2 进货(框架) 卖
2、MyBatis 基础
2.1、MyBatis的概述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和 映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
mybatis框架架构图:
我们把Mybatis的功能架构分为三层:
- API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收 到调用请求就会调用数据处理层来完成具体的数据处理。
- 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
- 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是 共用的东西,将他们抽取出来作为最基础的组件,为上层的数据处理层提供最基础的支撑
2.2、环境准备
需求: 向用户表中添加一条数据
-
添加项目需要的 jar 包
- lombok-1.16.6.jar
Lombok可以自动生成 getter/setter/toString 等方法
使用的前提是已经在 idea 中安装了 lombok 插件 -
mysql-connector-java-5.1.7-bin.jar
MySQL 数据库的 JDBC 驱动包,访问 MySQL 必须导入备 jar 包 -
mybatis-3.4.5.jar
MyBatis 框架的核心 jar 包
- lombok-1.16.6.jar
-
创建一张用户表:user
CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(255) DEFAULT NULL, `salary` decimal(10,0) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-
根据表结构创建实体类
@Getter@Setter@ToString @NoArgsConstructor@AllArgsConstructor public class User { private Long id; private String name; private Integer age; private BigDecimal salary; }
-
mybatis主配置文件: mybatis-config.xml
-
在项目的resources(source folder)下创建 mybatis-config.xml 配置文件
-
拷贝 xml 的约束(从mybatis的参考手册里面)
<?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>
标签
配置数据源时候可以使用外置文件引入,需要先引入文件 druid.properties -
mapper 映射文件: UserMapper.xml
mybatis中,访问数据库的SQL语句是编写在mapper配置文件中的,程序员按照这个文件约定的格式进行配置即可
一个项目可以操作多张表,每张表都需要一个mapper配置文件来编写SQL语句
在包 cn.mybatis.mapper 中创建配置文件: UserMapper.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">
在配置文件中添加 SQL 语句
-
insert into user(name,age,salary,hiredate)
values(#{name}, #{age}, #{salary}, #{hiredate})
每条SQL语句都需要有一个唯一的标识
这个唯一的标识由 namespace + sqlid 组成 使用下面的namespace+sqlid就得到了保存用户信息的唯一标识: cn.wolfcode.mybatis.mapper.UserMapper.insert 接下来,我们就可以使用上面的标识找到这条SQL语句了
注意: 一定记得在 mybatis-config.xml 配置文件中关联映射文件
名
POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别
–>
叩丁狼教育
2.3_DAO层开发 1. dao接口
在 cn.wolfcode.mybatis.dao 包中创建 dao 接口: IUserDAO.java
package cn.wolfcode.mybatis.dao;
import cn.wolfcode.mybatis.domain.User;
public interface IUserDAO {
/**
- 向user表中插入一条数据 * @param u 要插入的数据 */
void insert(User u);
}
- dao 接口实现类
在 cn.wolfcode.mybatis.dao.impl 包中创建 dao 的实现类: UserDAOImpl.java
按以下 API 实现数据的保存操作: - SqlSessionFactory : 对连接池(DataSource)的封装
SqlSession openSession() : 获取SqlSession对象 2. SqlSession,对连接(Connection)的封装
int insert(String statementid, Object param);
statementid: 有mapper配置文件中的namespace+sqlid组成
void commit(): 提交事务
void close() : 释放资源 - 调用 SqlSession 中的 insert 方法,执行指定的 SQL
public class UserDAOImpl implements IUserDAO {
public void insert(User u) {
try {
InputStream in = Resources.getResourceAsStream(“mybatis-
config.xml”);
SqlSessionFactory fac = new
SqlSessionFactoryBuilder().build(in);
SqlSession session = fac.openSession();
叩丁狼教育
- 在测试类中测试 insert 方法
public class UserDAOTest {
private IUserDAO dao = new UserDAOImpl();
@Test
public void testInsert() {
User u = new User(null,“张三”,20,new BigDecimal(20000), new Date());
dao.insert(u); }
}
2.4_MyBatis 执行流程(理解) - 加载主配置文件(mybatis-config.xml)到内存中,将数据封装成对象
Configuration/Environment/TransactionManager/DataSource等 - 通过操作拿到访问数据库的基本信息,根据这些数据创建SqlSessionFactory对象
- 从SqlSessionFactory对象中获取到 SqlSession 对象,然后执行执行的 SQL
- INSERT INTO user(name,age,salary,hiredate) VALUES(#{name},#{age},#{salary},#{hiredate})
被翻译成
INSERT INTO user(name,age,salary,hiredate) VALUES(?, ?, ?, ?) - 使用PreparedStatement来执行指定的SQL
从传递进来的 Use r对象中依次获取到 name/age/salary/hiredate这些属性的值 这里需要使用到内省机制来访问对象中的属性
注:
在加载完当前映射文件之后,会将SQL中的#{} OGNL表达式翻译成对应的占位符?,
执行上面的SQL,需要将数据设置给当前的语句对象 ps.setObect(1, 从参数中获取到name属性的值); ps.setObect(2, 从参数中获取到age属性的值); ps.setObect(3, 从参数中获取到salary属性的值); ps.setObect(4, 从参数中获取到hiredate属性的值);
操作步骤回顾:
u);
} }
session.insert(“cn.wolfcode.mybatis.mapper.UserMapper.insert”,
session.commit();
session.close();
} catch (Exception e) {
e.printStackTrace(); }