学习主题:mybatis
学习目标:
1 掌握resultMap的使用
2 掌握association的使用
对应作业
- 列名和属性名不一致问题_resultMap标签的使用
- 什么是ResultMap? 有什么作用?
手动配置映射,可以用于处理列名和属性名不一致,用于多表连接查询等多种问题
- resultType和resultMap有什么区别?
restulyType:
1.对应的是java对象中的属性,大小写不敏感,
2.如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,大小写敏感
3.resultMap:指的是定义好了的id的,是定义好的resyltType的引用
注意:用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用,而且resultMap可以用typeHander转换
4.type:java 对象对应的类,id:在本文件要唯一column :数据库的列名或别名,property:对应java对象的属性,jdbcType:java.sql.Types
查询语句中,resultMap属性指向上面那个属性的标签的id
- 多表关联查询_设计表结构
- MyBatis实现多表关联查询有哪些情况?
- 通过业务处理可以实现多表连接查询。
- 通过ResultMap实现实现
- 通过表别名来实现。
- 数据库表格间的关系有哪几种?
三种;一对一,一对多,多对多。
- 多表关联查询_业务装配方式
- 什么是业务装配? 简述如何实现?
通过业务逻辑层来实现多表查询。拿视频里一对多关系的stu和class对象为例。
首先定义两个pojo对象来保存数据表里的字段的信息。其中stu类中设置一个clazz类的属性。接着编写两个接口分表实现查询全部和根据id查信息并配置对应的xml文件。在业务层定义一个接口,在实现类里按以下方法写(精华部分)
![bd857ff805716336ed7ef991a3c7c223.png](https://i-blog.csdnimg.cn/blog_migrate/3dc296e5a1df0729edf8be3b007f0d90.png)
最后编写测试语句就行。
- 请总结MyBatis有哪些优点?
简单好用
- 多表关联查询_resultMap_单个对象_N+1方式实现
- 标签<association>有什么作用?
当需要实现多表查询的时候,通常需要使用association标签来进行结果集的嵌套。
- <association>标签中有哪些属性? 分别有什么含义?
Select 用于定位被嵌套的结果集的位置 properties 用于表示stu中的clazz类的属性。Column用于表示传入结果集中需要的条件。
![6121c60352eee0ea6c2f2663885cc9a4.png](https://i-blog.csdnimg.cn/blog_migrate/77099e1651cf38ed38b656035dfdde73.png)
![b17cd54bffb1fdd9a9c242740b0192d6.png](https://i-blog.csdnimg.cn/blog_migrate/efa64d90a75597e1aa0ea2c7410e3670.png)
- 多表关联查询_resultMap_单个对象_关联方式实现
- 请使用association节点实现根据用户id查询用户信息以及对应角色信息(User实体类中有一个对象Role,只写SQL映射文件)
- 在mapper中如何传递多个参数?
- 可以把多个参数封装在一个对象中
- 使用map集合
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
第62次(mybatis)
- 多表关联查询_resultMap_集合对象_N+1方式实现
- 标签<collection>有什么作用?
集合的嵌套结果映射就是指通过一次SQL查询将所有的结果查询出来,然后映射到不同的对象中。在一对多的关系中,主表一条数据会对应关联表的多条数据。因此一般查询时会查询出多条结果,按照一对多的数据映射时,最终的结果数会小于等于查询的总记录数。
- <collection>标签中有哪些属性? 分别有什么含义?
Select javaType coulnm properties
- 多表关联查询_resultMap_集合对象_关联方式实现
- 通常一个Xml映射文件,都会写一个Mapper接口与之对应,请问,这个Mapper接口的工作原理是什么?
接口中有方法名,有传参类型,有返回值类型。而xml文件中有sql语句。Mybatis会制动匹配接口和对应的xml文件,为他们创造一个实现类对象。
- Mapper接口里的方法,参数不同时,方法能重载吗?
能。
- 多表关联查询_Auto-Mapping配合别名实现
- Mybatis是如何将sql执行结果封装为目标对象并返回的? 都有哪些映射形式?
第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
- 什么情况下用注解绑定,什么情况下用xml绑定?
动态查询的时候用xml,其他情况应该可以互换。
- 注解开发详解
- 什么是注解? 有什么作用?
注解是用来描述代码的代码。比如 @param表示用来描述属性名称。
- MyBatis中常用的注解有哪些?
@Test @Override @param
- MyBatis注解_CRUD
- MyBatis中使用注解需要注意什么?
注解的使用风格:@XXX(属性),使用前必须先导包。
注解的属性
- 哪些注解可以实现增删改查操作?
- @select
- @insert
- Update
- Delete
- MyBatis注解_关联查询
- @Results和@Result注解有什么作用?
@Results类似于ResultMap标签。@Result类似于ResultMap标签的子标签。
- 如何通过注解实现多表关联查询?
原理类似于xml文件的写法。拿多对一举例,stu为多,class为一。在pojo类中的stu加上class对象作为属性。在stu的Mapper接口中实现查询所有stu信息的功能,再加上@Result注解,把stu的各个属性写在@Result中,其中clazz属性用@one代替association,select对应clazz的mepper的接口的方法的全限定路径。
跟xml一样ClazzMapper接口只需要写一个根据id查询的方法即可。
![c329ee4957b559b33ae6349ab9bd7cb6.png](https://i-blog.csdnimg.cn/blog_migrate/b37298719485f8e912956a3a85462326.png)
![cf3e4f2d3572031b8525ec777f4fb109.png](https://i-blog.csdnimg.cn/blog_migrate/4eca79a6cf08393545621403acc727b8.png)
- 分析MyBatis的运行原理
- SqlSession对象的创建经理的哪些过程?
当 MyBatis 运行开始时, 先要通过 Resources 加载核心 配置文件, 之后使用 XMLConfigBuilder 对配置文件进行解 析, 将解析结果封装为 Configuration 对象, 接着, 使用 Configuration对象构建一个DefaultSqlSessionFactory对 象, 至此, SqlSession 工厂构建完成. 接下来, 通过工厂对象调用 openSession 方法创建 SqlSession 对 象 . 在 这 个 过 程 中 , 需 要 通 过 TransactionFactory 生成 Transaction 对象, 并且, 还需要 创建核心执行器 Executor 对象, 之后, 通过这些对象来创 建DefaultSqlSession对象, 至此, SqlSession对象创建成功. 之后, 通过 SqlSession 对象执行相应的操作, 如果执 行成功, 调用 commit 方法提交事务; 如果失败, 调用 rollback 方法事务回滚. 最后, 调用 close 方法关闭 session 资源. 以上, 就是 MyBatis 的运行原理.
- 当实体类中的属性名和表中的字段名不一样 ,怎么办?
两种方法:
- 通过ResultMap标签来对属性进行匹配。
- 可以对表的列起别名来匹配属性名。
- 详述MyBatis的运行原理
- MyBatis运行过程中涉及到哪些类或接口? 请列举并简述作用.
1 Resources(C)
用于加载 MyBatis 核心配置文件
2 XMLConfigBuilder(C)
用于解析 xml 文件(核心配置文件)
3 Configuration(C)
用于存放 xml 文件解析后的结果
4 DefaultSqlSessionFactory(C)
是 SqlSessionFactory(I)的 实 现 类 , 创 建 时 需 要 使 用
Configuration 对象
5 SqlSession(I)
是 MyBatis 操作的核心
6 DefaultSqlSession(C)
是 SqlSession 接口的实现类
7 TransactionFactory(I)
用于生产 Transaction 对象
8 Transaction(I)
用于表示操作数据库的事务对象
9 Executor(I)
是 MyBatis 的核心执行器, 类似于 jdbc 中的 Statement, 常
用的实现类是 SimpleExecutor
- 请总结MyBatis的运行原理
当 MyBatis 运行开始时, 先要通过 Resources 加载核心 配置文件, 之后使用 XMLConfigBuilder 对配置文件进行解 析, 将解析结果封装为 Configuration 对象, 接着, 使用 Configuration对象构建一个DefaultSqlSessionFactory对 象, 至此, SqlSession 工厂构建完成. 接下来, 通过工厂对象调用 openSession 方法创建 SqlSession 对 象 . 在 这 个 过 程 中 , 需 要 通 过 TransactionFactory 生成 Transaction 对象, 并且, 还需要 创建核心执行器 Executor 对象, 之后, 通过这些对象来创 建DefaultSqlSession对象, 至此, SqlSession对象创建成功. 之后, 通过 SqlSession 对象执行相应的操作, 如果执 行成功, 调用 commit 方法提交事务; 如果失败, 调用 rollback 方法事务回滚. 最后, 调用 close 方法关闭 session 资源. 以上, 就是 MyBatis 的运行原理.
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。