关于使用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;
      }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容