关于使用springBoot+mybatis plus后,自己在mapper.xml里书写符合自己需求的sql语句

前提:

当我们在自己的项目中使用到springBoot+mybatis plus时,mybatis plus 会为我们提供基本的CRUD(增删改查)(Create插入、Retrieve读取、Update更新、Delete删除),分别对应mybatis plus提供的insert(单条插入)/insertBatch(批量插入)...、selectById(根据id查询)/selectBatchIds(根据集合(id)批量查询)/selectCount(返回查询结果集)...、update(更新)...、delete(删除)...
这里mybatis plus 提供的对数据库的基本操作基本能够满足一般的使用。
问题来了,如果遇到数据量很大的增删改查时,mybatis plus提供的方法可能会遇到查询效率很慢的情况,这个时候,就需要在mapper.xml里自己去定义sql语句了。

书写自己的sql语句步骤如下:
1.在本地连接数据库的软件中的查询编辑器里书写合理的sql语句,如图:

a.jpg

2.找到合理的mapper.xml把上面的sql语句写到xml中,如图:
b.jpg

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.binshi.store.modules.car.dao.UserOrderServicesDao">
    <!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="com.binshi.store.modules.car.entity.UserOrderServicesEntity" id="userOrderServicesMap">
        <result property="id" column="id"/>
        <result property="orderCode" column="order_code"/>
        <result property="typeId" column="type_id"/>
        <result property="storeId" column="store_id"/>
        <result property="price" column="price"/>
        <result property="num" column="num"/>
        <result property="subMoney" column="sub_money"/>
        <result property="sTime" column="s_time"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="constructionPerson" column="construction_person"/>
        <result property="salePerson" column="sale_person"/>
        <result property="srcPrice" column="src_price"/>
        <result property="userCombinationServiceId" column="user_combination_service_id"/>
        <result property="isReset" column="is_reset"/>
        <result property="cardId" column="card_id"/>
        <result property="cashMoney" column="cash_money"/>
        <result property="cardMoney" column="card_money"/>
        <result property="originalStoreId" column="original_store_id"/>
        <result property="bonus" column="bonus"/>
    </resultMap>
    <select id="queryUserCount" resultType="java.lang.Long">
        SELECT COUNT(*) FROM(
        SELECT DISTINCT(user_id) FROM user_order
        <where>
            ${ew.sqlSegment}
        </where>) AS t
    </select>

</mapper>

讲解:关于自己书写的sql语句就不多说了(自己知道sql语句的返回结果数据格式就行);然后是resultType:这里用于接收sql的查询结果,如果sql语句查询结果是像我上面的那样,用一个整型或者长整型接收即可;如果返回的结果是一个表格类型,则自行在entity里定义一个实体类对应表格里的每一条数据即可;
然后是关于${ew.sqlSegment} :mybatis plus 提供的条件构造器

<!-- 条件构造器形式 -->
   <select id="queryUserCount" resultType="java.lang.Long">
        SELECT COUNT(*) FROM(
        SELECT DISTINCT(user_id) FROM user_order
        <where>
            ${ew.sqlSegment}
        </where>) AS t
    </select>

方便我们书写灵活的查询条件
然后下一个步骤是在我们的Dao层进行相关书写,如下:

package com.binshi.store.modules.car.dao;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.binshi.store.modules.car.entity.UserOrderEntity;
import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * @author holly7
 * @date 2019-05-31 20:50:54
 */
public interface UserOrderDao extends BaseMapper<UserOrderEntity> {

    Long queryUserCount(@Param("ew") Wrapper<UserOrderEntity> wrapper);
    
}

注意:这里的queryUserCount方法名称必须和mapper.xml里面的id保持一致。
最后,我们去调用它(queryUserCount)就好了

然后就是关于怎么调用Dao里面的queryUserCount了:
书写service层:

package com.binshi.store.modules.car.service;
import com.baomidou.mybatisplus.service.IService;
import com.binshi.store.modules.car.entity.UserOrderEntity;



import java.util.Map;

/**
 * @author holly7
 * @date 2019-05-31 20:50:54
 */
public interface UserOrderService extends IService<UserOrderEntity> {
    
    Long queryUserCount(Map<String,Object>params);
    
}

书写serviceImp层:

package com.binshi.store.modules.car.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.binshi.common.utils.common.Constant;
import com.binshi.store.modules.car.dao.UserOrderDao;
import com.binshi.store.modules.car.entity.*;
import com.binshi.store.modules.car.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;


/**
 * @author holly7
 * @date 2019-05-31 20:50:54
 */
@Service("userOrderService")
public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrderEntity> implements UserOrderService {
    
     @Override
    public Long queryUserCount(Map<String, Object> params) {
        Wrapper<UserOrderEntity> wrapper = getWrapper(params);
        return this.baseMapper.queryUserCount(wrapper);
    }

    private Wrapper<UserOrderEntity> getWrapper(Map<String, Object> params) {
        Wrapper<UserOrderEntity> wrapper = new EntityWrapper<>();
        if (params.containsKey("startTime")) {
            String startTime = (String) params.get("startTime");
            if (StringUtil.hasValue(startTime)) {
                wrapper = wrapper.andNew().ge("create_time", startTime + " 00:00:00");
            }
        }
        if (params.containsKey("endTime")) {
            String endTime = (String) params.get("endTime");
            if (StringUtil.hasValue(endTime)) {
                wrapper = wrapper.andNew().le("create_time", endTime + " 23:59:59");
            }
        }
        return wrapper;
    }
}

最后在controller层进行调用,如下:

@RestController
@RequestMapping("user")
public class UserOrderController {
    @Autowired
    private UserOrderService userOrderService;
     
    @PostMapping("/check/count")
    public Long checkCount(){
        Map<String, Object> params = new HashMap<>();
        params.put("startTime",startPayTime);
        params.put("endTime",endPayTime);
        long count = this.userOrderService.queryUserCount(params);
        return count;
      }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容