zoukankan      html  css  js  c++  java
  • 常用的高级sql查询

    1.根据主键id数组批量修改

     1    void updateByIdArr(Integer[] idArr);
     2    
     3    <update id="updateByIdArr" parameterType="java.util.Arrays" >
     4     <!--
     5       WARNING - @mbggenerated
     6       This element is automatically generated by MyBatis Generator, do not modify.
     7       This element was generated on Tue Nov 01 11:14:38 CST 2016.
     8     -->
     9     update t_usermanage_adviser
    10     set status = 0 
    11     where id in 
    12     <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
    13         #{item}
    14     </foreach>
    15     
    16   </update>

     2.批量插入 更新sql

    (1). 弊端
    如果传入的更新的值为空,会把相应的值更新为空

     1   int batchInsertOrUpdate(List<TShopAttachment> attachments);
     2   
     3   
     4   <insert id="batchInsertOrUpdate" parameterType="java.util.List">
     5     insert into t_shop_attachment
     6     (
     7       enterprise_id, shop_id, type_id, file_path, uploader, updater, file_name, upload_date,
     8       update_date, status
     9     ) values
    10     <foreach collection="list" item="item" index="index" separator=",">
    11       (
    12       #{item.enterprise_id}, #{item.shop_id}, #{item.type_id}, #{item.file_path}, #{item.uploader},
    13       #{item.updater}, #{item.file_name}, #{item.upload_date},
    14       #{item.update_date}, #{item.status}
    15       )
    16     </foreach>
    17     ON DUPLICATE KEY UPDATE
    18     file_path = VALUES(file_path),
    19     updater = VALUES(updater),
    20     file_name = VALUES(file_name),
    21     update_date = VALUES(update_date)
    22   </insert>

    3.关联关系association:1对1关联的三种方法

    表结构:

     

    order:订单表

    order_detail 订单明细表

    product 商品表

    category 商品分类表

    梳理图上的4根关系线:
    1、1个用户可以有0个或多个订单:[user表]–>[order表]是1对多(0.n)关系
    2、1个有效订单会购买1条或多条商品分录:[order表]–>[order_detail表]是1对多(1.n)关系
    3、1条商品分录必定对应一个产品详情:[order_detail表]–>[product表]是1对1关系
    4、1个商品分类下可能会有0个或多个商品:[category表]–>[product表]是1对多(0.n)关系
    5、所有1对多关系,反过来一定是1对1关系。比如[user表]–>[order表]是1对多(0.n)关系,那么反过来[order表]–>[user表]是1对1关系。每个订单都会有与之对应的唯一用户。
    要注意,所有1对1关系,反过来却不一定是1对1关系。比如[order_detail表]–>[product表]是1对1关系,反过来[product表]–>[order_detail表]就不是1对1关系。因为同一个产品可能会在多个不同的订单分录中出现(热门商品大家都愿意买嘛)

    [order表]–>[user表]是1对1关系,那么就拿这个来练手。1对1关联关系用于对一个表外键的扩展。
    现在要在后台系统中按以下字段显示订单列表。

    有三种方式可以实现:

    一、扩展新建POJO对象,不使用association标签

    step1.我们已经有一个与表对应的Order类,但是没有用户名称,用户地址,联系电话这三个字段。现在新建一个类OrderExtend,扩充字段:

     1 public class OrderExtend extends Order{
     2     public OrderExtend() {
     3         super();
     4     }
     5     /*添加用于展示的用户名称,用户地址,联系电话这三个字段*/
     6     String username;
     7     String address;
     8     String cellphone;
     9 
    10     /*下面get和set方法*/
    11     getter and setter....
    12 }

    step2.创建接口及Xml

    1 public interface OrderExtendMapper {
    2     //查询单个订单详情,关联查询用户信息
    3     public OrderExtend getByOrderno(String orderno) throws Exception;
    4     //查询订单列表,关联查询用户信息
    5     public List<OrderExtend> getList() throws Exception;
    6 }
     1 <mapper namespace="twm.mybatisdemo.mapper.OrderExtendMapper">
     2     <select id="getByOrderno" parameterType="String"
     3         resultType="twm.mybatisdemo.pojo.OrderExtend">
     4         SELECT
     5         `order`.*,`user`.username,`user`.address,`user`.cellphone
     6         FROM `order` ,`user`
     7         WHERE `order`.create_userid=`user`.id AND `order`.create_userid=#{id}
     8     </select>
     9 
    10     <select id="getList" resultType="twm.mybatisdemo.pojo.OrderExtend">
    11         SELECT
    12         `order`.*,`user`.username,`user`.address,`user`.cellphone
    13         FROM `order`
    14         ,`user`
    15         WHERE `order`.create_userid=`user`.id
    16     </select>
    17 </mapper>
    18 

    step3.调用

    1 public static void main(String[] args) throws Exception {
    2         SqlSession session = SqlSessionAssist.getSession();
    3 
    4         OrderExtendMapper ordermapper = session
    5                 .getMapper(OrderExtendMapper.class);
    6         OrderExtend order = ordermapper.getByOrderno("M201209012578917");
    7         System.out.println(order.getOrderno() + "," + order.getUsername() + ","
    8                 + order.getAddress() + "," + order.getCellphone());
    9     }

    二、(推荐)用sql联合查询,使用association标签

     1 public class Order{
     2 
     3     User user;
     4 
     5     public User getUser() {
     6         return user;
     7     }
     8     public void setUser(User user) {
     9         this.user = user;
    10     }
    11     /*下面get和set方法*/
    12     getter and setter....
    13 }

    step2.创建映射器接口及配置Xml 
    twm.mybatisdemo.mapper包下创建 
    OrderMapper.java:

    1 public interface OrderMapper {
    2     //查询单个订单详情,关联查询用户信息
    3     public Order getByOrderno(String orderno) throws Exception;
    4     //查询订单列表,关联查询用户信息
    5     public List<Order> getList() throws Exception;
    6 }

    OrderMapper.xml:

     1 <mapper namespace="twm.mybatisdemo.mapper.OrderMapper">
     2     <!-- 定义类型映射 -->
     3     <resultMap type="Order" id="OrderMap">
     4         <!-- 订单表属性 -->
     5         <id column="id" property="id" />
     6         <result column="orderno" property="orderno" />
     7         <result column="create_time" property="create_time" />
     8         <result column="create_userid" property="create_userid" />
     9         <!-- 关联的用户信息 -->
    10         <!-- association用于关联查询:
    11         property指属性,javaType是要映射的对象的类型。 -->
    12         <association property="user" javaType="User">
    13             <result column="username" property="username" />
    14             <result column="address" property="address" />
    15             <result column="cellphone" property="cellphone" />
    16         </association>
    17     </resultMap>
    18 
    19     <select id="getByOrderno" parameterType="String"
    20         resultMap="OrderMap">
    21         SELECT
    22         `order`.*,`user`.username,`user`.address,`user`.cellphone
    23         FROM `order`
    24         ,`user`
    25         WHERE `order`.create_userid=`user`.id AND
    26         `order`.orderno=#{orderno}
    27     </select>
    28 
    29     <select id="getList" resultMap="OrderMap">
    30         SELECT
    31         `order`.*,`user`.username,`user`.address,`user`.cellphone
    32         FROM `order`
    33         ,`user`
    34         WHERE `order`.create_userid=`user`.id
    35     </select>
    36 </mapper>

    step3.调用

     1 public static void main(String[] args) throws Exception {
     2     SqlSession session = SqlSessionAssist.getSession();
     3 
     4     OrderMapper ordermapper = session.getMapper(OrderMapper.class);
     5     Order order = ordermapper.getByOrderno("M201209012578917");
     6     System.out.println(order.getOrderno() + ","
     7             + order.getUser().getUsername() + ","
     8             + order.getUser().getAddress() + ","
     9             + order.getUser().getCellphone());
    10 
    11 }

    什么是延迟加载?如果先查询订单信息即可满足业务要求就不会去查询用户,只有当用到用户信息时再查询用户信息。
    对用户信息按需去查询就是延迟加载。
    比如上面,只有当调用Order中的getUser方法获取关联的user数据时,才会触发数据库查询user表。

    mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。
    lazyLoadingEnabled:全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。允许值有:true | false。默认值:false
    aggressiveLazyLoading:当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。允许值有:true | false。默认值:true

    和第二种方式比,其它都不变。只是DAOImplement层有一些变化,XML文件要调整三处:

    第一处:新增一个用户查询语句:

    1 <!-- 新增一个用户查询语句:getUser -->
    2 <select id="getUser" parameterType="int" resultType="User">
    3     SELECT
    4     `username`,`address`,`cellphone`
    5     FROM `user`
    6     WHERE `id` =#{_parameter}
    7 </select>

    第二处:把原来resultMap的association标签改为

     1 <association property="user" javaType="User" column="create_userid" select="getUser" /> 

    第三处:把getByOrderno和getList查询语句改为普通的select单表查询。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
     3 <mapper namespace="twm.mybatisdemo.mapper.OrderMapper">
     4     <!-- 定义类型映射 -->
     5     <resultMap type="Order" id="OrderMap">
     6         <!-- 订单表属性 -->
     7         <id column="id" property="id" />
     8         <result column="orderno" property="orderno" />
     9         <result column="create_time" property="create_time" />
    10         <result column="create_userid" property="create_userid" />
    11         <!-- 关联的用户信息 -->
    12         <!-- association用于关联查询: property指属性,javaType是要映射的对象的类型。 -->
    13         <association property="user" javaType="User" column="create_userid"
    14             select="getUser" />
    15     </resultMap>
    16 
    17 <!-- 新增一个用户查询:getUser。getUser这一段可以删掉,用user对象的查询方法 -->
    18 <select id="getUser" parameterType="int" resultType="User">
    19     SELECT
    20     `username`,`address`,`cellphone`
    21     FROM `user`
    22     WHERE `id` =#{_parameter}
    23 </select>
    24 
    25     <select id="getByOrderno" parameterType="String" resultMap="OrderMap">
    26         SELECT * FROM `order`  WHERE `order`.orderno=#{orderno}
    27     </select>
    28 
    29     <select id="getList" resultMap="OrderMap">
    30         SELECT * FROM `order` 
    31     </select>
    32 </mapper>

    一切OK了。 
    association的几个属性: 
    property:指定内部对象属性名 
    javaType:内部映射的对象的类型。 
    column:要传给select语句的参数,相当于指定外键字段。 
    select:指定用户查询语句的ID

    事实上,大多数业务场景显示的表格,都会用到多个表字段。
    如果采用延迟加载,会存在N+1问题。
    什么是N+1问题呢?
    每一个获取Order内部的User对象,都会进行一次select查询
    那么当运行过程中执行Order的getList方法时,SQL首先进行1次查询,查询结果如果有N条订单记录,那么实际在每条订单中显示过程中还要运行一次select用户的查询,共n次。
    SQL总共执行了n+1次。相比第二种方法的只进行一次联合查询,这种方式无疑是低效的。
    如果业务场景的表格显示字段,并没有跨表,那么可以采用延迟加载方式 

     1 <resultMap id="detailMap" type="com.yaoex.usermanage.model.channel.ChannelDetailModel" >
     2     <id column="id" property="id" jdbcType="INTEGER" />
     3     <result column="channel_id" property="channel_id" jdbcType="INTEGER" />
     4     <result column="cust_id" property="cust_id" jdbcType="VARCHAR" />
     5     <result column="cust_group_id" property="cust_group_id" jdbcType="VARCHAR" />
     6     
     7     <association property="custGroup" column="cust_group_id" select="findCustGroup"/>
     8     <association property="cust" column="cust_id" select="findCust"/>
     9   </resultMap>
    10 
    11 public class ChannelDetailModel extends ChannelDetail {
    12     
    13     /**
    14      * 
    15      */
    16     private static final long serialVersionUID = -3176604063524770205L;
    17 
    18     private ChannelCustomer cust;
    19     
    20     private CustGroupModel custGroup;
    21 }
    22 
    23   <select id="findCustGroup" resultMap="CustGroupModelMap" parameterType="java.lang.String">
    24     SELECT id, group_code, group_name FROM t_cust_group WHERE group_code = #{cust_group_id}
    25   </select>
    26 
    27   <select id="findCust" resultMap="custMap" parameterType="java.lang.String">
    28     SELECT e.enterprise_id, e.enterprise_name, e.role_type , 
    29         case e.role_type 
    30             when 1 then 
    31                 (select a.param_name 
    32                     from t_usermanage_enterprise_type t, t_usermanage_dict a 
    33                 where t.type_id = a.param_value and t.enterprise_id = e.enterprise_id) 
    34             else '批发企业' 
    35         end as customerTypeName
    36     FROM t_usermanage_enterprise e 
    37     WHERE e.enterprise_id = #{cust_id}
    38   </select>

     4.关联关系collection:1对多关联的两种方法

    一对多关系 
    [order表]–>[order_detail表]是1对多(1.n)关系。1个订单可以由多个订单分录(购买的商品)组成的。1对多关联关系可以理解为一个对象的内部有一个列表。 
    在后台系统中我们点击订单列表会进到订单详情页 

    有两种方式可以实现:

    一、(推荐)用sql联合查询,使用collection标签

    sql查询语句是这样的:

    1 SELECT
    2     `order`.*,`user`.username,`user`.address,`user`.cellphone,
    3     `order_detail`.productname,`order_detail`.price,`order_detail`.num
    4     FROM `order`
    5     ,`user`,`order_detail` 
    6     WHERE `order`.create_userid=`user`.id AND
    7     `order_detail`.`order_id`=`order`.id AND 
    8     `order`.orderno='M201209012578917'

    step1.我们已经有一个与表对应的Order类,但是没有分录列表字段。所以在Order类里新增List<OrderDetail> orderdetailList属性:

     1 public class Order {
     2     Integer id;
     3     String orderno;
     4     Integer create_time;
     5     Integer create_userid;
     6     User user;
     7 
     8     /* 添加分录列表 */
     9     List<OrderDetail> orderdetailList;
    10 
    11     /*下面get和set方法*/
    12     getter and setter....
    13 }

    step2.创建接口及Xml 
    在twm.mybatisdemo.mapper包下的OrderMapper.xml和OrderMapper.java的基础上改进。 
    OrderMapper.java里添加方法:

     1 //查询单个订单详情,关联查询用户信息以及订单明细 2 public List<Order> getDetailByOrderno(String orderno) throws Exception; 

    OrderMapper.xml里添加一个resultMap和一个select:

     1 <resultMap type="Order" id="Contain_DetailList_OrderMap" extends="OrderMap">
     2     <!-- order中订单信息字段及关联的用户字段,和上面的OrderMap映射一样,这里只是扩充订单明细,extends继承上面的即可 -->
     3     <!-- 配置关联订单明细信息 -->
     4     <collection property="orderdetailList" ofType="OrderDetail">
     5         <id column="id" property="id" />
     6         <result column="productname" property="productname" />
     7         <result column="num" property="num" />
     8         <result column="price" property="price" />
     9     </collection>
    10 </resultMap>
    11 
    12 <select id="getDetailByOrderno" parameterType="String" resultMap="Contain_DetailList_OrderMap">
    13     SELECT
    14     `order`.*,`user`.username,`user`.address,`user`.cellphone,
    15     `order_detail`.productname,`order_detail`.price,`order_detail`.num
    16     FROM `order`
    17     ,`user`,`order_detail` 
    18     WHERE `order`.create_userid=`user`.id AND
    19     `order_detail`.`order_id`=`order`.id AND 
    20     `order`.orderno=#{orderno}
    21 </select>

    step3.调用

     1 public static void main(String[] args) throws Exception {
     2         SqlSession session = SqlSessionAssist.getSession();
     3 
     4         OrderMapper ordermapper = session.getMapper(OrderMapper.class);
     5         Order order = ordermapper.getDetailByOrderno("M201209012578917");
     6         System.out.println(order.getOrderno() + ","
     7                 + order.getUser().getUsername() + ","
     8                 + order.getUser().getAddress() + ","
     9                 + order.getUser().getCellphone());
    10         List<OrderDetail> detailList=order.getOrderdetailList();
    11         for (OrderDetail orderDetail : detailList) {
    12             System.out.println(orderDetail.getProductname() + ","
    13                     + orderDetail.getNum() + ","
    14                     + orderDetail.getPrice());
    15         }
    16     }

    结果:

    M201209012578917,高天仪,北冥山庄,18911110000 iphone 8 plus,3,5700.0

    擦~怎么只有一条明细呢?

    看mybatis的日志

    1 DEBUG [main] - ==>  Preparing: SELECT 
    2   order.*,user.username,user.address,user.cellphone, 
    3   order_detail.productname,order_detail.price,order_detail.num 
    4   FROM order ,user,order_detail WHERE 
    5   order.create_userid=user.id AND 
    6   order_detail.order_id=order.id AND order.orderno=?  DEBUG 
    7   [main] - ==> Parameters: M201209012578917(String) DEBUG [main] - <== 
    8   Total: 2

    SQL查询出来确实是2条啊。
    上网搜了一下,发现问题出在<id column="id" property="id" />
    如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条。
    解决办法:在SQL中加上order_detail.id as detail_id,定义一个别名<id column="detail_id" property="id" />
    再把<id column="id" property="id" />改为<id column="detail_id" property="id" />

    千万不要试图删了Contain_DetailList_OrderMap里的<id column="id" property="id" />这句。这样没有主键,系统不会distinct去重记录的。

    二、(不推荐)不使用sql联合查询,通过collection的延迟加载来实现 
    在上面的基础上修改: 
    step1.添加select片段,根据订单id,查询所有订单明细记录

    1 <select id="SelectOrderDetail" parameterType="int" resultType="OrderDetail">
    2     select * from `order_detail` where order_id=#{id}
    3 </select>

    step2.修改collection 
    collection的几个属性: 
    property:指定内部对象属性名 
    javaType:内部映射的对象的类型。 
    column:要传给select语句的参数,相当于指定外键字段。 
    select:指定用户查询语句的ID

    1 <resultMap type="Order" id="Contain_DetailList_OrderMap" extends="OrderMap">
    2     <!-- order中订单信息字段及关联的用户字段,和上面的OrderMap映射一样,这里只是扩充订单明细,extends继承上面的即可 -->
    3     <!-- 配置关联订单明细信息 -->
    4     <collection property="orderdetailList" select="SelectOrderDetail" column="id" />
    5 </resultMap>

    step3.修改getDetailByOrderno的select片段,删除联查order_detail相关的部分

    1 <select id="getDetailByOrderno" parameterType="String" resultMap="Contain_DetailList_OrderMap">
    2     SELECT `order`.*,`user`.username,`user`.address,`user`.cellphone    
    3     FROM `order` ,`user`
    4     WHERE `order`.create_userid=`user`.id and
    5     `order`.orderno=#{orderno}
    6 </select>

    运行结果:

    1 DEBUG [main] - ==>  Preparing: SELECT 
    2   order.*,user.username,user.address,user.cellphone FROM order 
    3   ,user WHERE order.create_userid=user.id and order.orderno=?  
    4   DEBUG [main] - ==> Parameters: M201209012578917(String) DEBUG [main] - 
    5   ====>  Preparing: select * from order_detail where order_id=?  DEBUG [main] - ====> Parameters: 1(Integer) DEBUG [main] - <====      Total: 
    6   2 DEBUG [main] - <==      Total: 1 
    7   M201209012578917,高天仪,北冥山庄,18911110000 iphone 8 plus,3,5700.0 
    8   华为G7,2,2700.0

    可以看到存在N+1问题,只不过这种场景下N永远是1。 
    原来用一个联合查询可以解决的,现在需要用两次查询。

     1   <resultMap id="ChannelDetailResultCustMap" type="com.yaoex.usermanage.model.channel.ChannelProduct" >
     2     <id column="id" property="id" jdbcType="INTEGER" />
     3     <result column="seller_id" property="seller_id" jdbcType="VARCHAR" />
     4     <result column="product_id" property="product_id" jdbcType="VARCHAR" />
     5     <result column="channel_type" property="channel_type" jdbcType="INTEGER" />
     6     <result column="channel_status" property="channel_status" jdbcType="INTEGER" />
     7     <result column="create_user" property="create_user" jdbcType="VARCHAR" />
     8     <result column="create_time" property="create_time" jdbcType="TIMESTAMP" />
     9     <result column="update_user" property="update_user" jdbcType="VARCHAR" />
    10     <result column="update_time" property="update_time" jdbcType="TIMESTAMP" />
    11     
    12     <result column="spu_code" property="spu_code" jdbcType="VARCHAR" />
    13     <result column="product_code" property="product_code" jdbcType="VARCHAR" />
    14     <result column="product_name" property="product_name" jdbcType="VARCHAR" />
    15     <result column="short_name" property="short_name" jdbcType="VARCHAR" />
    16     <result column="factory_name" property="factory_name" jdbcType="VARCHAR" />
    17     <result column="spec" property="spec" jdbcType="VARCHAR" />
    18     <result column="drugform" property="drugform" jdbcType="VARCHAR" />
    19       <!--javatype指定的是user对象的属性的类型(例如id,canBuyCust),而oftype指定的是映射到list集合属性中pojo的类型(本例指的是ChannelCustomer类型)-->
    20     <collection property="canBuyCust" ofType="com.yaoex.usermanage.model.channel.ChannelCustomer" column="{id=id,canBuyFlag=can_buy}" select="findCanBuyCustWithCust"/>
    21     <collection property="canNotBuyCust" ofType="com.yaoex.usermanage.model.channel.ChannelCustomer" column="{id=id,canBuyFlag=cannot_buy}" select="findCanBuyCustWithCust"/>
    22   </resultMap>
     1 public class ChannelProduct extends Channel {
     2     /**
     3      * 
     4      */
     5     private static final long serialVersionUID = 1595115735063349179L;
     6 
     7     private String spu_code;
     8     
     9     private String product_code;
    10     
    11     private String product_name;
    12     
    13     private String short_name;
    14     
    15     private String factory_name;
    16     
    17     private String spec;
    18     
    19     private String drugform;
    20     
    21     private Integer canNotBuyCustNum;
    22     
    23     private List<ChannelCustomer> canBuyCust;
    24     
    25     private List<ChannelCustomer> canNotBuyCust;
    26 }
     1   <!-- 按客户添加的渠道    查看客户-->
     2   <select id="findCanBuyCustWithCust" resultMap="customerResultMap" parameterType="map">
     3     SELECT t.cust_id, t.cust_group_id, e.enterprise_id, e.enterprise_name, e.role_type,
     4         case e.role_type 
     5             when 1 then 
     6                 (select a.param_name 
     7                     from t_usermanage_enterprise_type t, t_usermanage_dict a 
     8                 where t.type_id = a.param_value and t.enterprise_id = e.enterprise_id) 
     9             else '批发企业' 
    10         end as customerTypeName 
    11     FROM t_channel_detail t left join t_usermanage_enterprise e on e.enterprise_id = t.cust_id
    12 
    13     WHERE t.channel_id = #{id} and t.can_buy_flag = #{canBuyFlag} and t.is_condition = 0 
    14 
    15   </select>

     5、批量更新sql:

    (1)根据一个字段批量更新:List<String> channelIdSet

    1         Map<String,Object> params = new HashMap<>();
    2         params.put("channelIdSet", channelIdSet);
    3         this.baseDao.update("com.yaoex.usermanage.persistence.interfaces.channel.ChannelMapper.batchDeleteChannel", params);
     1     <update id="batchDeleteChannel" parameterType="map">
     2         update t_channel
     3         <trim prefix="set" suffixOverrides=",">
     4             <trim prefix="is_delete = case" suffix="end,">
     5                 <foreach collection="channelIdSet" item="item">
     6                     when id=#{item} then 1
     7                 </foreach>
     8             </trim>
     9         </trim>
    10         <where>
    11             and id in
    12             <foreach collection="channelIdSet" item="item" open="(" close=")" separator=",">
    13                 #{item}
    14             </foreach>
    15         </where>
    16     </update>

     (2)根据多个字段同时更新:Set<ProductUniqueBean> productUniqueBeans

    1     @Override
    2     public void batchDeleteChannelApply(Set<ProductUniqueBean> productUniqueBeans) {
    3         Map<String,Object> params = new HashMap<>();
    4         params.put("productUniqueBeans", productUniqueBeans);
    5         this.baseDao.update("com.yaoex.usermanage.persistence.interfaces.channelapply.ChannelApplyMapper.batchDeleteChannelApply", params);
    6     }
     1     <update id="batchDeleteChannelApply" parameterType="map">
     2         update t_channel_apply
     3         <trim prefix="set" suffixOverrides=",">
     4             <trim prefix="is_delete = case" suffix="end,">
     5                 <foreach collection="productUniqueBeans" item="item">
     6                     when spu_code=#{item.spuCode} and seller_code=#{item.sellerCode} then 1
     7                 </foreach>
     8             </trim>
     9         </trim>
    10         <where>
    11             and (spu_code,seller_code) in
    12             <foreach collection="productUniqueBeans" item="item" open="(" separator="," close=")">
    13                 (#{item.spuCode},#{item.sellerCode})
    14             </foreach>
    15         </where>
    16     </update>

    6、统计数量方法

    1 SELECT IFNULL(SUM(if(d.role_type = 1,2,0)),0) roleType from t_usermanage_enterprise_dft d ;
    2 
    3 SELECT IFNULL(SUM(d.role_type = 1),0) roleType from t_usermanage_enterprise_dft d;
    4 
    5 SELECT COUNT(*) from t_usermanage_enterprise_dft d WHERE d.role_type = 1;

     

    7、时间范围搜索

    (1)

    1 AND STR_TO_DATE(#{now},"%Y-%m-%d") >= STR_TO_DATE(t2.start_time,"%Y-%m-%d")
    2 AND STR_TO_DATE(t2.end_time,"%Y-%m-%d") >= STR_TO_DATE(#{now},"%Y-%m-%d")

     (2)

    1       <if test="startTime != null and startTime != ''">
    2             <![CDATA[  and updateTime >=  #{startTime} ]]>
    3       </if>
    4       <if test="endTime != null and endTime != ''">
    5             <![CDATA[  and updateTime <=  #{endTime} ]]>
    6       </if>
  • 相关阅读:
    angular-ui-bootstrap的弹出框定义成一个服务的实践(二)
    分享百度文件上传组件webUploader的使用demo
    display的flex属性使用详解
    数组去重(初识ES6)
    在ng中的select的使用方法的讲解
    安装xamp之后,appach、mysql等问题的总结
    python中string.casefold和string.lower区别
    python3数据类型
    MySQL bin-log 日志清理方式
    python终端颜色设置
  • 原文地址:https://www.cnblogs.com/xiaoxiaoccaiya/p/9768314.html
Copyright © 2011-2022 走看看