spring boot整合mybatis plus

简介

MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

本文环境

  • jdk1.8
  • spring boot 2.1.8.RELEASE
  • mybatis-plus 3.2.0
  • mysql 5.1.47

MyBatis-Plus的逆向工程

一、添加依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--mybatis-plus代码生成-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--mybatis plus默认的模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.1</version>
        </dependency>
注:MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖 mybatis-plus-generator

二、yml文件配置

直接贴上最简单的配置

server:
  port: 8080
spring:
  application:
    name: mybatis_plus
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/user?characterEncoding=utf8&useSSL=false
    username: root
    password: root
mybatis-plus:
  type-aliases-package: top.mybatis_plus.user.entity
  mapper-locations: classpath:top/mybatis_plus/user/mapper/xml/*.xml

三、代码生成器

		AutoGenerator autoGenerator = new AutoGenerator();
        //全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");//项目路径
        globalConfig.setOutputDir(projectPath + "/src/main/java")
                .setAuthor("wwh")
                .setOpen(false)
                .setFileOverride(true)//生成的文件是否覆盖
                .setIdType(IdType.INPUT)//ID类型
                .setActiveRecord(false);//不支持ActiveRecord
        autoGenerator.setGlobalConfig(globalConfig);
        //数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL)
                .setUrl("jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false&serverTimezone=UTC")
                .setDriverName("com.mysql.jdbc.Driver")
                .setUsername("root")
                .setPassword("root");
        autoGenerator.setDataSource(dataSourceConfig);
        //包配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("top.mybatis_plus.user")
                .setController("controller")
                .setService("service")
                .setServiceImpl("service.impl")
                .setEntity("entity")
                .setMapper("mapper")
                .setXml("mapper.xml");
        autoGenerator.setPackageInfo(packageConfig);
        // 策略配置
        StrategyConfig strategyConfig = new StrategyConfig()
                .setNaming(NamingStrategy.underline_to_camel)
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setEntityLombokModel(true)//lombok模式的实体类
                .setRestControllerStyle(true)//RestController
                .setControllerMappingHyphenStyle(true)
                .setInclude("user");//这里输入要生成的表名
        autoGenerator.setStrategy(strategyConfig);
        autoGenerator.execute();

执行这段代码就可以生成文件,当然数据库连接要配成自己的。

注:mapper文件要加上注解@Mapper注解

一般我们都会重新写service层,因为service层和业务相关,自动生成的文件带上父类反而不好用(也可能是我没找到service生成的方法)

四、CRUD操作

上面已经生成成功文件,下面进行简单的CRUD操作

controller层

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/selectUserById/{id}")
    public User selectUserById(@PathVariable("id") int id){
        return userService.selectUserById(id);
    }

    @PostMapping("/saveUser")
    public void saveUser(User user){
        userService.saveUser(user);
    }

    @PostMapping("/updateUser")
    public void UpdateUser(User user){
        userService.updateUser(user);
    }

    @PostMapping("/deleteUser/{id}")
    public void deleteUser(@PathVariable("id") int id) {
        userService.deleteUser(id);
    }
}

service层

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public User selectUserById(int id) {
        return userMapper.selectOne(new QueryWrapper<User>().eq("id",id));
    }

    @Override
    public void saveUser(User user) {
        userMapper.insert(user);
    }

    @Override
    public void updateUser(User user) {
        userMapper.updateById(user);
    }

    @Override
    public void deleteUser(int id) {
        userMapper.deleteById(id);
    }
}

dao层

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

实体类

//生成get,set方法
@Data
//生成equals和hashcode方法,默认不管父类继承的属性
@EqualsAndHashCode(callSuper = false)
//生成的set方法默认返回本实体类
@Accessors(chain = true)
public class User implements Serializable {

    private static final long serialVersionUID=1L;

    @TableId(value = "id", type = IdType.INPUT)
    private Integer id;

    /**
     * 用户名
     */
    private String name;

    /**
     * 手机号
     */
    private String phone;
    
    /**
     * 状态 0 已删除 1 正常
     */
    @TableLogic
    private Integer status;
}

接口测试都是可以运行的,这里就不贴结果了。
项目目录
spring boot整合mybatis plus_第1张图片

五、开发中遇到的问题

1、Mybatis-plus插入、修改时,属性为null时,该属性不会改变
原因:mybatis plus的字段策略默认为非null,也就是说当字段属性为null时,该字段不会被更新。

mybatis plus有三种字段策略:

  • IGNORED:忽略
  • NOT_NULL:非 NULL( 默认策略 )
  • NOT_EMPTY:非空

解决办法:
(1)修改全局的验证策略

mybatis-plus:
  global-config:
    db-config:
      insert-strategy: ignored
      update-strategy: ignored
注:字段验证策略 3.1.2之后使用这三个insertStrategy,updateStrategy,whereStrategy

(2)调整字段验证注解

	@TableField(updateStrategy = FieldStrategy.IGNORED)
    private String name;

(3)使用 UpdateWrapper(基本上没用过)

userMapper.update(user,new UpdateWrapper<User>()
                .set("name",null).eq("id",user.getId()));

2、逻辑删除
有一次查找数据时怎么都查不到数据,最后找了半天发现是逻辑删除值没有配置,每次查找的时候都会带上status=0(逻辑未删除值默认是0)
什么是逻辑删除
逻辑删除是为了方便数据恢复和保护数据本身价值的一种方案,逻辑删除不是针对删除数据,而是将数据的状态设置为已删除状态,查询的时候会自动查询状态为未删除的数据。

逻辑删除配置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 0 #逻辑删除状态
      logic-not-delete-value: 1 #逻辑未删除状态

在实体类字段加上注解@TableLogic

	@TableLogic
    private Integer status;

删除时 UPDATE user SET status=0 WHERE id=? AND status=1
查找时 select * from user where status=1

你可能感兴趣的:(SpringBoot,mybatis)