SpringBoot结合MybatisPlus进行单表查询(EntityWrapper)以及分页(Page)的使用

1.引入MybatisPlus的依赖


            com.baomidou
            mybatisplus-spring-boot-starter
            1.0.5
        
        
            com.baomidou
            mybatis-plus
            2.1.4
            
            	
            		org.mybatis
            		mybatis
            	
            	
            		org.mybatis
            		mybatis-spring
            	
            
        

注: 用maven管理库依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar会被下载了不同版本的问题,好在pom的配置里面允许用< exclusion >来排除一些不需要同时下载的依赖jar 。

2.在application.yml文件里进行mybatisPlus的相关配置

mybatis-plus:
  #外部化xml配置
  mapper-locations: classpath:/mybatismapper/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  type-aliases-package:  com.chanjue.activiti.workflow.entities
  #typeEnumsPackage: com.baomidou.springboot.entity.enums
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 2
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: false
    #刷新mapper 调试神器
    refresh-mapper: true
    #数据库大写下划线转换
    #capital-mode: true
    #序列接口实现类配置
    #key-generator: com.baomidou.springboot.xxx
    #逻辑删除配置
    logic-delete-value: 1
    logic-not-delete-value: 0
    #自定义填充策略接口实现
    meta-object-handler: com.wt.activiti.common.config.MybatisMetaObjectHandler
    #自定义SQL注入器
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: false
    cache-enabled: false

注: 上面的配置是我在开发中所需用到的一些配置,如果还想配置其他的相关参数,请参考下面的信息。

mybatis-plus:
  #外部化xml配置
  config-location: classpath:mybatis-config.xml
  #指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
  configuration-properties: classpath:mybatis/config.properties
  #xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath*:/mapper/*.xml
  #MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名
  type-aliases-package: net.xinhuamm.noah.api.model.entity,net.xinhuamm.noah.api.model.dto
  #如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
  type-aliases-super-type: java.lang.Object
  #枚举类 扫描路径,如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性
  type-enums-package: com.baomidou.mybatisplus.samples.quickstart.enums
  #项目启动会检查xml配置存在(只在开发时候打开)
  check-config-location: true
  #SIMPLE:该执行器类型不做特殊的事情,为每个语句的执行创建一个新的预处理语句,REUSE:该执行器类型会复用预处理语句,BATCH:该执行器类型会批量执行所有的更新语句
  default-executor-type: REUSE
  configuration:
    # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
    map-underscore-to-camel-case: false
    # 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true
    cache-enabled: false
    #懒加载
    aggressive-lazy-loading: true
    #NONE:不启用自动映射 PARTIAL:只对非嵌套的 resultMap 进行自动映射 FULL:对所有的 resultMap 都进行自动映射
    auto-mapping-behavior: partial
    #NONE:不做任何处理 (默认值)WARNING:以日志的形式打印相关警告信息 FAILING:当作映射失败处理,并抛出异常和详细信息
    auto-mapping-unknown-column-behavior: none
    #如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
    call-setters-on-nulls: true
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      #表名下划线命名默认true
      table-underline: true
      #id类型
      id-type: auto
      #是否开启大写命名,默认不开启
      capital-mode: false
      #逻辑已删除值,(逻辑删除下有效) 需要注入逻辑策略LogicSqlInjector 以@Bean方式注入
      logic-not-delete-value: 0
      #逻辑未删除值,(逻辑删除下有效)
      logic-delete-value: 1
      #数据库类型
      db-type: sql_server

3.创建实体类

根据对应的数据库表创建该表的实体类

@Data
@TableName("wf_v_todotask")
public class WfTodoTask {
    @TableField("TASK_ID")
    private String taskId;
    @TableField("city_code")
    private String cityCode;
    @TableField("PROC_INST_ID")
    private String procInstId;
    @TableField("business_id")
    private String businessId;
    @TableField("ACT_ID")
    private String actId;
}

4.使用MybatisPlus进行单表查询

1.Service层的代码书写

1.首先创建一个EntityWrapper对象
2.再根据EntityWrapper创建相应的sql语句
3.再调用mapper层的方法,这里面的方法都是mybatisPlus自动生成的

接口:

public interface WfTodoTaskService extends IService {
 List getPagedList(WfTodoTaskQueryInDto input);
}

实现层:

