<!—关联映射–>
经测验映射文件最好和核心配置文件在一个文件夹下
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
Mapper配置文件
配表与pojo关系,以及sql
select * from user where id = #{id}
id: sql语句的唯一标识,与dao接口中的方法名一致
parameterType:定义输入到sql中的映射类型(请求参数),#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。id 可以用任意字符代替并不固定
resultType:定义结果映射类型(返回值)。
注意:当返回值是List集合时他的类型就是泛型的类型
mybatis支持别名:
| 别名 | 映射类型 |
| — | — |
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| map | Map |
动态Sql
If
通过mybatis提供的各种标签方法实现动态拼接sql
原始sql语句:
SELECT * FROM USER WHERE username LIKE ‘%王%’ AND sex= ’2’
Mybatis中简单的sql语句:
SELECT * FROM USER WHERE username LIKE ‘%${username}%’ AND sex=#{sex}
trim
前缀’and’ 被’(’ 替换
prefix:前缀覆盖并增加其内容 不写的话默认替换为空
suffix:后缀覆盖并增加其内容 不写的话默认替换为空
prefixOverrides:前缀判断的条件
suffixOverrides:后缀判断的条件
使用动态sql语句:
where
SELECT * FROM USER
AND username LIKE ‘%${username}%’
AND sex=#{sex}
可以自动去除sql语句where关键字后的and关键字
Foreach
向sql传递数组或List, mybatis使用foreach解析,可以做批量处理
Sql语句:
SELECT * FROM USER WHERE id IN (1,10,16)
使用foreach赋值:
SELECT * FROM USER
#{id}
foreach:循环传入的集合参数
collection:传入的集合的变量名称(要遍历的值)
item:每次循环将循环出的数据放入这个变量中
open:循环开始拼接的字符串
close:循环结束拼接的字符串
separator:循环中拼接的分隔符
批量修改实例:
sql:
UPDATE rc_notify_queue SET queue_status = ‘E’,execute_time=NOW() WHERE notify_queue_Id IN (3,22,11)
UPDATE rc_notify_queue SET queue_status = ‘E’,execute_time=NOW()
#{notify.notifyQueueId}
一个大神朋友写的批量修改:
choose
if标签是与(and)的关系,而 choose 是或(or)的关系。
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
sql片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的
将where条件抽取出来:
AND username LIKE ‘%${username}%’
引用:
SELECT * FROM USER
注意:也可在sql标签中也可以只放if标签
_parameter : 参数的引用
关联查询:
多表查询返回的数据是两个表中的数据这样就出现了数据封装的问题
解决方案一:创建一个有两个表的数据类
SELECT * FROM USER a , orders b WHERE a.id = b.user_id
和普通方法是一样的,只是要多创建一个po类
解决方案二:不需要新建po类只要在映射文件中配置:
使用:
SELECT * FROM USER a , orders b WHERE a.id = b.user_id
Type: po类的权限定名,这里使用的是别名
Id: 主键
Result: 普通属性
Column: po类属性
Property: 表字段名
Association: 引用数据类型
Property: 在po类中的名称
JavaType: 全限定名
分两块,第一块使用resultMap标签封装数据,第二块在select中使用resultMap引用封装好的数据;
这种放法优于第一种方法,第一种方法再写po类增加了工作量,也不便于以后对数据的使用,也不能表现表与表之间的关系
封装map集合:
返回结果集类型: resultType=“java.util.Map”
查询后返回的结果:List
将数据库中每条数据:字段和值按照 key(字段名),value(字段值) 封装到hashMap集合中
然后在把Map集合封装到Llist集合中
将一条数据封装成map集合:
使用
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
resultMap封装数据
SELECT * FROM s_cust
Column就是map集合的key Property数据库传来的数据注意:property值对应数据库中的字段值这种方式只能获取一条数据
Spring整合mybatis
SqlMapConfig.xml配置: