mybatis mapper.xml,动态sql
1:mapper.xml
Mapper映射文件是在实际开发过程中使用最多的,也是我们学习的重点。
Mapper文件中包含的元素有:
cache – 配置给定命名空间的缓存。
resultMap – 映射复杂的结果对象,解决字段不统一
sql – 可以重用的 SQL块,也可以被其他语句引用。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
1:select
id: 必须属性,并且在同一个命名空间下唯一,动态代理实现中id的值必须和接口中的方法名一致;
resultType:结果集映射成对象(POJO)类型;
sql: 标签内容,获取传入参数:#{}、${}; - 记住(面试题)
如果使用$的话。会默认将值封装到value中,需要这样来取值:${value}
如果需要指定特殊的变量的话,需要在接口的方法声明中使用@param注解在方法参数之前指定参数封装的变量如:@Param(“id ”)
记住:
#{} 作用:预编译占位符,sql语句用 ? 号代替
${} 作用:sql语句的拼接,需要判断参数类型,做具体的处理
#{} 获取参数时和参数名无关。
${} 获取参数通过${value}获取,如果指定参数名需要通过 @Param("xxx")在接口的方法声明中指定
#{} 可以防止sql注入,${}不能防止sql注入
2:parameterType的传入参数
parameterType支持三种类型:
1、简单类型,string、long、integer等,注意多个参数时的参数封装 , --- 删除,查找中参数较少的
2、Pojo类型,User等, ----新增,修改, 条件较多,能封装成对象
3、HashMap类型。如果使用hashMap作为参数类型的话,一定要保证sql语句中的#{}变量与map中的key保证一致 , 多条件查询,封装不了对象的
parameterType 不是必须指定,如果不指定Mybatis自动识别传入参数类型;
3:parameterType传入多个参数
1、 使用@Param注解指定参数名称
如果只有一个参数的时候,可以不使用@param注解,mybatis会到对象中去查找对应的属性值
当有2个以上的参数的时候,mtbatis会自动将参数封装在param中,取值的时候可以使用#{param}进行取值
如果需要自己指定参数名称则必须要使用@param注解声明。在取值的时候就可以使用#{封装的变量},此時param1,param2 仍然会封装数据
2、将参数封装为Pojo对象传入
如果将参数封装在user对象中,此时可以使用@param注解,也可以不使用注解,xml的parameterType可以写,也可以不写,没有什么影响
不使用注解时候,xml文件中可以直接使用#{user类中的属性}取值即可;
使用注解时,在xml中取值的时候,则必须要使用对象名.属性名的方式,如:#{user.address}
2、 将参数封装HashMap传入
使用HashMap进行参数的封装时,使用和封装到pojo对象中一样,可以使用注解也可以不使用注解,xml的parameterType可以写,也可以不写
hashMap.put{“address”,“南京”}
不使用注解的时候,xml文件中可以直接使用hashMap中的key进行取值,如:#{address}
使用注解的时候,在xml中则必须要使用hashMap.key来获取封装在map中的值,如:#{hashMap.address}
4:ResultType结果输出
增删改没有resultType的结果类型
5:ResultMap - 最核心
resultMap中的属性详解:
Id:要保证唯一;
Type:最终要映射的对象类型,可以使用对象别名,也可以使用HashMap
autoMapping:自动映射没有指定的属性字段,默认位true
resultMap下的标签详解:
Id : 表的主键,column:数据库中的列名,property:对象中的属性名,或者map中的key
Result:数据库中与实体中不同的属性对应关系,column:数据库中的列名,property:对象中的属性名或者map中的key
2:动态sql
MyBatis 的强大特性之一便是它的动态 SQL 能力。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 字符串有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
1:if
在进行多条件查询的时候,如果用户输入了某个条件我们就可以按照某个条件查询,如果用户没有指定按照某个条件去查询,那么就按照预先定义好的语句执行。
特点:如果sql语句后面有多个if的话,那么只要满足条件,那么这个条件就会添加到sql中。If的条件是一个and 的关系
只要满足条件,就会将sql语句,拼接在主语句后面
如:查询所有男性用户信息,如果输入了姓名,则按照姓名模糊查询进行查找,如果输入了年龄,查询大于这个年龄的用户
使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,特别是针对多条件时的判断,增加灵活性。
2:choose, when, otherwise
Switch - case - default
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。
而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。MyBatis提供了choose 元素用于多选一。
if标签是与(and)的关系,而choose标签是或(or)的关系.
choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。
类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
如:查询男性用户,如果输入了姓名则按照姓名模糊查找,如果输入了年龄则按照年龄查找,如果都没有输入就查询年龄 小于18岁的用户
特点:多选一的场景使用choose , 多选多的场景使用if
3:where
当有这样的一个场景时,用户可能会输入条件也有可能不会输出条件时,我们可以使用where标签
如:查找所有的用户,如果输入了姓名则进行模糊查询,如果又输入了年龄,把这个条件添加进去,则查询小于这个年龄的用户
4:set
更新用户表数据时,若某个参数为null时,会导致更新错误
当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。
使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号
如:修改用户信息
5:foreach
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。
Foreach( int item : arr)
Collection 表示即将要遍历的容器
item表示集合中每一个元素进行迭代时的别名;
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;
open表示该语句以什么开始;
separator表示在每次进行迭代之间以什么符号作为分隔符;
close表示以什么结束;
如:根据多个id查询用户信息, 批量删除用户信息
Select * from user where id in (1,3,5)
Delete from user where id in (1,2,3,4,5)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)