public class WfTodoTaskServiceImpl extends ServiceImpl implements WfTodoTaskService {
    public List getPagedList(WfTodoTaskQueryInDto input) {
        //创建EntityWrapper对象
        EntityWrapper ew = new EntityWrapper<>();
        //封装查询条件
        ew.andNew();
        ew.eq("city_code", input.getCityCode());
        ew.eq(!StringUtils.isEmpty(input.getBusinessId()), "business_id", input.getBusinessId());
        ew.eq(!StringUtils.isEmpty(input.getModelCode()), "model_code", input.getModelCode());
        ew.eq(!StringUtils.isEmpty(input.getProcInstId()), "PROC_INST_ID", input.getProcInstId());
        ew.eq(!StringUtils.isEmpty(input.getModelName()), "model_name", input.getModelName());
        ew.like(!StringUtils.isEmpty(input.getProcFolio()), "proc_folio", input.getProcFolio());
        ew.eq(!StringUtils.isEmpty(input.getActId()),"ACT_ID",input.getActId());
        ew.like(!StringUtils.isEmpty(input.getActName()), "ACT_NAME", input.getActName());
        ew.like(!StringUtils.isEmpty(input.getAssigneeName()), "ASSIGNEE_NAME", input.getAssigneeName());
        
        ew.like(!StringUtils.isEmpty(input.getOrigiatorName()), "origiatorName", input.getOrigiatorName());
        
        ew.ge(input.getProcStartDateBegin() != null,"proc_start_date",input.getProcStartDateBegin()); 
        //调用mapper层的方法,这里写baseMapper或者this都是可以的,调用的都是WfTodoTaskRepository里面的方法
        List list = baseMapper.selectList(ew);
        return list;
    }
 }

注:
1.service层接口需要继承IService<实体类>,这里的service层实现类继承ServiceImpl的作用就是不用再在service类里面注入mapper层的接口了,可以通过baseMapper.或者this.直接来调用mapper层接口的方法。
2.Mybatis-Plus通过EntityWrapper(简称EW,MP封装的一个查询条件构造器)或者Condition(与EW类似)来让用户自由的构建查询条件,条件有很多,列出如下:

查询方式 说明
setSqlSelect 设置SELECT查询字段
where WHERE语句,拼接 - WHERE条件
and AND语句,拼接 - AND 字段=值
andNew AND语句,拼接 - AND (字段=值)
or OR语句,拼接 - OR 字段=值
orNew OR语句,拼接 - OR(字段=值)
eq 等于=
allEq 基于map内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询LIKE
notLike 模糊查询NOT LIKE
in IN查询
notin NOT IN查询
isNull NULL值查询
isNotNull IS NOT NULL
groupBy 分组GROUP BY
having HAVING关键词
orderBy 排序ORDER BY
orderAsc ASC排序ORDER BY
orderDesc DESC排序ORDER BY
exists EXISTS条件语句
notExists NOT EXISTS条件语句
between BETWEEN条件语句
notBetween NOT BETWEEN条件语句
addFilter 自由拼接SQL
last 拼接在最后,例如last(“LIMIT 1”)

2.mapper层的代码的书写

@Repository
public interface WfTodoTaskRepository extends BaseMapper {

//注解sql
@Update("update wfl.wf_v_todotask set act_name=#{newName} where act_id=#{actid}")
    List updateActName(String newName,Integer actid);

//非注解sql,对应xml文件
    List getAllTask(Page pager,WfTodoTaskQueryInDto input);
}

注:
1.这里的mapper层接口我们要继承BaseMapper这个类,这个类里面的方法都是mybatisPlus自动生成的
2.BaseMapper里面的所有方法都是针对WfTodoTask这个实体类所对应的数据库表所生成的一系列方法,有时我们需要额外添加一些别的操作,我们就可以在这个WfTodoTaskRepository 接口里按照以往的方式去写一些我们需要的方法
3.要注意,xml文件的位置要写在我们先前在application.yml里面所配置的路径下





  																											

  
       
                          
                                   
                                   
                                   
                                   
                                   
                                   
                                   
                                                              
                                   
                                   
                                   
                                   
                    
  

4.BaseMapper类里面的方法说明

4.使用MybatisPlus进行分页操作

1.Service层的代码书写

1.创建EntityWrapper类,自定义查询条件,在 2.x版本用EntityWrapper,3.x版本用QueryWrapper
2.创建Page类,并设定偏移量和页码号
3.调用mybatisPlus的BaseMapper类里面的selectPage方法,对数据进行分页
注:这里继承ServiceImpl的目的就是为了可以在Service就可以使用MybatisPlus的方法,你可以通过this.或者baseMapper.的方式进行操作

