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 。
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
根据对应的数据库表创建该表的实体类
@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;
}
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
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”) |
@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类里面的方法说明
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类作为参数即可