MyBatis动态sql查询及多参数查询方式
作者:多罗罗~ 发布时间:2023-05-30 12:20:12
标签:MyBatis,动态sql,查询,多参数
MyBatis动态sql
动态sql处理简单的多参数查询
常用标签
标签 | 说明 |
---|---|
if | 条件判断,与java中的if语句类似 |
where | 为sql语句动态添加where关键字 |
choose | 条件判断,这是一个组合标签,需要与when,otherwise标签搭配使用。 |
foreach | 以迭代方式处理集合类型的参数 |
set | 为sql语句动态添加set关键字,动态实现数据更新 |
trim | 对sql语句进行格式化处理,添加或移除前后缀 |
if标签
语法
<if test="条件判断">
....Sql语句
</if>
<!--如果test内容为true则执行if内的sql语句,反之则不执行-->
where标签
语法
<where>
<if test="条件判断">
....Sql语句
</if>
</where>
<!--where标签用来替换sql语句中where关键词-->
Eg:
//接口中
/**
* 根据名称,编码模糊查
* @param name
* @param code
* @return
*/
List<SmbmsProvider> listbyCodeAndName(@Param("name")String name,
@Param("code")String code);
<!--相应的mapper映射文件-->
<!--因为传入的参数是基本数据类型,所以parameterType属性可省略-->
<select id="listbyCodeAndName" resultType="com.smbms.pojo.SmbmsProvider">
select * from smbms_provider
<!--where标签 代替sql中的where关键词-->
<where>
<!--符合if条件的则执行相应的sql语句-->
<if test="name!=null"> and proName like concat('%',#{name},'%') </if>
<if test="code!=null"> and proCode like concat('%',#[code],'%')</if>
</where>
</select>
//测试类
@Test
void listbyCodeAndName() {
List<SmbmsProvider> list=mapper.listbyCodeAndName("北","0");
for (SmbmsProvider smbmsProvider : list) {
System.out.println(smbmsProvider.getProName());
}
}
choose(when,otherwise)标签
语法
<choose>
<when test="判断条件">
sql语句...
</when>
<when test="判断条件">
sql语句...
</when>
<otherwise>
sql语句...
</otherwise>
</choose>
<!--此标签相当于java中的switch语句功能-->
总结:
1,choose(when,otherwise)是一个组合标签,when和otherwise写在choose标签中。
2,当when标签中的test属性判断为true,就会执行他所包含的语句。
3,choose中的多个when标签指挥执行匹配成功的第一个,执行之后就跳出choose标签。
4,当所有的when标签中的test属性判断都为false时,进入otherwise标签。
Eg:
//接口中定义方法
/**
*多参查找
* @param map
* @return
*/
List<SmbmsProvider> listByMoreParam(Map<String,Object> map);
<!--相应的mapper映射文件-->
<select id="listByMoreParam" parameterType="map" resultType="com.smbms.pojo.SmbmsProvider">
select * from smbms_provider
<where>
<!--多选一的choose标签-->
<choose>
<when test="name!=null and name!=''"> and proName LIKE CONCAT('%',#{name},'%')</when>
<when test="code!=null and code!=''"> and proCode LIKE CONCAT('%',#[code],'%')</when>
<when test="contact!=null and contact!=''"> and proName LIKE CONCAT('%',#{proContact},'%')</when>
<otherwise> and YEAR(creationDate) = YEAR(#{creationDate})</otherwise>
</choose>
</where>
</select>
//测试类
@Test
void listByMoreParam() {
try {
Map<String,Object> map=new HashMap<>();
map.put("name","优百");
map.put("code","002");
map.put("contact",null);
map.put("creationDate",new SimpleDateFormat("yyyy-MM-dd").parse("2013-03-21"));
List<SmbmsProvider> list=mapper.listByMoreParam(map);
for (SmbmsProvider smbmsProvider : list) {
System.out.println(smbmsProvider.getProName());
}
} catch (ParseException e) {
e.printStackTrace();
}
}
动态sql处理更新功能
set标签
语法
<set>
<if test="判断条件">
sql语句...
</if>
</set>
Eg:
//接口中的方法
/**
*修改的方法
* @param provider
* @return
*/
int updateProviderInfo(SmbmsProvider provider);
<!--相应的mapper映射文件-->
<update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
update `smbms_provider`
<!--set标签可以智能的忽略多余的逗号-->
<set>
<if test="proCode!=null">proCode=#{proCode},</if>
<if test="proName!=null">proName=#{proName},</if>
<if test="proDesc!=null">proDesc=#{proDesc},</if>
<if test="proContact!=null">proContact=#{proContact},</if>
<if test="proPhone!=null">proPhone=#{proPhone},</if>
<if test="proAddress!=null">proAddress=#{proAddress},</if>
<if test="proFax!=null">proFax=#{proFax},</if>
<if test="createdBy!=null">createdBy=#{createdBy,</if>
<if test="creationDate!=null">creationDate=#{creationDate},</if>
<if test="modifyDate!=null">modifyDate=#{modifyDate},</if>
<if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
</set>
where id=#{id}
</update>
<!--此方法中的if判断条件针对的是传入对象参数中部分属性有值-->
//测试类
@Test
void updateProviderInfo() {
result= mapper.updateProviderInfo(new SmbmsProvider("aaaa","sdsd",15L));
System.out.println(result);
}
总结:
where,set标签能够动态的为sql语句添加前后缀,并可以只能的忽略标签前后多余的and,or或者逗号等字符。
动态sql扩展
trim标签
语法
<trim prefix="前缀" suffix="后缀" prefixOverrides="忽略前缀" suffixOverrides="忽略后缀">
....
</trim>
其属性介绍
属性 | 说明 |
---|---|
perfix | 前缀,可自动对trim标签所包含的语句是否有返回值进行判断,如果有返回值,则为sql语句拼接相应前缀 |
suffix | 后缀,在trim标签包含的语句末尾拼接后缀。 |
prefixOverrides | 忽略的前缀,忽略trim标签内部首部指定的内容。此属性中字符 | 意为 或 。字符 ‘|’ 与前后的字符之间不能有空格。 |
suffixOverrides | 忽略的后缀,忽略trim标签包含内容尾部指定的内容。 |
eg:
<!--相应的mapper映射文件-->
<update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
update `smbms_provider`
<!--使用冬天标签进行修改操作-->
<trim prefix="set" suffixOverrides="," suffix=" where id=#{id}">
<if test="proCode!=null">proCode=#{proCode},</if>
<if test="proName!=null">proName=#{proName},</if>
<if test="proDesc!=null">proDesc=#{proDesc},</if>
<if test="proContact!=null">proContact=#{proContact},</if>
<if test="proPhone!=null">proPhone=#{proPhone},</if>
<if test="proAddress!=null">proAddress=#{proAddress},</if>
<if test="proFax!=null">proFax=#{proFax},</if>
<if test="createdBy!=null">createdBy=#{createdBy,</if>
<if test="creationDate!=null">creationDate=#{creationDate},</if>
<if test="modifyDate!=null">modifyDate=#{modifyDate},</if>
<if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
</trim>
</update>
动态sql处理集合参数
语法:
<foreach collection="参数名称" item="元素别名"
open="(" separator="," close=")" index="当前元素位置下标">
#{元素别名}
</foreach>
其属性介绍
属性 | 说明 |
---|---|
item | 为集合或数组中的元素取的别名。 |
open | 起始位置的拼接字符,表示in语句以 ( 开始。 |
separator | 元素之间的连接符,表示 in 语句中的元素之间以 ,连接。 |
close | 结束位置的拼接字符,表示 in语句以 )结束。 |
collection | 参数名称当参数类型为数组时,默认参数名为array。当参数类型为list集合时,默认参数为list。当参数类型为Map集合时,参数名为Map集合元素所在键值对的key。当参数类型为对象时,参数名为对象中集合类型的属性名。 |
foreach标签处理数组类型参数
//接口中的方法
/**
* 同时查询多个供货商关联的入库单列表数据
* @param args
* @return
*/
List<SmbmsBill> listBySomeProviderId(Integer [] args);
<!--相应的mapper映射文件--> <select id="listBySomeProviderId" resultType="com.smbms.pojo.SmbmsBill">
SELECT *
FROM `smbms_bill`
WHERE `providerId` in
<foreach collection="array" item="item" open="(" separator="," close=")" >
#{item}
</foreach>
</select>
//测试类
@Test
void listBySomeProviderId() {
Integer [] someId={1,2,3};
List<SmbmsBill> list= billMapper.listBySomeProviderId(someId);
System.out.println(list.size());
for (SmbmsBill bill : list) {
System.out.println(bill.getProductName());
}
}
foreach标签处理List类型参数
//相应接口
/**
* 查询多个供货商关联的入库单列表数据参数未list集合
* @param list
* @return
*/
List<SmbmsBill> listBySomeProviderIdInList(@Param("list")List<Integer> list);
<!--相应的mapper映射文件-->
<select id="listBySomeProviderIdInList" resultType="com.smbms.pojo.SmbmsBill">
SELECT *
FROM `smbms_bill`
WHERE `providerId` in
<foreach collection="list" item="item" open="(" separator="," close=")" >
#{item}
</foreach>
</select>
//测试类
@Test
void listBySomeProviderIdInList() {
List<Integer> listParam=new ArrayList<>();
listParam.add(1);
listParam.add(2);
listParam.add(3);
List<SmbmsBill> list= billMapper.listBySomeProviderIdInList(listParam);
System.out.println(list.size());
for (SmbmsBill bill : list) {
System.out.println(bill.getProductName());
}
}
foreach标签处理Map类型参数
//接口中的方法
/**
* 多参数查询条件封装Map入参
* @param map
* @return
*/
List<SmbmsBill> listByCodeAndSomeProviderId(Map<String,Object> map);1
<!--相应的mapper映射文件-->
<!--入参类型为map-->
<select id="listByCodeAndSomeProviderId" parameterType="map"
resultType="com.smbms.pojo.SmbmsBill">
SELECT *
FROM `smbms_bill`
<where>
<!--code为map集合中的key-->
<if test="code!=null">
AND `billCode` LIKE CONCAT('%',#[code],'%')
</if>
<if test="providerIds!=null">
AND `providerId` IN
<!--providerIds为map集合中的key-->
<foreach collection="providerIds"
open="(" separator="," close=")" item="items">
#{items}
</foreach>
</if>
</where>
</select>
//测试类
@Test
void listByCodeAndSomeProviderId() {
List<Integer> providerIds=new ArrayList<>();
providerIds.add(1);
providerIds.add(2);
providerIds.add(3);
Map<String,Object> map=new HashMap<>();
map.put("providerIds",providerIds);
map.put("code","1");
List<SmbmsBill> list= billMapper.listByCodeAndSomeProviderId(map);
System.out.println(list.size());
}
注意:
1,当参数为基本数据类型或数组,List集合类型时,myBatis框架会将参数封装在一个Map对象中。
2,当参数为数组时,collection对应值默认为array.
3,当参数为List集合类型时,collection对应值默认为list.
4,当参数为Map对象时,collection对应值为该Map对象中数组或集合元素对应的key.
5,如果使用@Param注解为参数设置了名称,collection对应值为参数名。
6,当参数为对象类型时,独享中有查询条件所需的集合属性,collection对应值为该集合属性名称。
分页功能
基于MySql的分页查询
//相应接口
/**
* 分页查询---多条件
* @param newsId 根据类型id
* @param title 根据标题名称模糊查
* @param startRow 其实行号
* @param pageSize 每页显示数量
* @return 返回集合
*/
List<NewsDetail> listByPageInMoreParam(@Param("newsId")int newsId,
@Param("title")String title,
@Param("startRow")int startRow,
@Param("pageSize")int pageSize);
<!--相应的mapper映射文件-->
<select id="listByPageInMoreParam" resultType="com.news.pojo.NewsDetail">
SELECT * FROM `news_detail`
<where>
<if test="title != null and title != ''">
and `title` LIKE CONCAT('%',#{title},'%')
</if>
<if test="newsId != null and newsId!=-1">
AND `categoryId`=#{newsId}
</if>
</where>
limit #{startRow} ,#{pageSize}
</select>
//测试类
@Test
void listByPageInMoreParam() {
NewDetailMapper mapper= MyBatisUtil.getSqlSession().getMapper(NewDetailMapper.class);
List<NewsDetail> list= mapper.listByPageInMoreParam(2,null,0,2);
System.out.println(list.size());
for (NewsDetail detail : list) {
System.out.println(detail.getTitle());
}
}
来源:https://blog.csdn.net/qq_51347907/article/details/112878778
0
投稿
猜你喜欢
- 环境:apache-tomcat-8.5.15jdk1.8.0_172IDEA建立一个maven-webapp项目:Create New P
- Java实现PC微信扫码支付做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付。微信支付官方网站业务流程:开发指引文档支付服务开发
- 概述JavaScript是目前web开发中不可缺少的脚本语言,js不需要编译即可运行,运行在客户端,需要通过浏览器来解析执行JavaScri
- 1.将本地jar包放入本地仓库。只需执行如下命令即可:mvn install:install-file -Dfile=D:/demo/fib
- 我就废话不多说了,大家还是直接看代码吧~//执行的是删除信息的操作 String a=request.getParameter("
- 一:对象,JavaBean,SpringBean的区别1.什么是JavaBeanjavaBean要求所有属性为私有,该类必须有一个公共无参构
- 什么是继承?多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类可以称
- HttpClient模拟浏览器登录后发起请求浏览器实现这个效果需要如下几个步骤: 1请求一个需要登录的页
- 已经有很多关于 Flutter WebView 的文章了,为什么还要写一篇。两个原因:Flutter WebView 是 Flutter 开
- 简介本文用示例介绍使用MyBatis-Plus进行多表查询的方法,包括静态查询和动态查询。代码controllerpackage com.e
- 在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统
- 上篇文章已经对Synchronized关键字做了初步的介绍,从字节码层面介绍了Synchronized关键字,最终字节码层面就是monito
- 目录前言导入okhttp3方法简介两种版本超时设置用法总结前言okhttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支
- 1. 什么是λ表达式λ表达式本质上是一个匿名方法。让我们来看下面这个例子: public int add(int x, int
- 异常处理是每个项目中都绕不开的话题,那么如何优雅的处理异常,是本文的话题。本文将结合SpringBoot框架一起和大家探讨下。要思考的问题在
- 定义可理解为 适配广泛的类型,即参数化类型,可以把类型像方法的参数那样进行传递。// 以ArrayList为示例// 泛型T可以是任意类pu
- POM<dependency> <groupId>org.springframework.boot<
- 多表联合查询resultType的返回值一般数据按参数类型返回<select id="queryCarIdList"
- 前言:好久没有写博客,最近一年感觉真是好忙,各种做不完的工作。相信很多上班族都会有这种感觉。最近对NFC进行写卡操作,需要计算一个校验位。一
- 线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,