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编程

Mybatis知识点整理_第1张图片

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项目

Mybatis知识点整理_第2张图片

2.3 编写Mybatis的配置文件

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

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

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

Mybatis知识点整理_第3张图片

2.4 编写实体类

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

Mybatis知识点整理_第4张图片

Mybatis知识点整理_第5张图片

 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分别表示什么。

Mybatis知识点整理_第6张图片

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

Mybatis知识点整理_第7张图片

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

pom.xml 文件配置映射文件的扫描路径
因为src/main/java目录下的配置完文件(.xml/.properties)是无法读取到,需要在pom.xml中去指定配置文件的扫描路径
Mybatis知识点整理_第8张图片

 Mybatis知识点整理_第9张图片

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

Mybatis知识点整理_第10张图片

 

2.9. 配置日志文件

2.9.1.添加jar依赖

Mybatis知识点整理_第11张图片

 2.9.2.添加日志配置文件

resource 下添加 log4j.properties 配置文件
Mybatis知识点整理_第12张图片

Mybatis知识点整理_第13张图片

# 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配置文件中添加日志的配置

Mybatis知识点整理_第14张图片

2.10.入门案例的增删改查

2.10.0.注意:手动提交事务

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

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

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

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

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

实体类

Mybatis知识点整理_第15张图片

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

2.10.1 根据ID查询单个对象

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

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

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

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

Mybatis知识点整理_第16张图片

 测试类中添加如下内容:

Mybatis知识点整理_第17张图片

 2.10.2 增删改

Team.xml 的映射文件中添加:
Mybatis知识点整理_第18张图片
测试类中添加如下方法:

Mybatis知识点整理_第19张图片

2.10.3.查询所有

映射文件添加

 测试类添加Mybatis知识点整理_第20张图片

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

Mybatis知识点整理_第21张图片

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

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

3.5 Mybatis架构/工作流程

Mybatis知识点整理_第22张图片

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
6 Mapped statement SQL 执行输入参数的定义,输入参数包括 HashMap 、基本类型、 pojo, Executor通过Mapped statemen在执行SQL语句前进行输入映射即将输入java对象映射到sql语句中,执行完毕SQL之后,输出映射就是JDBC编码中的对preparedStatement 执行结果的定义。

4、原有的Dao方式开发

4.1 创建sqlSession工具类

Mybatis知识点整理_第23张图片

 4.2 创建TeamDao接口和实现类

 Mybatis知识点整理_第24张图片

 测试:

 

 sql映射文件Team.xml

Mybatis知识点整理_第25张图片

 结果

Mybatis知识点整理_第26张图片

 5.使用ThreadLocal优化sqlSession工具类

5.0.ThreadLocal的理解

ThreadLocal 并非是一个线程的本地实现版本,它并不是一个 Thread ,而是 threadlocalvariable( 线程局部变量 ) 。也许把它命名为 ThreadLocalVar更加合适。 线程局部变量 (ThreadLocal) 其实的功用非常简单,就是这个变量 为每一个使用该变量的线程都提供一个变量值的副本 , 是Java 中一种较为特殊的 线程绑定机制 ,是 每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突 A线程改变,不会影响B线程
实例:
Mybatis知识点整理_第27张图片

 Mybatis知识点整理_第28张图片

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

保证多个线程使用的sqlSession是相互独立的,没有关联,若A、B使用同一个sqlSession,若A使用完close关闭sqlSession,那么B就无法执行了。可以给每一个线程绑定一个副本的sqlSession,这就需要使用ThreadLocal。

优化后的工具类

Mybatis知识点整理_第29张图片

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

6.1 什么是Mapper接口

Mybatis知识点整理_第30张图片

在前面例子中自定义 Dao 接口实现类时发现一个问题: Dao 的实现类其实并没有干什么实质性的工作,它仅仅就是通过 SqlSession 的相关API 定位到映射文件 mapper 中相应 id SQL 语句,真正对 DB 进行操作的工作其实是由框架通过 mapper 中的 SQL 完成的。
所以, MyBatis 框架就抛开了 Dao 的实现类,直接定位到映射文件 mapper 中的相应 SQL 语句,对DB 进行操作。这种对 Dao 的实现方式称为 Mapper接口 的动态代理方式。
就是我们不再需要编写dao接口的实现类,直接由mapper接口的动态代理,在程序运行的时候代理我们实现接口实现类,最终由mybatis操作db。
Mapper 动态代理方式无需程序员实现 Dao 接口。 接口是由 MyBatis 结合映射文件自动生成的动态代理实现的。

