Mybatis知识点整理

Posted 你好啊cbw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis知识点整理相关的知识,希望对你有一定的参考价值。

目录

1、Mybatis概述

1.1 JDBC编程

 1.3 Mybatis解决的问题

2、Mybatis入门案例

2.1 创建数据库和表

2.2 创建maven项目,添加Mybatis的jar依赖

2.3 编写Mybatis的配置文件

2.4 编写实体类

 2.5 编写ORM映射文件

2.5.1 XML映射文件必须与实体类在同一个包下面

2.5.2 XML映射文件名称必须是实体类名称一致

 2.6 将映射文件注册到mybatis的配置文件中

 2.7 配置映射文件的扫描位置

2.8 使用Mybatis框架的核心接口测试

2.9. 配置日志文件

2.9.1.添加jar依赖

 2.9.2.添加日志配置文件

2.9.3.在mybatis配置文件中添加日志的配置

2.10.入门案例的增删改查

2.10.0.注意:手动提交事务

2.10.0.在测试类中使用测试注解@Before @After减少重复代码

2.10.1 根据ID查询单个对象

 2.10.2 增删改

2.10.3.查询所有

3、Mybatis对象分析

3.1 Resources

3.2 SqlSessionFactoryBuilder

3.3 SqlSessionFactory

3.4 SqlSession

3.5 Mybatis架构/工作流程

4、原有的Dao方式开发

4.1 创建sqlSession工具类

 4.2 创建TeamDao接口和实现类

 5.使用ThreadLocal优化sqlSession工具类

5.0.ThreadLocal的理解

5.1.SqlSession线程不安全处理方案

6、使用Mapper的接口编写Mybatis项目

6.1 什么是Mapper接口

6.2 使用Mapper动态代理

6.2.1 编写接口TeamMapper.java

 6.2.2 getMapper方法获取代理对象

 6.3 实现原理

 7、增删改查中的细节

7.1 插入数据的时候返回自增的id值

7.1.1.返回Integer类型的自增id值

7.1.2.返回字符串类型的自增id值

7.2 输入映射(传参到sql)

7.2.1.使用下标方式#{arg0}或#{param1}

 7.2.2.通过@Param注解传递多个传参

​7.2.4. 通过pojo类传递多个参数

7.3 #{} 和 ${}的区别--面试中喜欢出的考题

 7.3.2 ${}

7.4 输出映射resultType

7.4.0.输出pojo类型

7.4.1.输出简单类型(单行单列)可省

 7.4.2.输出map集合类型(单行多列)

 7.4.3.输出List集合类型(多行多列)

7.5. 输出映射resultMap

7.6. 数据库表中列与实体类属性不一致的处理方式

 7.6.1.使用列别名和resultType

7.6.2.使用resultMap

8、Mybatis的全局配置文件

8.1 全局配置文件配置的内容

8.2 属性(properties)

8.3 设置 settings

8.4 类型别名 typeAliases

8.4.1 Mybatis中已经支持/内置的别名

8.4.1 Mybatis中已经支持的别名

8.4.2 自定义别名

8.5 映射器 Mappers(将映射文件映射到mybatis配置文件)

8.5.1、 类路径引用映射文件

8.5.2、使用的mapper接口的完全限定名

8.5.3、将包内的映射器接口实现全部注册为映射器--推荐

8.6 dataSource标签

8.7 Mybatis如何管理事务

8.7.1、默认是需要手动提交事务的

8.7.2、自动提交事务

9、Mybatis中的关系映射

9.1 对一关系映射的处理方式(三种方式)

9.1.0.需求:查询球员信息包含所在球队信息

9.1.1 实体类

9.1.2 mapper接口

9.1.3 对一映射方式1:通过关联对象打点调用属性的方式

9.1.4 对一映射方式2:直接引用关联对象的Mapper映射

9.1.5 对一映射方式3:直接引用关联对象的单独查询的方法

9.1.6 测试

9.2 对多关系的结果映射的两种处理方式

9.2.0.查询球队信息以及拥有的球员信息 

9.2.1 方式1:连接查询+引用关联对象的结果映射

9.2.2 方式2:不使用连接查询+引用关联对象的单独查询的方法

10、Mybatis动态SQL

10.1 where标签构建动态SQL多条件查询

10.1.1.原有写法:根据不同条件拼接 SQL 语句

10.1.2.where标签构建动态SQL多条件查询

10.2 set标签构建动态sql的更新update

10.2.1 原有的更新存在的弊端

10.3 forEach标签构建动态sql的批量添加/删除

