- 通用 CRUD:定义好 Mapper 接口后,只需要继承 BaseMapper 接口即可获得通用的增删改查功能,无需编写任何接口方法与配置文件
- 条件构造器:通过 EntityWrapper (实体包装类),可以用于拼接 SQL 语句,并且支持排序、分组查询等复杂的 SQL
- 代码生成器:支持一系列的策略配置与全局配置,比 MyBatis 的代码生成更好用
2.1 添加核心依赖
<!-- 数据库驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- mybatis-plus和Springboot整合--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <!-- mybatis-plus代码生成器--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency> <!-- 模板引擎 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency>复制代码
2.2 配置文件application.yml
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: suruomo url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 server: port: 8070复制代码功能体验
3.1 通用CRUD
实体类
package com.suruomo.mybatisplus.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.util.Date; /** * @Author: suruomo * @Date: 2020/8/25 14:38 * @Description: */ @Data @TableName(value = "sys_user") public class SysUser { /** * 登录账号 * type = IdType.INPUT表示主键输入 * 改为AUTO为自增 */ @TableId(type = IdType.INPUT) private String userId; /** * 用户昵称 */ private String userName; /** * 用户邮箱 */ private String email; /** * 手机号码 */ private String phonenumber; /** * 用户性别(0男 1女 2未知) */ private String sex; /** * 密码 */ private String password; /** * 帐号状态(0正常 1停用) */ private String status; /** * 删除标志(0代表存在 2代表删除) */ private String delFlag; /** * 最后登陆IP */ private String loginIp; /** * 最后登陆时间 */ private Date loginDate; /** * 创建者 */ private String createBy; /** * 创建时间 * 时间自动填充 */ @TableField(fill = FieldFill.INSERT) private Date createTime; /** * 更新者 */ private String updateBy; /** * 更新时间 * 时间自动修改 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }复制代码
Mapper接口
package com.suruomo.mybatisplus.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.suruomo.mybatisplus.entity.SysUser; import org.apache.ibatis.annotations.Mapper; /** * @Author: suruomo * @Date: 2020/8/25 14:40 * @Description: 继承 BaseMapper<T> 接口即可获得通用的增删改查功能 */ @Mapper public interface SysUserMapper extends BaseMapper<SysUser> { }复制代码
通用CRUD方法:
Service层
package com.suruomo.mybatisplus.service; import com.baomidou.mybatisplus.extension.service.IService; import com.suruomo.mybatisplus.entity.SysUser; /** * @Author: suruomo * @Date: 2020/8/25 19:34 * @Description: */ public interface SysUserService extends IService<SysUser> { }复制代码
package com.suruomo.mybatisplus.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.suruomo.mybatisplus.mapper.SysUserMapper; import com.suruomo.mybatisplus.entity.SysUser; import com.suruomo.mybatisplus.service.SysUserService; import org.springframework.stereotype.Service; /** * @Author: suruomo * @Date: 2020/8/25 19:36 * @Description: */ @Service public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService { }复制代码
测试
** * 通用Mapper层接口测试 * 普通CRUD+分页 */ @RunWith(SpringRunner.class) @SpringBootTest class MapperTest { @Resource private SysUserMapper sysUserMapper; /** * 查找所有 */ @Test void selectList() { List<SysUser> userList = sysUserMapper.selectList(null); userList.forEach(System.out::println); } /** * 分页查找 */ @Test void selectByPage() { Page<SysUser> page = new Page<>(1, 3); IPage<SysUser> userIPage = sysUserMapper.selectPage(page, null); System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数" + page.getPages()); List<SysUser> list=userIPage.getRecords(); list.forEach(System.out::println); } /** * 插入 */ @Test void insert(){ SysUser user=new SysUser(); user.setUserId("25"); user.setUserName("susu"); sysUserMapper.insert(user); } /** * 根据id删除 */ @Test void deleteById(){ sysUserMapper.deleteById("zxc"); } /** * 根据map删除 */ @Test void DeleteByMap(){ HashMap<String, Object> map = new HashMap<>(); map.put("user_id","25"); sysUserMapper.deleteByMap(map); } /** * 根据id更新 */ @Test void update(){ SysUser user=new SysUser(); user=sysUserMapper.selectById("ry"); user.setUserName("ry"); sysUserMapper.updateById(user); } }复制代码
3.2 自动填充功能
经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作: 1.数据库中添加相应字段 2.实体类中添加注解
/** * 创建时间 * 时间自动填充 */ @TableField(fill = FieldFill.INSERT) private Date createTime; /** * 更新时间 * 时间自动修改 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;复制代码
3.实现元对象处理器接口
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime", new Date(), metaObject); } }复制代码
3.3 分页功能
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 配置类:
@Configuration public class PaginationConfig { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor (); } }复制代码
使用:
/** * 分页查找 */ @Test void selectByPage() { Page<SysUser> page = new Page<>(1, 3); IPage<SysUser> userIPage = sysUserMapper.selectPage(page, null); System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数" + page.getPages()); List<SysUser> list=userIPage.getRecords(); list.forEach(System.out::println);复制代码
3.4 EntityWrapper 条件构造器
Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率
实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等
注意: 使用的是数据库的字段,不是java的属性名称
参数说明见:baomidou.com/guide/wrapp…
使用:
@RunWith(SpringRunner.class) @SpringBootTest public class QueryWrapperTest { @Resource private SysUserMapper sysUserMapper; @Test public void selectByInfo(){ QueryWrapper<SysUser> wrapper = new QueryWrapper<>(); // 查找性别为0,姓名为a开头的人 wrapper.select("user_id", "user_name", "email","sex").eq("sex", 0).like("user_name", "a"); List<SysUser> users = sysUserMapper.selectList(wrapper); users.forEach(user -> System.out.println(user)); } }复制代码
3.5 代码生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
public class GenerateCode { public static void main(String[] args) { // 需要构建一个 代码自动生成器 对象 AutoGenerator mpg = new AutoGenerator(); // 配置策略 // 1、全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath+"/src/main/java"); gc.setAuthor("suruomo");//作者名称 gc.setOpen(false); // 自定义文件命名,注意 %s 会自动填充表实体属性! gc.setServiceName("%sService"); gc.setControllerName("%sController"); gc.setServiceName("%sService"); gc.setServiceImplName("%sServiceImpl"); gc.setMapperName("%sMapper"); gc.setXmlName("%sMapper"); mpg.setGlobalConfig(gc); //2、设置数据源 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); // dsc.setDriverName("com.mysql.jdbc.Driver"); //mysql5.6以下的驱动 dsc.setUsername("root"); dsc.setPassword("suruomo"); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); //3、包的配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.suruomo"); //包名 pc.setModuleName("mybatisplus"); //模块名 pc.setEntity("entity"); pc.setMapper("mapper"); pc.setService("service"); pc.setController("controller"); mpg.setPackageInfo(pc); //4、策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("sys_user","aluminum","sys_log"); // 设置要映射的表名 strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); // 自动lombok; strategy.setLogicDeleteFieldName("deleted"); strategy.setRestControllerStyle(true); //rest请求 //自动转下划线,比如localhost:8080/hello_id_2 strategy.setControllerMappingHyphenStyle(true); mpg.setStrategy(strategy); mpg.execute(); //执行 } }复制代码