6.2 使用Mapper动态代理

注意,通过Mapper接口 的动态代理帮我们生成了接口实现类,接口的方法要与映射文件中的对应的id名称一致,否则无法定位到指定的sql。

6.2.1 编写接口TeamMapper.java

创建TeamMapper.xml文件 , Team.xml 内容几乎一样,只有 namespace="com.chen.mapper.TeamMapper" 修改为接口的完全限定名

 Mybatis知识点整理_第31张图片

 mybatis.xml配置文件中注册映射文件

 6.2.2 getMapper方法获取代理对象

只需调用 SqlSession getMapper()方法,即可获取指定接口的实现类对象。

Mybatis知识点整理_第32张图片

 6.3 实现原理

Mapper接口的动态代理是如何在程序运行期间帮我们创建接口的实现类对象的?

我们是通过SqlSession 的 getMapper()方法获取到了接口的实现类对象,该方法是基于jdk的动态代理在程序运行的时候代理我们创建接口对象,就是通过Proxy.newProxyInstance()方法进行的动态代理,第一参数传递类加载,第二个参数传递接口类集合,第三个参数回调程序编写代理规则,在这里代理生成接口实现类。

Mybatis知识点整理_第33张图片

 Mybatis知识点整理_第34张图片

 7、增删改查中的细节

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

即我们将一个对象插入数据库中时,是不提供主键id的值得,id自增自动赋值,那么现在希望插入数据后返回这条数据的id值?

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

Team实体类

Mybatis知识点整理_第35张图片

 TeamMapper接口(只是用add)

Mybatis知识点整理_第36张图片

TeamMapper.xml映射文件(只看add)

Mybatis知识点整理_第37张图片

 注册TeamMapper.xml映射文件到mybatis配置文件

 测试

Mybatis知识点整理_第38张图片

 Mybatis知识点整理_第39张图片

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

添加一张新表:球队记录表

