MyBatis学习一
参考:唐浩荣(Mybatis3详解(一)----Mybatis的介绍)
什么是Mybatis
MyBatis是一个持久层(将数据存到数据库中的)框架,能够自定义SQL语句,存储过程(一系列可以完成某个功能的SQL语句存储到数据库中),高级映射(一对一,一对多,多对多)。
基本概念
Mybatis是一个基于持久层和ORM的框架,所以得了解持久层和ORM
持久化
持久化是将数据(比如内存中的对象)保存到可永久保存的设备中(如硬盘,但主要是保存到数据库中)。
持久层
持久层就是系统中专注于实现将数据持久化保存的相对独立的层面
ORM-对象关系映射
object-relational mapping对象关系映射
对象关系映射用于实现关系数据库中表和面向对象编程语言中对象的相互转化
就是表和对象的相互转化
映射关系
类 | 表 |
---|---|
对象 | 记录(行) |
属性 | 字段(列) |
即一个类对应表,一个对象对应一行,一个属性对应一列
然后将关系数据库中的表映射成对象,这样对数据库的操作就可以转变成对表的操作
使用Mybatis的原因
Mybatis和JDBC相比的优势
- Mybatis连接数据库的信息写在配置文件中,方便后期维护
- Mybatis的SQL语句也是写在配置文件进行配置,不写在java语句中
- Mybatis的连接池管理和缓存管理提高了数据库连接和查询的效率
Mybatis的执行流程
参考: AI课工场–MyBatis的执行流程详解
全菜工程师小辉–彻底搞懂JDBC的运行过程
回顾jdbc
jdbc–Java database connection java数据库连接
,使用jdbc来操作关系型数据库
- 导入包
import java.sql.*;
- 加载jdbc驱动
Class.forName(JDBC_DRIVER);
- 获取Connection连接
创建一个Connection对象通过调用DriverManager.getConnection()
方法
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
- 执行一个查询
需要一个Statement对象,通过conn.createStatement()
方法创建该对象,然后提交一个sql语句到数据库进行查询
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);//提交了一个sql语句到数据库进行查询,结果放在ResultSet类对象中
- 从结果集中提取数据
while (rs.next()) {
// 根据列名获取数据
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
// 显示结果
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last)
- 释放资源
MyBatis执行流程
- 读取MyBatis的全局配置文件mybatis-config.xml
mybatis-config.xml用于配置数据库连接,属性,类型别名,类型处理器,插件,环境配置,映射器(mapper.xml)等信息。
随后该全局配置文件加载映射文件(mapper.xml)
- 构造会话工厂SqlSessionFactory
Mybatis通过读取配置文件的信息构造会话工厂
SqlSessionFactory builder = new SqlSessionFactoryBuilder().build(inputStream);
- 创建会话对象SqlSession
根据会话工厂,mybatis口头语通过它创建会话对象,会话对象是一个接口
SqlSession sqlSession = builder.openSession();
插入内容
SqlSession相当于jdbc中的Connection对象,可以用SqlSession的实例获取相对应的Mapper
Executor执行器,Mybatis中所有的Mapper语句的执行都是通过Excutor执行的。
Mapper 由mapper.xml文件和mapper.java接口组成
mapper.xml中有MappedStatement对象
<select id="selectUserList" resultType="com.mybatis.User"> //id是对于的mapper中的方法名相同,resultType是输出结果的类型
select * from t_user
</select>
MappedStatement对象封装了Statement的相关信息,包括SQL语句,输入参数和输出结果等
mapper.java接口中有方法,方法名就是MappedStatement对象的id的值,相当于调用该MappedStatement对象(不一定对啊)
Executor执行器,MyBatis的核心,所有Mapper语句的执行都是通过Executor执行的(Mapper由xml文件和java文件构成)
回到正题
- 创建执行器
因为会话对象不能直接操作数据库,所以它使用了一个数据库执行器(Executor)的接口来执行操作,sqlSession创建执行器,获取对应的mapper
UserMapper mapper1 = sqlSession.getMapper(Mapper.class);
- 执行语句
(之前创建了mapper.xml,mapper.java接口),用执行器(mapper1)调用mapper.java中的方法,找到和该方法名相同的id的MappedStatement对象,用它们访问数据库,并返回操作结果(MappedStatement对象中设置有返回的操作结果的类型)
List<User> users = mapper1.selectUserList();
- 释放资源
sqlSession.close();
inputStream.close();