目录 MyBatis动态sql 动态sql处理简单的多参数查询 动态sql处理更新功能 动态sql扩展 动态sql处理集合参数 foreach标签处理数组类型参数 foreach标签处理List类型参数 foreach标签处理Map类型参数
目录
- MyBatis动态sql
- 动态sql处理简单的多参数查询
- 动态sql处理更新功能
- 动态sql扩展
- 动态sql处理集合参数
- foreach标签处理数组类型参数
- foreach标签处理List类型参数
- foreach标签处理Map类型参数
- 分页功能
- 基于MySql的分页查询
MyBatis动态sql
动态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>
其属性介绍
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>
其属性介绍
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()); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。