浅入MyBatis-Plus(学习笔记))
一.简介
MyBatisPlus可以节省我们大量工作时间,所有单表的CRUD代码它都可以自动化完成,在原有的MyBatis基础上只做增加不做修改,提高开发效率,为简化开发而生---->官方文档
二.基本使用
1.导入对应依赖
<!--mybatis-plus(尽量不要和mybatis一起导入,可能有版本差异) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
2.增加配置信息
#这是mysql8版本的配置,驱动需要增加cj,还要新增时区serverTimezone=GMT
spring.datasource.url = jdbc:mysql://localhost:3306/demotwo?useUnicode=true&characterEncoding=utf8&useSSL=false&
spring.datasource.username = root
spring.datasource.password = Cjy.1120
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
3.增加数据表和对应实体类
@TableName("tb_goods")
public class GoodsEntity extends BaseEntity {
@TableId(type = IdType.AUTO) //设置添加Id的方式为自增(前提是数据库表字段也为自增)
private Long id;
private String name; //商品名称
private Integer type; //商品类型
private Double price; //商品价格
}
实体类的注解主要有三个:(里面的具体熟悉值可以看官方文档)
- @TableName :对应数据库里的表名
- @TableId :表里的主键
因为默认情况调用Insert()方法插入的主键是使用的雪花算法(ID_WORKER() ),生成的ID值比较大,所以如果需要设置插入的ID值为自增的话需要增加@TableId(type = IdType.AUTO)这个注解,然后数据表里的主键也要设为自增。
//属性源码解析(其他属性)
public enum IdType {
AUTO(0), //数据库id自增
NONE(1), //未设置主键
INPUT(2), //手动输入ID(自己配置ID)
ID_WORKER(3), //默认的全局唯一id
UUID(4), //全局唯一id uuid
ID_WORKER_STR(5); //ID_WORKER字符串表示法
}
- @TableField
需要MybatisPlus自动帮你填充数据时需要的注解,一般加创建时间或更新时间的字段上。
@TableField(fill = FieldFill.INSERT) //只在插入时生效
private Long createDate; //创建时间
@TableField(fill = FieldFill.INSERT_UPDATE) //插入或更新时生效
private Date createDate; //更新时间
当字段与数据库中的表名不一致时也可以用这个注解来配置映射关系。
@TableId("tb_name")
private String name; //商品名称
4.增加Dao层的类增加@Mapper注解
原来的MyBatis需要配置对应的**Mapper.XML文件才能使用,但是MyBatisPlus只需要继承BaseMapper< T >类就能直接使用(T是实体类),因为大部分的CRUD代码已经在该类里实现了。
@Mapper
public interface GoodsDao extends BaseDao<GoodsEntity> {
}
所以直接调用继承了这个接口的实现类的方法并传入对应参数就能使用。
GoodsDao.insert(GoodsEntity);
其它CRUD方法也是直接调用方法就能使用,还能根据接收的参数动态拼接sql。
三.自动填充功能
当数据库里有创建时间,更新时间的列的话MyBatisPlus会自动进行填充,不需要我们手动添加。我们需要做的就是在自己的数据库和实体类创建创建这两个数据,然后去自己的处理类MetaObjectHandler 类里配置填充策略。
@Component
public class FieldMetaObjectHandler implements MetaObjectHandler {
private final static String CREATE_DATE = "createDate";
private final static String UPDATE_DATE = "updateDate";
@Override
public void insertFill(MetaObject metaObject) {
UserDetail user = SecurityUser.getUser();
Date date = new Date();
//创建时间
strictInsertFill(metaObject, CREATE_DATE, Date.class, date); //第二个数据应该跟实体类中的数据一致
//更新时间
strictInsertFill(metaObject, UPDATE_DATE, Date.class, date);
}
@Override
public void updateFill(MetaObject metaObject) {
//更新时间
strictUpdateFill(metaObject, UPDATE_DATE, Date.class, new Date());
}
}
四.常用方法
- save: 保存
- saveBath: 批量保存
- updateById: 根据主键更新
- updateBatchById: 根据主键批量更新
- removeById : 根据主键删除
- removeByIds: 根据多个id删除
- getById : 根据主键查询
- getOne: 根据条件返回一个结果
- list: 查询所有,参数new QueryWrapper() listByIds: 根据多个id查询
- listMaps: 参数new QueryWrapper(),返回List
- listByMap:参数Map<String,Object>
- page: 分页查询,参数new Page(1,10),new QueryWrapper()
- pageMaps: 参数new QuweyWrapper(), 返回List
五.条件构造器
@Override
public QueryWrapper<GoodsEntity> getWrapper(Map<String, Object> params) {
QueryWrapper<GoodsEntity> wrapper = new QueryWrapper<>();
String name = (String) params.get("name");
String type = (String) params.get("type");
wrapper.like(StringUtils.isNotBlank(name), "name", name); //模糊查询
wrapper.eq(StringUtils.isNotBlank(type), "type", type); //精准查询
wrapper.isNotNull("price"); //price字段不为空
return wrapper;
}
//查询的时候可以增加查询条件 具体方法可阅读官网
扫描二维码关注公众号,回复:
15648440 查看本文章
六.代码生成器模板
需要的依赖:
<!-- mybatis-plus 核心包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--MyBatis-Plus代码生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!--MyBatis-Plus代码生成器模板引擎依赖-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
旧版:只在3.5.1以下使用
//代码生成器
public class CodeGenerator {
public static void main(String[] args) {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir"); //获取当前项目目录
gc
.setOutputDir(projectPath + "/renren-admin/src/main/java")//生成的代码都会在该项目的java文件夹下
.setAuthor("cjy") //设置作者名称
.setOpen(false) //生成后是否打开资源管理器
.setFileOverride(false) //重新生成时文件是否覆盖
// 自定义文件命名,注意 %s 会自动填充表实体属性!
.setMapperName("%sDao")
.setXmlName("%sDao")
.setEntityName("%sEntity")
.setServiceName("%sService")
.setIdType(IdType.ASSIGN_ID) //主键策略
.setDateType(DateType.ONLY_DATE) //定义生成的实体类中日期类型
.setSwagger2(true); //开启Swagger2模式
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc
.setUrl("jdbc:mysql://localhost:3306/security_enterprise?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true")
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUsername("root")
.setPassword("xxxxxx")
.setDbType(DbType.MYSQL); //数据库类型
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
pc
.setModuleName("demo") //模块名
.setParent("io.renren.modules") //在哪个路径下生成模块
.setController("controller") //生成的文件夹名称
.setEntity("entity")
.setService("service")
.setMapper("dao");
mpg.setPackageInfo(pc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy
.setInclude("sys_user") //!!!!生成要映射的表名
.setNaming(NamingStrategy.underline_to_camel) //表名生成策略(下划线转驼峰)
.setColumnNaming(NamingStrategy.underline_to_camel) //字段名生成策略,数据库表映射到实体的命名策略(下划线转驼峰)
.setSuperEntityClass("io.renren.common.entity.BaseEntity") //你自己的父类实体,没有就不用设置!(类必须存在)
.setSuperServiceClass("io.renren.common.service.BaseService")//你自己的Service父类接口,没有就不用设置!(类必须存在)
.setSuperServiceImplClass("io.renren.common.service.impl.BaseServiceImpl")//Service父类实现类,没有就不用设置!(类必须存在)
.setTablePrefix("sys_") //生成实体时去掉表前缀
// .setSuperEntityColumns(new String[] { "test_id", "age" }) // 自定义实体,公共字段
.setEntityLombokModel(true) //自动加上lombok的注解
.setRestControllerStyle(true); //restful api风格控制器
// .setControllerMappingHyphenStyle(true); //url中驼峰转连字符
// .setLogicDeleteFieldName("deleted"); //自动配置逻辑删除字段
mpg.setStrategy(strategy);
// 6、自动填充配置
TableFill creator = new TableFill("creator", FieldFill.INSERT);
TableFill createDate = new TableFill("createDate", FieldFill.INSERT);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(creator);
tableFills.add(createDate);
strategy.setTableFillList(tableFills);
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 7、执行
mpg.execute();
}
}
新版:3.5.1 及其以上版本使用
视频
其他功能可以阅读官方文档