mybatis plus 是mybatis 的增强版,在 MyBatis 的基础上只做增强不做改变,可以简化非常多增删改查的操作,并且让代码更易于维护。
一、引入MybatisPlus
这里使用的是MybatisPlus 3 和 SpringBoot 2.2.5.RELEASE 。
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
application.yml 里的配置
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/mybatis/**/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.jing.h5.domain.po
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 1
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull
jdbc-type-for-null: 'null'
mybatis plus 的配置文件(插件可以按需引入)
package com.jing.common.plus;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author jing
* @version 1.0
* @desc mybatis-plus配置类
* @date 2020/5/25 0025 10:55
**/
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfiguration {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 逻辑删除插件
*/
@Bean
public ISqlInjector logicSqlInjector() {
return new LogicSqlInjector();
}
/**
* 乐观锁 插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLocker() {
return new OptimisticLockerInterceptor();
}
}
二、生成代码
修改配置即可生成对应的代码,可以替代mybatis-generator 方案,生成数据库的增删改查。
package com.jing.common.plus;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* @author jing
* @version 1.0
* @desc 自动生成表结构
* @date 2020/5/25 0025 11:01
**/
public class MybatisPlusGenerator1 {
// 数据库ip地址
private static final String HOST = "127.0.0.1";
//数据库端口
private static final String PORT = "3306";
// 数据库用户名
private static final String USERNAME = "user";
// 数据库密码
private static final String PASSWORD = "pwd";
// 数据库
private static final String DATABASENAME = "dbName";
// 表名列表
private static final String[] TABLENAMES = {"table_name"};
// 项目地址,你要生成的位置地址
private static final String PATH = "D:\\Project\\src\\main\\java";
// 设置表名前缀
private static final String TABLE_PREFIX = "";
// 设置文件生成包名
private static final String PARENT = "com.jing.app.h5";
private static final String CONTROLLER = "controller";
private static final String SERVICE = "service";
private static final String MAPPER = "mapper";
private static final String SERVICE_IMPL = "service.impl";
private static final String DOMAIN = "domain.po";
private static final String AUTHOR = "jing";
public static void main(String[] args) {
generateByTables();
}
private static void generateByTables() {
GlobalConfig config = new GlobalConfig();
config.setIdType(IdType.AUTO).setFileOverride(true).setServiceName("%sService")
.setControllerName("%sController")
.setMapperName("%sMapper")
.setServiceImplName("%sServiceImpl")
.setXmlName("%sMapper")
.setAuthor(AUTHOR).setBaseColumnList(true);
// 数据库连接地址
String dbUrl = String.format("jdbc:mysql://%s:%s/%s", HOST, PORT, DATABASENAME) + "?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false";
// 数据库配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL).setUrl(dbUrl).setUsername(USERNAME).setPassword(PASSWORD).setDriverName("com.mysql.cj.jdbc.Driver");
// 表结构配置,可以设置是否支持 lombok
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(true).setEntityLombokModel(true).setNaming(NamingStrategy.underline_to_camel).setInclude(TABLENAMES).setTablePrefix(TABLE_PREFIX);
config.setActiveRecord(false).setFileOverride(true).setEnableCache(false).setOutputDir(PATH);
// 包名配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent(PARENT).setController(CONTROLLER).setEntity(DOMAIN).setService(SERVICE).setMapper(MAPPER).setServiceImpl(SERVICE_IMPL).setXml(MAPPER);
// 集成
new AutoGenerator().setGlobalConfig(config).setDataSource(dataSourceConfig).setStrategy(strategyConfig).setPackageInfo(packageConfig).execute();
}
}
如果在已有项目里使用的话,也可以直接改造现有代码,在不改变现有功能的情况下。
需要在对应的数据库对象上加上@TableName("table_name"),在主键上增加@TableId。
然后对应的mapper ,service ,serviceImpl 里分别继承BaseMapper,ServiceImpl,IService类。
最后在对应的xml 文件里增加
<sql id="Base_Column_List">
`id`, `field_name`, `create_time`, `update_time`
</sql>
详情看下方的使用说明。
三、简单使用
1、数据库对象 domain
package com.jing.back.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @desc 数据库对象,建议搭配 lombok 使用,这样表里新增字段会非常方便
*
* @author jing
* @date 2021-07-19
*/
// table_name 表名
@TableName("table_name")
@Data
public class TableName {
/**
* 主键,IdType.AUTO 表示自增主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 名称
*/
private String name;
/**
* 值
*/
private Integer value;
/**
* 创建时间,mybatis plus 的日期格式用的是 LocalDateTime
*/
private LocalDateTime createTime;
/**
* 是否删除,TableLogic 标明是逻辑删除字段,可以在配置文件里配置哪个值表示删除,
* 哪个值表示正常。注意还需要在配置类里引入逻辑删除的插件。
*/
@TableLogic
private Integer deleted;
/**
* 乐观锁,新增的时候需要设置初始值,修改的时候会自动加一,并且修改的时候会返回是否修改成功
*/
@Version
private Integer version;
}
2、业务类 service 和 serviceImpl
package com.jing.h5.service;
import com.jing.h5.domain.po.TableName;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author jing
* @since 2021-07-20
*/
public interface TableNameService extends IService<TableName> {
}
package com.jing.h5.service.impl;
import com.jing.domain.po.TableName;
import com.jing.h5.mapper.TableNameMapper;
import com.jing.h5.service.TableNameService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author jing
* @since 2021-07-20
*/
@Service
public class TableNameServiceImpl extends ServiceImpl<TableNameMapper, TableName> implements TableNameService {
}
3、mapper 和 mapper.xml
package com.jing.h5.mapper;
import com.jing.h5.domain.po.TableName;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author jing
* @since 2021-07-20
*/
public interface TableNameMapper extends BaseMapper<TableName> {
}
<?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.jing.h5.mapper.TableNameMapper">
<!-- 通用查询结果列,注意如果有新增字段,这里也要补上 -->
<sql id="Base_Column_List">
id, name, value, deleted, version, create_time, update_time
</sql>
</mapper>
到此你就可以通过
@Resource
private TableNameService tableNameService;
来通过 service 调用里面增删改查的方法了。
基础方法包括:
增加: save, saveBatch, saveOrUpdate, saveOrUpdateBatch
修改:update, updateById, updateBatchById
删除:remove, removeById, removeByMap, removeByIds
查询:getById, listByIds, listByMap, getOne, getMap, getObj, count, list, page, listMaps, listObjs, pageMaps
基本支持常见的单表操作。 目前版本不支持多表联查。如果上面的不满足需求,也可以自己写sql 语句实现,mybatis plus 完全兼容 mybatis。
大多数业务里,需要通过条件筛选进行增删改查。 mybatis plus 里可以通过 QueryWrapper 来实现复杂的条件查询,详情如下。
package com.jing.h5.service.impl;
import com.jing.domain.po.TableName;
import com.jing.h5.mapper.TableNameMapper;
import com.jing.h5.service.TableNameService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* <p>
* 服务实现类
* </p>
*
* @author jing
* @since 2021-07-20
*/
@Service
public class TableNameServiceImpl extends ServiceImpl<TableNameMapper, TableName> implements TableNameService {
/**
* 查询列表
*
* @return 列表
*/
@Override
public List<TableName> getList(String name,List<Interge> ids) {
QueryWrapper<ActivityConfig> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(TableName::getName, name);
wrapper.lambda().in(TableName::getId, ids)
wrapper.lambda().orderByAsc(TableName:getCreateTime);
List<ActivityConfig> list = this.list(wrapper);
return list;
}
/**
* 分页查询,注意如果引入了 pageHelper, 那么mybatis plus 返回的总条数是有问题的,需要重新查
一下总条数
*
* @return 列表
*/
@Override
public List<TableName> getList(String name,List<Interge> ids, int pageNum, int pageSize) {
QueryWrapper<ActivityConfig> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(TableName::getName, name);
wrapper.lambda().in(TableName::getId, ids)
// 由于mysql 在排序条件相同时会随机排序,所以在分页的情况下,排序条件需要再加上id,避免随机排序导致的数据重复。
wrapper.lambda().orderByAsc(TableName:getCreateTime, TableName::getId);
IPage<ActivityConfig> page = this.page(new Page<>(pageNum, pageSize), wrapper);
return page.getRecords();
}
}
附上mybatis plus 官方文档 https://baomidou.com/guide/
到此结束,感谢观看。