JavaWeb框架搭建之旅(三)----集成mybatisplus

我们先来集成一下mybatis-plus实现对mysql的操作。
TODO目录

Mybatis-Plus我在这里就不做过多介绍了,这里是它的官方网站。

集成前的准备,数据库

这里我准备列一个mysql数据库,就用mybatisplus提供的官方数据库表来做示范(我修改了表名)。建表语句和插值语句如下:

DROP TABLE IF EXISTS `user_test`;

CREATE TABLE `user_test`
(
    id BIGINT NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

INSERT INTO `user_test` (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

集成mybatis-plus

在项目pom文件里添加mysql和Mybatis-Plus的依赖,如下:

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

注意,这里版本是3.5.7,有可能会下不下来,查阅了Mybatis-Plus官方文档的描述,说是因为我用的是阿里云的maven镜像配置,把mirrorof设置成了central,后来按照他提供的<mirrorOf>*,!snapshots</mirrorOf>就可以下下来了。这里推测应该也可以配置成<mirrorOf>*</mirrorOf>,这个配置说是阿里云有两个仓库,一个central存放的是maven中央仓库里的内容,另一个public是多个官方和第三方公共仓库的一个聚合仓库。这里不展开。

接下来在项目增加mysql数据库配置,数据库信息自行补全

spring:
  datasource:
    username: {userName}
    password: {password}
    url: jdbc:mysql://ip:host/databaseName?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

定义表实体类UserTest.java

package com.wakaka.summer.entity.table;

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

@Data
public class UserTest {
    @TableField(value = "id")
    private Long id;
    @TableField(value = "name")
    private String name;
    @TableField(value = "age")
    private Integer age;
    @TableField(value = "email")
    private String email;
}

定义Mapper.java

package com.wakaka.summer.repository.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wakaka.summer.entity.table.UserTest;

public interface UserTestMapper extends BaseMapper<UserTest> {
}

定义Controller.java写一个简单的查询接口

@RestController
@RequestMapping("/usertest")
public class UserTestController {

    @Autowired
    private UserTestMapper userTestMapper;

    @GetMapping("/getUserTestById")
    public UserTest getUserTestById(String id) {
        return userTestMapper.selectById(id);
    }
}

最后别忘记了,在启动类上新增扫描mapper文件的配置

@SpringBootApplication
@MapperScan("com.wakaka.summer.repository.mapper")
public class SummerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SummerApplication.class, args);
    }

}

最后启动项目,测试接口是否正常运行
接口访问成功
此时,Mybatis-Plus已经可以正常运行,简单的集成已经完成。

集成代码生成器

每新建一张数据库表都要写mapper.java,表实体类,servive,serviceimpl这几个类,这种无脑的工作还是麻烦,所以Mybatis-Plus提供了代码生成器,可以通过数据库表反向生成这几个文件。
引入依赖

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.7</version>
        </dependency>

在util包下创建一个代码生成器类:

public class MybatisCodeGenerator {

    public static void main(String[] args) {
        String url = "jdbc:mysql://47.103.147.83:3306/data?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&remarks=true&useInformationSchema=true";
        String username = "MQTT";
        String password = "MQTT";
        FastAutoGenerator.create(url,username,password)
                .globalConfig(builder -> builder
                        .author("wakaka")
                        .outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java")//生成的目录
                        .disableOpenDir()//禁止打开目录
//                        .commentDate("yyyy-MM-dd")//注释的时间格式
//                        .enableSwagger()//开启swagger模式
//                        .dateType(DateType.ONLY_DATE)//设置时间类型策略
//                        .commentDate("yyyy-MM-dd")//设置注释日期格式
                )
                .packageConfig(builder -> builder
                        .parent("com.wakaka.summer")//生成的路径
//                        .moduleName("moduleName")//设置父包模块名
                        .entity("entity.table")// Entity 包名
                        .mapper("repository.mapper")//设置 Mapper 包名
                        .service("service")//设置 Service 包名
                        .serviceImpl("service.impl")//设置 Service Impl 包名
                        .xml("repository.mapper.xml")//设置 Mapper XML 包名
                        .controller("controller")//设置 Controller 包名
//                        .pathInfo(Map<OutputFile, String>)
                )
                .strategyConfig(builder -> builder
                        .addInclude("user_test")// 设置需要生成的表名
//                        .addTablePrefix("t_", "c_") // 设置过滤表前缀
                        .entityBuilder()
                        .enableLombok()
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}

Mybatis-Plus很多都帮我们集成好了,我们只需要配置好生成的各种文件的路径,然后运行main方法就可以生成对应的代码了。
生成代码

自动注入字段属性

有些时候公司里的表设计,都会默认带有一些公共的字段,最常见的比如逻辑删除、创建人、创建时间、修改人、修改时间。Mybatis-Plus提供了方便的方式在操作表的时候可以自动注入这些字段。
首先我们先修改表结构,加上这几个字段。

DROP TABLE IF EXISTS `user_test`;

CREATE TABLE `user_test`
(
    id BIGINT NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	deleted INT NOT NULL COMMENT '是否删除',
	create_by VARCHAR(30) NOT NULL COMMENT '创建人',
	create_time DATETIME NOT NULL COMMENT '创建时间',
	update_by VARCHAR(30) NOT NULL COMMENT '修改人',
	update_time DATETIME NOT NULL COMMENT '修改时间',
    PRIMARY KEY (id)
);

修改代码生成器的代码。如下:

                .strategyConfig(builder -> builder
                        .addInclude("user_test")// 设置需要生成的表名
//                        .addTablePrefix("t_", "c_") // 设置过滤表前缀
                        .entityBuilder()
                                .superClass("com.wakaka.summer.entity.table.BaseEntity")
                        .enableLombok()

新增公共父类的代码,里面包含了各个公共属性,如下:

package com.wakaka.summer.entity.table;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.io.Serializable;
import java.util.Date;

public class BaseEntity implements Serializable {

    /**
     * 创建人
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    /**
     * 更新人
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    /**
     * 是否删除
     */
    @TableField(value = "deleted", fill = FieldFill.INSERT)
    @TableLogic(value = "0", delval = "1")
    private Integer deleted;
}

添加自定义字段填充类

@Component
public class BaseMetaObjectHandler implements MetaObjectHandler {

    private static final String userName = "wakaka";

    @Override
    public void insertFill(MetaObject metaObject) {
        setFieldValByName("createBy", userName, metaObject);
        setFieldValByName("createTime", new Date(), metaObject);
        setFieldValByName("updateBy", userName, metaObject);
        setFieldValByName("updateTime", new Date(), metaObject);
        setFieldValByName("deleted", 0, metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName("updateBy", userName, metaObject);
        setFieldValByName("updateTime", new Date(), metaObject);
    }
}

然后我们写两个接口一个新增一个修改来测试一下是否成功。代码如下:

@RestController
@RequestMapping("/userTest")
public class UserTestController {

    @Autowired
    private IUserTestService iUserTestService;

    @GetMapping("/addUserTest")
    public boolean addUserTest(UserTest userTest) {
        return iUserTestService.save(userTest);
    }

    @GetMapping("/updateUserTest")
    public boolean updateUserTest(UserTest userTest) {
        return iUserTestService.saveOrUpdate(userTest);
    }

}

启动项目,请求新增接口:
新增接口
新增成功
在这里插入图片描述

修改成功
新增修改都成功了,且时间也会随着改变。
注意: 可能会遇到时间与当前时间正好相差8小时的情况,那是因为时区的设置不对,可以把项目里的数据库url配置里的时区设置为serverTimezone=Asia/Shanghai即可解决。

踩坑记录

重复运行代码生成器会覆盖原文件

默认的代码生成器配置是不会覆盖已生成的文件的,当你配置好生成路径然后运行并生成了代码,你再次执行的时候,代码生成器会友好的提示你的
在这里插入图片描述
个人建议是不要打开覆盖的配置,因为代码生成器其实可以支持一次性生成多张表的对应代码的,等项目逐渐做起来后,后续一般只会有单独新建表的需求的 ,是不会大批量的去执行生成代码。

相关链接

Mybatis-Plus官方网站

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wakaka123123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值