目录
- MyBatis动态sql
- 动态sql处理简单的多参数查询
- 动态sql处理更新功能
- 动态sql扩展
- 动态sql处理集合参数
- foreach标签处理数组类型参数
- foreach标签处理List类型参数
- foreach标签处理Map类型参数
- 分页功能
- 基于MySql的分页查询
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> | |
//测试类 | |
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( ("newsId")int newsId, | |
"title")String title, | (|
"startRow")int startRow, | (|
"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()); | |
} | |
} |