10.3.1 批量添加

10.3.2 批量删除

11 、分页插件

11.1 jar依赖

11.2 在Mybatis全局配置文件中添加插件配置

11.3 使用插件

12、Mybatis缓存

12.1 缓存作用

12.2 一级缓存:SqlSession级别的缓存,自动开启

12.2.1 一级缓存工作原理

12.2.2 清空缓存的方式

12.3 二级缓存:Mapper级别的缓存

12.3.1 使用二级缓存步骤

12.3.2 二级缓存的禁用

12.3.3 缓存的属性配置

13、反向生成插件

13.1 插件的配置

13.2 使用反向生成中的多条件查询方法


1Mybatis概述

1.1 JDBC编程

1.2.说说你对Mybatis的了解

1.Mybatis 基于java的持久层框架,它的内部封装了JDBC,让开发人员只需要关注SQL语句本身,不需要花费精力在驱动的加载、连接的创建、Statement的创建等复杂的过程。

2.Mybatis 通过 XML 或注解的方式将要执行的各种的 statement 配置起来,并通过 java 对象和 statement 中的 sql 的动态参数进行映射生成最终执行的SQL 语句,最后 由mybatis框架执行SQL,并将结果直接映射为java对象
3.采用了 ORM思想 解决了实体类和数据库表映射的问题。对 JDBC进行了封装 ,屏蔽了 JDBCAPI 底层的访问细节,避免我们与 jdbc api 打交道,就能完成对数据的持久化操作。

 1.3 Mybatis解决的问题

1、数据库连接的创建、释放连接的频繁操作造成资源的浪费从而影响系统的性能。

2SQL语句编写在代码中,硬编码造成代码不容易维护,实际应用中SQL语句变化的可能性比较大,一旦变动就需要改变java类。

3、使用preparedStatement的时候传递参数使用占位符,也存在硬编码,因为SQL语句变化,必须修改源码。

4、对结果集的解析中也存在硬编码。

2Mybatis入门案例

2.1 创建数据库和表

