MyBatis
2022-11-29 14:00:57 23 举报
AI智能生成
根据 JavaGuide 绘制的脑图
作者其他创作
大纲/内容
span style=\
什么是 MyBatis?
优点
缺点
Mybaits的优缺点?
#{item.name} 的取值方式为使用 反射从参数对象中 获取 item 对象的 name 属性值,相当于 param.getItem().getName()。
关于 #{}
${} 常见于相关配置文件中,常被用于 XML 标签属性值以及 SQL 内部,用来做 字符串替换。例如将 ${driver} 会被静态替换为 com.mysql.jdbc.Driver :
${} 的主要应用场景:span style=\
关于 ${}
#{} 和 ${} 的区别是什么?
Mybatis的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
还有很多其他的标签, <resultMap> 、 <parameterMap> 、 <sql> 、 <include> 、 <selectKey> ;动态 SQL 的 9 个标签:trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中 <sql> 为 sql 片段标签,通过 <include> 标签引入 sql 片段, <selectKey> 为不支持自增的主键生成策略标签。
xml 映射文件中,除了常见的 select、insert、update、delete 标签之外,还有哪些标签?
Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名 拼接字符串作为 key 值,可唯一定位一个 MappedStatement ,举例:com.mybatis3.mappers.StudentDao.findStudentById ,可以唯一找到 namespace 为 com.mybatis3.mappers. StudentDao 下面 id = findStudentById 的 MappedStatement 。在 MyBatis 中,每一个 <select> 、 <insert> 、 <update> 、 <delete> 标签,都会被解析为一个 MappedStatement 对象。
Mybatis 的 Dao 接口可以有多个重载方法,但是 多个接口对应的映射必须只有一个,否则启动会报错。
Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?
用法:
子主题
if
解析:
choose、when、otherwise
用法,span style=\
所以上面的示例也可以写成:
注意:传入 List 或 数组时,系统会默认添加一个 “key”为 List 或 数组 的值,把内容放入这个 key 对应的集合中。但是,当传入的参数为 Map 对象时,系统并 不会 默认添加一个 key 值,需要手工传入。span style=\
每次都要这么麻烦?要嵌套 map 才行?
foreach
where 和 set 都继承了 trim 标签:
where 用法:
解析:span style=\
where
set 用法:
set
其实 where 标签和 set 标签都只是 trim 标签的某种实现方案,trim 标签底层是通过 TrimSqlNode 类来实现的,它有几个关键属性:prefix :前缀,当 trim 元素内存在内容时,会给内容插入指定前缀;suffix :后缀,当 trim 元素内存在内容时,会给内容插入指定后缀;prefixesToOverride :前缀去除,支持多个,当 trim 元素内存在内容时,会把内容中匹配的前缀字符串去除;suffixesToOverride :后缀去除,支持多个,当 trim 元素内存在内容时,会把内容中匹配的后缀字符串去除;
trim
where、set、trim
但是,万一有一天换数据库了,那么上述模糊查询的 like 语句可能不通用,则需要进行修改。
bind
MyBatis 动态 sql 是做什么的?都有哪些动态 sql?
MyBatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
使用 MyBatis 的 mapper 接口调用时有哪些要求?
在 mapper 中如何传递多个参数?
在 MyBatis 中,通过 <resultMap> 元素的子元素 <association> 处理 一对一/多对一的关联查询。在 <association> 元素中通常使用以下属性。property:指定映射到实体类的对象属性。column:指定表中对应的字段(即查询返回的列名)。javaType:指定映射到实体对象属性的类型。select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。
学生类,学生表中有其对应老师的 tid:
StudentMapper 接口中的对应方法:
1. 按查询嵌套处理,其实就是分步查询,在每步查询中进行关系映射:
2. 按结果嵌套处理,其实就是单步查询,在最后结果中进行关系映射:
用 getStudents() 输出:
一对一/多对一关联查询
在 MyBatis 中,通过 <resultMap> 元素的子元素 <collection> 处理一对多的关联查询,collection 可以将关联查询的多条记录映射到一个 list 集合属性中。在 <collection> 元素中通常使用以下属性。property:指定映射到实体类的对象属性。column:指定表中对应的字段(即查询返回的列名)。javaType:指定映射到实体对象属性的类型。select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。
一个老师拥有多个学生,教师类如下:
TeacherMapper 接口中定义的方法如下:
一个教师拥有多个学生,我们要获取指定老师和其所有学生,按结果嵌套 步骤如下:1. 从学生表和老师表中查出学生 id,学生姓名,老师姓名2. 对查询出来的操作做结果集映射 1. 集合使用 collection 2. JavaType 和 ofType 都是用来指定对象类型的 3. JavaType 是用来指定 pojo 中属性的类型 4. ofType 指定的是映射到 list 集合属性中 pojo 的类型
1. 按结果嵌套:
2. 按查询嵌套:
调用上面的方法,输出如下:
一对多关联查询
一对一、多对一、一对多的关联查询
MyBatis
0 条评论
回复 删除
下一页