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)

 

posted @   这题我不会  阅读(434)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示