MyBatis
ORM 框架
概念:ORM(Object Relational Mapping)对象关系映射,通过使用描述对象和关系型数据库之间映射的元数据,将面对对象语言的对象自动的持久化到数据库中
元数据:用来描述数据的数据,通常指的是描述代码之间关系的数据,在 Java 中,元数据以标签的形式储存于 xml 配置文件中
简单的说:ORM 的作用就是通过配置 xml 资源文件或者自动化配置 SQL 语句,然后方便的通过直接对 java 对象的方法调用或者数据调用等方式,将数据储存到数据库中
常用的 ORM 框架有:MyBatis和Hibernate
ORM 框架的优缺点
优点:(1)大大降低了对于数据库操作的复杂性,不用自己手写许多 SQL
(2)减少重复代码,将可共同重复使用的代码共享使用
(3)可移植
缺点:(1)自动化的关系型数据库映射消耗更多性能
MyBatis(半自动化的 ORM 框架)
通过 xml 文件或者注解配置映射关系,将 java 对象作为 SQL 语句所需的参数传入,经过 SQL 语句对数据库的操作后返回的数据也是映射到指定的 java 对象中
MyBatis 工作原理
-
读取 MyBatis 配置文件(mybatis-config.xml 也就是 MyBatis 的全局配置文件):进行 MyBatis 的环境配置:例如数据库的连接信息
-
扫描指定包中的 @Mapper 注解的接口,生成代理类并且加载 xml 配置文件,这些接口和对应的 xml 文件就组成了 SQL Mapper(映射器),建立起接口和 xml 文件的映射关系
映射的内容包括:
(1)xml 文件的 namespace 映射成具体的接口路径
<mapper namespace="frank.mapper.ArticleMapper" >
(2)接口中的方法映射成 xml 文件中 sql 语句的 id ,通过 parameterType 映射对应的传入参数
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
(3)resultMap 映射 sql 语句执行的结果集和 java 普通对象等数据结构
-
生成 SqlSessionFactory ,也就是一个数据库会话工厂
-
接着通过 SqlSessionFactory 数据库会话工厂创建出 SqlSession 数据库会话,这其中就包含好了执行 SQL 语句的所有方法
-
MyBatis 底层有一个 Executor 接口,通过这个接口来操作数据库,通过传入了 java 对象数据执行 sql 语句,其中 Executor 接口中涉及到一个 MapperStatement 的对象,每一个 mapper.xml 文中的方法节点(例如:select,delete)都会生成一个对应的 MapperStatement,里面就包括了该 SQL 语句的内容
-
输入参数映射,类似于 JDBC 中 preparedStatement 中替换参数的过程,输入的参数可以是 Map,List 这些集合类型,也可以是基本数据类型和 POJO 类型(普通 java 对象)
-
输出结果映射,将 sql 语句操作后的结果映射成基本数据、集合类型或者普通 Java 对象
MyBatis 的核心组件
(1) SqlSessionFactoryBuilder(构造器):根据配置或者代码生成 SqlSessionFactory
(2)SqlSessionFactory(工厂接口):通过工厂方法构建 SqlSession
(3)SqlSession(会话):通过 SqlSession 直接执行 SQL 语句返回结果,或者先获取到 Mapper 接口再执行 SQL 语句返回结果,一般采取后一种方式,也叫做 SQL Mapper 接口编程技术,提高代码的可维护性和可读性
(4)SQL Mapper(映射器):由 java 接口和 xml 文件组成,需要设置好映射的相关内容,SQL Mappper 主要负责发送 SQL 语句并且返回结果
注意:可以通过 SqlSession 直接发送 SQL 语句也可以通过 SQL Mapper 映射器 发送 SQL 语句
SqlSessionFactory
在 MyBatis 中有两个实现类,SqlSessionManager 和 DefaultSqlSessionFactory,一般而言,具体是由 DefaultSqlSessionFactory 去实现的,而 SqlSessionManager 使用在多线程的环境中,它的具体实现依靠 DefaultSqlSessionFactory
SqlSessionFactory 生成的两种方式
(1)第一种方式:读取 XML 文件内容配置生成 SqlSessionFactory
(2)第二种方式:通过自己手写的 java 代码来生成 SqlSessionFactory
两者的比较:通过 xml 文件配置的方式生成 SqlSessionFactory 便于然后的维护和修改,还能避免重写编译代码,而自己手写的 SqlSessionFactory 代码冗,发生修改还需要重写编译代码,一般只会在要自己实现对于数据库用户名和密码的加密操作或者解析时使用自己手写方式
SQL Maper 映射器
映射器是 MyBatis 中最重要、最复杂的组件,它由一个接口和对应的 XML 文件(或注解)组成,配置内容:
(1)描述映射规则。
(2)提供 SQL 语句,并可以配置 SQL 参数类型、返回类型、缓存刷新等信息。
(3)配置缓存。
(4)提供动态 SQL。
映射器的两种实现方式:
通过 XML 文件或者注解加上接口实现,注解的方式也和 XML 文件差不多,一般使用 XML 文件 + 接口实现,这样代码可读性更高,更便于日后的维护工作
注解方式实现映射器如下:
public interface RoleMapper2 {
@Select("select id,role_name as roleName,note from t_role where id=#{id}")
public Role getRole(Long id);
}
SqlSession
在 MyBatis 中有两个实现类,DefaultSqlSession 和 SqlSessionManager,DefaultSqlSession 是单线程使用的,而 SqlSessionManager 在多线程环境下使用
SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。它的作用有 3 个:
(1)获取 Mapper 接口
(2)发送 SQL 给数据库
(3)控制数据库事务
本文地址:https://blog.csdn.net/qq_45239139/article/details/107332336