public class WfTodoTaskServiceImpl extends ServiceImpl implements WfTodoTaskService {
    public List getPagedList(WfTodoTaskQueryInDto input) {
        //创建EntityWrapper对象
        EntityWrapper ew = new EntityWrapper<>();
        //封装查询条件
        ew.andNew();
        ew.eq("city_code", input.getCityCode());
        ew.eq(!StringUtils.isEmpty(input.getBusinessId()), "business_id", input.getBusinessId());
        ew.eq(!StringUtils.isEmpty(input.getModelCode()), "model_code", input.getModelCode());
        ew.eq(!StringUtils.isEmpty(input.getProcInstId()), "PROC_INST_ID", input.getProcInstId());
        ew.eq(!StringUtils.isEmpty(input.getModelName()), "model_name", input.getModelName());
        ew.like(!StringUtils.isEmpty(input.getProcFolio()), "proc_folio", input.getProcFolio());
        ew.eq(!StringUtils.isEmpty(input.getActId()),"ACT_ID",input.getActId());
        ew.like(!StringUtils.isEmpty(input.getActName()), "ACT_NAME", input.getActName());
        ew.like(!StringUtils.isEmpty(input.getAssigneeName()), "ASSIGNEE_NAME", input.getAssigneeName());
        
        ew.like(!StringUtils.isEmpty(input.getOrigiatorName()), "origiatorName", input.getOrigiatorName());
        
        ew.ge(input.getProcStartDateBegin() != null,"proc_start_date",input.getProcStartDateBegin()); 
        //创建Page类,设置页码和偏移量
        Page pager = new Page(1,10);
        //调用mapper层的方法,这里写baseMapper或者this都是可以的,调用的都是WfTodoTaskRepository里面的方法
        List list= baseMapper.selectPage(pager,ew);
        pager.setRecords(list);
        //这个类是我定义的分页查询结果的返回类
        return new PagedResultOutput(results.getTotal(), results.getCurrent(), results.getSize(), results.getRecords());
    }
 }

注:
1.mybatisPlus的BaseMapper类里面的selectPage与selectList这两个方法的区别就在于,一个传递了Page类作为参数,一个没有,当我们以Page类作为参数进行传参时,sql语句执行时,会执行两条语句,一条会查询出数据的总数目,一条会在sql语句的后面添加上limit以此来规定查出的具体数据,如下:

[BaseJdbcLogger.java : 159] :: ==> Preparing: SELECT COUNT(1) FROM wf_v_todotask WHERE (ASSIGNEE = ? OR CANDIDATE = ?) AND (city_code = ?) 
[BaseJdbcLogger.java : 159] :: ==> Parameters: USER_10013_8165726(String), USER_10013_8165726(String), 320100(String)
[BaseJdbcLogger.java : 159] :: ==>  Preparing: SELECT TASK_ID AS taskId,city_code AS cityCode,PROC_INST_ID AS procInstId,business_id AS businessId,ACT_ID AS actId,ACT_NAME AS actName,ASSIGNEE AS assignee,ASSIGNEE_NAME AS assigneeName,DELEGATION_ID AS delegationId,DESCRIPTION AS description,CREATE_TIME AS createTime,DUE_DATE AS dueDate,CANDIDATE AS candidate,CANDIDATE_NAME AS candidateName,FORM_KEY AS formKey,model_code AS modelCode,model_name AS modelName,origiator,origiatorName,proc_start_date AS procStartDate,proc_folio AS procFolio,proc_remark AS procRemark,model_category AS modelCategory FROM wf_v_todotask WHERE (ASSIGNEE = ? OR CANDIDATE = ?) AND (city_code = ?) ORDER BY CREATE_TIME DESC LIMIT 0,10 
[BaseJdbcLogger.java : 159] :: ==> Parameters: USER_10013_8165726(String), USER_10013_8165726(String), 320100(String)
[BaseJdbcLogger.java : 159] :: <==      Total: 10

2.如果我们不单单只是进行对这个实体类所对应的表进行单表查询,而是多张表进行联合操作,然后再利用Page类进行分页的话,可按如下操作:
service层:

public class WfTodoTaskServiceImpl extends ServiceImpl implements WfTodoTaskService {
    public List getPagedList(WfTodoTaskQueryInDto input) {
        //创建Page类,设置页码和偏移量
        Page pager = new Page(1,10);
        //调用mapper层的方法,不是BaseMapper里面的方法,而是你自己写的方法
        List list= baseMapper.getAllTask(pager,input);
        pager.setRecords(list);
        //这个类是我定义的分页查询结果的返回类
        return new PagedResultOutput(results.getTotal(), results.getCurrent(), results.getSize(), results.getRecords());
    }
 }

mapper层:

@Select("")
    })
    List getAllTask(Page pager,WfTodoTaskQueryInDto input);

其实就是仿照BaseMapper里面饿selectPage方法,传递一个Page类作为参数即可

你可能感兴趣的:(java)