目录
MyBatis动态sql
动态sql处理简单的多参数查询动态sql处理更新功能
动态sql扩展动态sql处理集合参数
foreach标签处理数组类型参数 foreach标签处理List类型参数foreach标签处理Map类型参数
分页功能
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">modfyBy=#{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());
- }
- }
复制代码以上为个人经验,希望能给大家一个参考,也希望大家多多支持中国红客联盟。 |