CREATE TABLE `team` (
     `teamId` int NOT NULL AUTO_INCREMENT COMMENT '球队ID',
     `teamName` varchar(50) DEFAULT NULL COMMENT '球队名称', 
     `location` varchar(50) DEFAULT NULL COMMENT '球队位置', 
     `createTime` date DEFAULT NULL COMMENT '球队建立时间', 
      PRIMARY KEY (`teamId`) 
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2.2 创建maven项目,添加Mybatisjar依赖

创建个java的maven项目

2.3 编写Mybatis的配置文件

一般情况下:配置文件的名称可以自定义,使用mybatis.xml。配置文件放置在java/resources中。

头文件去官网中复制粘贴。提供一个中文的网站。Mybatis网址

配置文件中配置mybatis的环境(数据源、事务类型)

2.4 编写实体类

实体类中的属性必须与表中的列名保持一致,默认构造+set+get(不能少)

 2.5 编写ORM映射文件

我们是针对实体类Team.java和表Team进行ORM映射.

Mybatis 框架中, ORM 映射是针对 SQL 语句进行, Mybatis 框架将 SQL 语句抽取到了 XML 中。所以我们需要针对每个实体类编写 XML 映射文件。

2.5.1 XML映射文件必须与实体类在同一个包下面

2.5.2 XML映射文件名称必须是实体类名称一致

头文件在网站复制即可。Mybatis网址

注意namespace、id、resultType分别表示什么。

 2.6 将映射文件注册到mybatis的配置文件中

 2.7 配置映射文件的扫描位置

pom.xml 文件配置映射文件的扫描路径
因为src/main/java目录下的配置完文件(.xml/.properties)是无法读取到,需要在pom.xml中去指定配置文件的扫描路径

 

2.8 使用Mybatis框架的核心接口测试

 

2.9. 配置日志文件

2.9.1.添加jar依赖

 2.9.2.添加日志配置文件

resource 下添加 log4j.properties 配置文件

# Global logging configuration info warning error 
log4j.rootLogger=DEBUG,stdout 
# Console output... 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

2.9.3.在mybatis配置文件中添加日志的配置

2.10.入门案例的增删改查

2.10.0.注意:手动提交事务

增删改操作,必须手动提交事务,否则不生效

因为上面在mybatis配置中,指定了JDBC方式(Connection)管理事务,默认自动提交是false,

解决1.每执行一次增删改sql,我们手动提交sqlSession.commit()

解决2.在获取sqlSession会话时,开启自动事务,参数true,即factory.openSession(true)

这只是在dao层操作事务,不推荐,将来事务都是在service层通过声明式事务管理

实体类

2.10.0.在测试类中使用测试注解@Before @After减少重复代码

2.10.1 根据ID查询单个对象

parameterType:参数类型,sql中占位符类型,该属性基本类型时可省略,实体类型则不可省略

resultType:返回类型,执行这条sql后返回什么类型的结果,基本类型可省略不写,若集合则其元素类型-->

报错原因:实体类没有加默认构造方法

 Team.xml的映射文件中添加:

 测试类中添加如下内容:

 2.10.2 增删改

Team.xml 的映射文件中添加:
测试类中添加如下方法:

2.10.3.查询所有

映射文件添加

 测试类添加

3Mybatis对象分析

3.1 Resources

Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。

3.2 SqlSessionFactoryBuilder

SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。 事实上使用 SqlSessionFactoryBuilder 的原因是将SqlSessionFactory 这个复杂对象的创建交由 Builder 来执行,也就是使用了 建造者设计模式

建造者模式 : 又称生成器模式 , 是一种 对象的创建模式 。 可以将一个产品的内部表象与产品的生成过程分割开来 , 从而可以使一个建造过程生成具有不同的内部表象的产品( 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示 ). 这样用户只需指定需要建造的类型就可以得到具体产品, 而不需要了解具体的建造过程和细节 .
在建造者模式中, 角色分指导者 (Director) 与建造者 (Builder): 用户联系指导者 , 指导者指挥建造者 , 最后得到产品 . 建造者模式可以强制实行一种分步骤进行的建造过程.

SqlSessionFactoryBuilder 充当的就是建造者角色 ,sqlSession就是我们最后得到的产品。

3.3 SqlSessionFactory

SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是 线程安全 的,所以一个应用只需要一个该对象。创建SqlSession 需  SqlSessionFactory 接口的 openSession() 方法。

默认的 openSession()方法没有参数,它会创建有如下特性的 SqlSession
1 、会开启一个手动提交的事务(也就是不自动提交)。
2 、将从由当前环境配置的 DataSource 实例中获取 Connection 对象。事务隔离级别将会使用驱动或数据源的默认设置。
3 、预处理语句不会被复用,也不会批量处理更新。

openSession(true) :创建一个有自动提交功能的 SqlSession
openSession(false) :创建一个非自动提交功能的 SqlSession ,需手动提交
openSession() :同 openSession(false)

3.4 SqlSession

SqlSession 接口对象用于执行持久化操作(内存数据写入数据库)。一个 SqlSession 对应着一次数据库会话,一次会话以 SqlSession 对象的创建开始,以SqlSession 对象的关闭结束。

SqlSession 接口对象是 线程不安全 的,所以每次数据库会话结束前,需要马上调用其 close() 方法,将其关闭。再次需要会话,再次创建。 SqlSession 在方法内部创建,使用完毕后关闭。

SqlSession 类中有超过 20 个方法,我们常用的几乎都是执行语法相关的方法。

这些方法被用来执行定义在 SQL 映射的 XML 文件中的 SELECT INSERT UPDATE DELETE 语句。它们都会自行解释,每一句都使用语句的 ID 属性和参数对象,参数可以是原生类型(自动装箱或包装类)、 JavaBean POJO Map

 selectOne 和 selectList 的不同仅仅是 selectOne 必须返回一个对象或 null 值。如果返回值多于一个,那么就会抛出异常。

selectMap 稍微特殊一点,因为它会将返回的对象的其中一个属性作为 key 值,将对象作为 value 值,从而将多结果集转为 Map 类型值。

3.5 Mybatis架构/工作流程

1 Mybatis.xml 文件是 mybatis 框架的全局配置文件,配置了 mybatis 框架运行的环境等信息。
Mapper1.xml..... SQL 的映射文件,文件中配置了所有的操作数据库的 sql 语句, 在mybatis全局配置文件中去加载这些sql映射文件
2 通过mybatis环境等配置信息构建SqlSessionFactroy , 相当于是产生连接池
3 由会话工厂创建SqlSession即会话 (连接),操作数据库需要通过 SqlSession 进行的。
4 Mybatis 底层自定义了 Executor执行器 的接口操作数据库, Executor 接口有两个实现,一个基本的执行器,一个是缓存的执行器。
5 Mapped statement 也是 mybatis 框架一个底层的封装对象,他包装了 mybatis 配置信息以及 sql 映射信息。 Mapper.xml文件中的一个SQL语句对应一个Mapped statement对象 sql id 就是 Mapped statement id