MyBatis动态sql
动态sql处理简单的多参数查询
常用标签
标签 | 说明 |
---|---|
if | 条件判断,与java中的if语句类似 |
where | 为sql语句动态添加where关键字 |
choose | 条件判断,这是一个组合标签,需要与when,otherwise标签搭配使用。 |
foreach | 以迭代方式处理集合类型的参数 |
set | 为sql语句动态添加set关键字,动态实现数据更新 |
trim | 对sql语句进行格式化处理,添加或移除前后缀 |
if标签
语法
1 | ....Sql语句 |
where标签
语法
1 2 3 | ....Sql语句 |
Eg:
1 2 3 4 5 6 7 8 9 | //接口中 /** * 根据名称,编码模糊查 * @param name * @param code * @return */ List listbyCodeAndName( @Param ( "name" )String name, @Param ( "code" )String code); |
1 2 3 4 5 6 7 8 9 10 11 | select * from smbms_provider and proName like concat('%',#{name},'%') and proCode like concat('%',#,'%') |
1 2 3 4 5 6 7 8 | //测试类 @Test void listbyCodeAndName() { List list=mapper.listbyCodeAndName( "北" , "0" ); for (SmbmsProvider smbmsProvider : list) { System.out.println(smbmsProvider.getProName()); } } |
choose(when,otherwise)标签
语法
1 2 3 4 5 6 7 8 9 | sql语句... sql语句... sql语句... |
总结:
1,choose(when,otherwise)是一个组合标签,when和otherwise写在choose标签中。
2,当when标签中的test属性判断为true,就会执行他所包含的语句。
3,choose中的多个when标签指挥执行匹配成功的第一个,执行之后就跳出choose标签。
4,当所有的when标签中的test属性判断都为false时,进入otherwise标签。
Eg:
1 2 3 4 5 6 7 | //接口中定义方法 /** *多参查找 * @param map * @return */ List listByMoreParam(Map map); |
1 2 3 4 5 6 7 8 9 10 11 | select * from smbms_provider and proName LIKE CONCAT('%',#{name},'%') and proCode LIKE CONCAT('%',#,'%') and proName LIKE CONCAT('%',#{proContact},'%') and YEAR(creationDate) = YEAR(#{creationDate}) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //测试类 @Test void listByMoreParam() { try { Map 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 list=mapper.listByMoreParam(map); for (SmbmsProvider smbmsProvider : list) { System.out.println(smbmsProvider.getProName()); } } catch (ParseException e) { e.printStackTrace(); } } |
动态sql处理更新功能
set标签
语法
1 2 3 | sql语句... |
Eg:
1 2 3 4 5 6 7 | //接口中的方法 /** *修改的方法 * @param provider * @return */ int updateProviderInfo(SmbmsProvider provider); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | update `smbms_provider` proCode=#{proCode}, proName=#{proName}, proDesc=#{proDesc}, proContact=#{proContact}, proPhone=#{proPhone}, proAddress=#{proAddress}, proFax=#{proFax}, createdBy=#{createdBy, creationDate=#{creationDate}, modifyDate=#{modifyDate}, modifyBy=#{modifyBy}, where id=#{id} |
1 2 3 4 5 6 7 | //测试类 @Test void updateProviderInfo() { result= mapper.updateProviderInfo( new SmbmsProvider( "aaaa" , "sdsd" ,15L)); System.out.println(result); } |
总结:
where,set标签能够动态的为sql语句添加前后缀,并可以只能的忽略标签前后多余的and,or或者逗号等字符。
动态sql扩展
trim标签
语法
1 | .... |
其属性介绍
属性 | 说明 |
---|---|
perfix | 前缀,可自动对trim标签所包含的语句是否有返回值进行判断,如果有返回值,则为sql语句拼接相应前缀 |
suffix | 后缀,在trim标签包含的语句末尾拼接后缀。 |
prefixOverrides | 忽略的前缀,忽略trim标签内部首部指定的内容。此属性中字符 | 意为 或 。字符 ‘|’ 与前后的字符之间不能有空格。 |
suffixOverrides | 忽略的后缀,忽略trim标签包含内容尾部指定的内容。 |
eg:
1 2 3 4 5 | update `smbms_provider` proCode=#{proCode},proName=#{proName},proDesc=#{proDesc},proContact=#{proContact},proPhone=#{proPhone},proAddress=#{proAddress},proFax=#{proFax},createdBy=#{createdBy,creationDate=#{creationDate},modifyDate=#{modifyDate},modifyBy=#{modifyBy}, |
动态sql处理集合参数
语法:
1 2 3 | #{元素别名} |
其属性介绍
属性 | 说明 |
---|---|
item | 为集合或数组中的元素取的别名。 |
open | 起始位置的拼接字符,表示in语句以 ( 开始。 |
separator | 元素之间的连接符,表示 in 语句中的元素之间以 ,连接。 |
close | 结束位置的拼接字符,表示 in语句以 )结束。 |
collection | 参数名称当参数类型为数组时,默认参数名为array。当参数类型为list集合时,默认参数为list。当参数类型为Map集合时,参数名为Map集合元素所在键值对的key。当参数类型为对象时,参数名为对象中集合类型的属性名。 |
foreach标签处理数组类型参数
1 2 3 4 5 6 7 | //接口中的方法 /** * 同时查询多个供货商关联的入库单列表数据 * @param args * @return */ List listBySomeProviderId(Integer [] args); |
1 2 3 4 5 6 7 8 | SELECT * FROM `smbms_bill` WHERE `providerId` in #{item} |
1 2 3 4 5 6 7 8 9 10 | //测试类 @Test void listBySomeProviderId() { Integer [] someId={ 1 , 2 , 3 }; List list= billMapper.listBySomeProviderId(someId); System.out.println(list.size()); for (SmbmsBill bill : list) { System.out.println(bill.getProductName()); } } |
foreach标签处理List类型参数
1 2 3 4 5 6 7 8 | //相应接口 /** * 查询多个供货商关联的入库单列表数据参数未list集合 * @param list * @return */ List listBySomeProviderIdInList( @Param ( "list" )List list); |
1 2 3 4 5 6 7 8 9 | SELECT * FROM `smbms_bill` WHERE `providerId` in #{item} |
1 2 3 4 5 6 7 8 9 10 11 12 13 | //测试类 @Test void listBySomeProviderIdInList() { List listParam= new ArrayList(); listParam.add( 1 ); listParam.add( 2 ); listParam.add( 3 ); List list= billMapper.listBySomeProviderIdInList(listParam); System.out.println(list.size()); for (SmbmsBill bill : list) { System.out.println(bill.getProductName()); } } |
foreach标签处理Map类型参数
1 2 3 4 5 6 7 | //接口中的方法 /** * 多参数查询条件封装Map入参 * @param map * @return */ List listByCodeAndSomeProviderId(Map map); 1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | SELECT * FROM `smbms_bill` AND `billCode` LIKE CONCAT('%',#,'%') AND `providerId` IN #{items} |
1 2 3 4 5 6 7 8 9 10 11 12 13 | //测试类 @Test void listByCodeAndSomeProviderId() { List providerIds= new ArrayList(); providerIds.add( 1 ); providerIds.add( 2 ); providerIds.add( 3 ); Map map= new HashMap(); map.put( "providerIds" ,providerIds); map.put( "code" , "1" ); List 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的分页查询
1 2 3 4 5 6 7 8 9 10 11 12 13 | //相应接口 /** * 分页查询---多条件 * @param newsId 根据类型id * @param title 根据标题名称模糊查 * @param startRow 其实行号 * @param pageSize 每页显示数量 * @return 返回集合 */ List listByPageInMoreParam( @Param ( "newsId" ) int newsId, @Param ( "title" )String title, @Param ( "startRow" ) int startRow, @Param ( "pageSize" ) int pageSize); |
1 2 3 4 5 6 7 | SELECT * FROM `news_detail` and `title` LIKE CONCAT('%',#{title},'%') AND `categoryId`=#{newsId} limit #{startRow} ,#{pageSize} |
1 2 3 4 5 6 7 8 9 10 | //测试类 @Test void listByPageInMoreParam() { NewDetailMapper mapper= MyBatisUtil.getSqlSession().getMapper(NewDetailMapper. class ); List list= mapper.listByPageInMoreParam( 2 , null , 0 , 2 ); System.out.println(list.size()); for (NewsDetail detail : list) { System.out.println(detail.getTitle()); } } |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。