Mapper.xml及动态sql
Mapper.xml及动态sql
·
mapper.xml
- Mapper映射文件是在实际开发过程中使用最多的,也是我们学习的重点。
- Mapper文件中包含的元素有:
- cache – 配置给定命名空间的缓存。
- resultMap – 映射复杂的结果对象,解决字段不统一
- sql – 可以重用的 SQL块,也可以被其他语句引用。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
select
- id: 必须属性,并且在同一个命名空间下唯一,动态代理实现中id的值必须和接口中的方法名一致
- resultType:结果集映射成对象(POJO)类型
- sql: 标签内容,获取传入参数:#{}、${}; - 记住(面试题)
- 如果使用$的话。会默认将值封装到value中,需要这样来取值:${value}
- 如果需要指定特殊的变量的话,需要在接口的方法声明中使用@param注解在方法参数之前指定参数封装的变量如:@Param(“id ”)
- 记住:
- #{} 作用:预编译占位符,sql语句用 ? 号代替
- ${} 作用:sql语句的拼接,需要判断参数类型,做具体的处理
- #{} 获取参数时和参数名无关。
- ${} 获取参数通过${value}获取,如果指定参数名需要通过 @Param("xxx")在接口的方法声明中指定
- #{} 可以防止sql注入,${}不能防止sql注入
parameterType的传入参数
- parameterType支持三种类型:
- 简单类型,string、long、integer等,注意多个参数时的参数封装
- Pojo类型,User等
- HashMap类型。如果使用hashMap作为参数类型的话,一定要保证sql语句中的#{}变量与map中的key保证一致
- parameterType 不是必须指定,如果不指定Mybatis自动识别传入参数类型;
parameterType传入多个参数
- 使用@Param注解指定参数名称 ,简单的查询,删除
- 如果只有一个参数的时候,可以不使用@param注解,mybatis会到对象中去查找对应的属性值
- 当有2个以上的参数的时候,mtbatis会自动将参数封装在param中,取值的时候可以使用#{param}进行取值
- 如果需要自己指定参数名称则必须要使用@param注解声明。在取值的时候就可以使用#{封装的变量},此時param1,param2 仍然会封装数据
将参数封装为Pojo对象传入
- 如果将参数封装在user对象中,此时可以使用@param注解,也可以不使用注解,xml的parameterType可以写,也可以不写,没有什么影响
- 不使用注解时候,xml文件中可以直接使用#{user类中的属性}取值即可;
- 使用注解时,在xml中取值的时候,则必须要使用对象名.属性名的方式,如:#{user.address}
将参数封装HashMap传入
- 使用HashMap进行参数的封装时,使用和封装到pojo对象中一样,可以使用注解也可以不使用注解,xml的parameterType可以写,也可以不写
- hashMap.put{“address”,“南京”}
- 不使用注解的时候,xml文件中可以直接使用hashMap中的key进行取值,如:#{address}
- 使用注解的时候,在xml中则必须要使用hashMap.key来获取封装在map中的值,如:#{hashMap.address}
ResultType结果输出
- 增删改没有resultType的结果类型
ResultMap - 最核心 - 可以用来解决什么问题
- resultMap中的属性详解
- Id:要保证唯一
- Type:最终要映射的对象类型,可以使用对象别名,也可以使用HashMap
- autoMapping:自动映射没有指定的属性字段,默认位true
- resultMap下的标签详解:
- Id : 表的主键,column:数据库中的列名,property:对象中的属性名,或者map中的key
- Result:数据库中与实体中不同的属性对应关系,column:数据库中的列名,property:对象中的属性名或者map中的key
动态sql
- MyBatis 的强大特性之一便是它的动态 SQL 能力。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 字符串有多么痛苦
- 拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦
if
- 在进行多条件查询的时候,如果用户输入了某个条件我们就可以按照某个条件查询,如果用户没有指定按照某个条件去查询,那么就按照预先定义好的语句执行。
- 特点:如果sql语句后面有多个if的话,那么只要满足条件,那么这个条件就会添加到sql中。If的条件是一个and 的关系
- 只要满足条件,就会将sql语句,拼接在主语句后面
- 如:查询所有男性用户信息,如果输入了姓名,则按照姓名模糊查询进行查找,如果输入了年龄,查询大于这个年龄的用户
- 使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,特别是针对多条件时的判断,增加灵活性。
choose, when, otherwise
- 有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。
- 而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件,就会将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
where
- 当有这样的一个场景时,用户可能会输入条件也有可能不会输出条件时,我们可以使用where标签
- 作用 : 构建where 关键字,
- 如:查找所有的用户,如果输入了姓名则进行模糊查询,如果又输入了年龄,把这个条件添加进去,则查询小于这个年龄的用户
- -- 查询所有的用户信息
- -- 如果输入了性别则按照性别查询
- -- 如果输入了姓名,则按照姓名模糊查询进行查找,
- -- 如果输入了年龄,查询大于这个年龄的用户
set
- 更新用户表数据时,若某个参数为null时,会导致更新错误
- 当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。
- 使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号
- 如:修改用户信息
foreach
- Delete from emp where empno in(1,5,10)
- 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)
- 需求 : 查询用户编号在1001 - 1005之间的用户信息

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)