CREATE TABLE `gamerecord` (
  `recordId` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `homeTeamId` int DEFAULT NULL COMMENT '主队ID',
  `gameDate` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '比赛日期',
  `score` int DEFAULT NULL COMMENT '得分',
  `visitingTeamId` int DEFAULT NULL COMMENT '客队ID',
  PRIMARY KEY (`recordId`) USING BTREE,
  KEY `homeTeamId` (`homeTeamId`) USING BTREE,
  KEY `visitingTeamId` (`visitingTeamId`) USING BTREE,
  CONSTRAINT `gamerecord_ibfk_1` FOREIGN KEY (`homeTeamId`) REFERENCES `team` (`teamId`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `gamerecord_ibfk_2` FOREIGN KEY (`visitingTeamId`) REFERENCES `team` (`teamId`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;

Mybatis知识点整理_第40张图片 实体类:球队记录实体类 

Mybatis知识点整理_第41张图片

mapper接口GameRecordMapper

 映射文件GameRecordMapper.xml,添加selectKey节点

Mybatis知识点整理_第42张图片

 测试

Mybatis知识点整理_第43张图片

 Mybatis知识点整理_第44张图片

7.2 输入映射(传参到sql)

7.2.0.parameterType只能接收一个参数

接收的是基本类型(Integer/String..)的话是可以省略parameterType该属性、若是实体类对象,那么sql中占位符位置必须是实体类中属性。

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

Mybatis知识点整理_第45张图片

实体类还是Team

mapper接口还是TeamMapper,新添加方法

Mybatis知识点整理_第46张图片

 TeamMapper.xml配置文件中添加如下:

Mybatis知识点整理_第47张图片

  测试类添加方法:

Mybatis知识点整理_第48张图片

 Mybatis知识点整理_第49张图片

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

在方法形参前加 @Param(" 自定义参数名称 ") mapper 文件中使用 #{ 自定义参数名称 } 方式传参。
TeamMapper 接口添加如下内容:
Mybatis知识点整理_第50张图片
TeamMapper.xml映射文件添加
Mybatis知识点整理_第51张图片

 测试

Mybatis知识点整理_第52张图片

 Mybatis知识点整理_第53张图片

7.2.3.通过 map 来传递多个参数
Map 集合可以存储多个值,使用 Map mapper 文件一次传入多个参数。 Map 集合使用 String key Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值

TeamMapper 接口添加如下内容:
Mybatis知识点整理_第54张图片

 TeamMapper.xml配置文件中添加如下

Mybatis知识点整理_第55张图片

 测试类添加方法:

Mybatis知识点整理_第56张图片

Mybatis知识点整理_第57张图片7.2.4. 通过pojo类传递多个参数

 map传递多个参数类似,要求映射文件中的参数占位符必须和pojo类中的属性完全一致。

自己封装的查询条件的类
Mybatis知识点整理_第58张图片

 TeamMapper接口添加如下内容:

Mybatis知识点整理_第59张图片
TeamMapper.xml 配置文件中添加如下:
Mybatis知识点整理_第60张图片

 测试

Mybatis知识点整理_第61张图片

 总结:

Mybatis知识点整理_第62张图片

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

7.3.1 #{}
#{} 表示一个占位符,通知Mybatis 使用实际的参数值代替。
并使用 PrepareStatement 对象执行 sql 语句 , #{…} 代替 sql 语句的 “?” 。这个是 Mybatis 中的首选做法,安全迅速
Mybatis知识点整理_第63张图片

 7.3.2 ${}

${} 表示字符串原样替换 ,通知 Mybatis 使用 $ 包含的 字符串 替换所在位置。
使用 Statement 或者 PreparedStatement sql 语句和 ${} 的内容连接起来。 一般用在替换表名,
列名,不同列排序等操作
例如:根据球队名称,球队位置查询球队列表
方式 1 :sql中直接给出列名
teamMapper接口
Mybatis知识点整理_第64张图片

 teamMapper.xml

Mybatis知识点整理_第65张图片

测试

 Mybatis知识点整理_第66张图片

 方拾二:sql中使用${}代替列名,使用不同列作为查询条件

teamMapper接口

Mybatis知识点整理_第67张图片

 teamMapper.xml测试

Mybatis知识点整理_第68张图片

7.4 输出映射resultType

resultType: 执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。如果返回的是集合,设置的是集合元素的类型,而不是集合本身。 resultType 和 resultMap, 不能同时使用

7.4.0.输出pojo类型

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

如果查询sql返回的是简单类型且是单行单列(只要一个值)。resultType写值得类型或可以省略

案例:返回球队的总记录数
teamMapper接口

 teamMapper.xml映射文件

Mybatis知识点整理_第69张图片

 测试

Mybatis知识点整理_第70张图片

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

teamMapper接口

 teamMapper.xml映射文件

 测试

Mybatis知识点整理_第71张图片

 Mybatis知识点整理_第72张图片

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

输出list集合类型--当返回多行多列时使用,list中元素是map,每个map描述一条记录

 teamMapper接口

 teamMapper.xml

 测试

Mybatis知识点整理_第73张图片

 

当我们只需要查询表中几列数据的时候可以将 sql 的查询结果作为 Map key value 。一般使用的是 Map.。Map 作为接口返回值, sql 语句的查询结果最多只能有一条记录。大于一条记录会抛出 TooManyResultsException 异常。 
如果有多行,使用 List>.
Mybatis知识点整理_第74张图片

7.5. 输出映射resultMap

当使用resultType="com.chen.pojo.Team"返回Team对象时,mybatis会把sql查询结果自动映射到Team对象中,前提是Team属性与表的列名是一致的,那么当不一致时,这样写就会报错,这时就需要使用resultMap去自定义表和实体类的映射关系 

我们可以使用resultMap 去编写表中的列与实体类中属性的映射。更灵活把列值赋值给指定属性。
常用在列名和 java 对象属性名不一样的情况。
使用方式:
1.先定义resultMap,指定列名和属性的对应关系
2.在