Spring Boot 整合 Mybatis Plus(从零开始学习Mybatis Plus)

Spring Boot 整合 Mybatis Plus(从零开始学习Mybatis Plus)

什么是Mybatis Plus

Mybatis:Mybatis是一款面向对象的关系型数据库。

Mybatis Plus:Mybatis Plus在Mybatis的基础上,简化了开发步骤,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。所以,在学习MybatisPlus之前应该对Mybatis有充分的认识,熟悉Mybatis的开发流程。

本文基于Spring Boot编写

Maven

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

注解

@TableName

表名注解,用于实体类和数据库中表的映射,当实体类类名与数据库中表名一致时,无需加此注解。

例:

@TableName("user")
public class Student {
    private Integer id;
    private String name;
    private Integer age;
}

@TableId

主键注解,标明主键。

可添加主键名,与数据库中的主键映射起来。

例:数据库中user表分别有id name age三个属性。但实体类中的属性名为myId,无法自动映射。

@TableName("user")
public class Student {
    @TableId("id")
    private Integer myId;
    private String name;
    private Integer age;
}

执行查询语句后,控制台如下:

==>  Preparing: SELECT id AS myId,name,age FROM user 
==> Parameters: 
<==    Columns: myId, name, age
<==        Row: 1, zhangsan, 22
<==        Row: 2, lisi, 23
<==        Row: 3, wangwu, 24
<==        Row: 4, zhaoliu, 25
<==      Total: 4
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5434e40c]
Student(myId=1, name=zhangsan, age=22)
Student(myId=2, name=lisi, age=23)
Student(myId=3, name=wangwu, age=24)
Student(myId=4, name=zhaoliu, age=25)

我们通过通知台可以看出,Mybatis Plus 自动将id 映射为myId,并且输出。

还可添加type,表明主键的类型。

例:使用type = IdType.AUTO

取消数据库中id的自增选项,通过实体类注解实现id自增。

@TableName("user")
public class Student {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer myId;
    private String name;
    private Integer age;
}

例:使用 type = IdType.INPUT

当你给Id赋值时,Id会使用你所输入的值,添加到数据库;当你不赋值时,会自动递增。

@Test
    void save() {
        Student student = new Student();
        student.setMyId(6);
        student.setAge(100);
        student.setName("testPerson");
        mapper.insert(student);

    }
    @Test
    void save() {
        Student student = new Student();
        student.setAge(99);
        student.setName("testPerson1");
        mapper.insert(student);

    }

执行添加语句后,数据库如下:

1zhangsan22
2lisi23
3wangwu24
6testPerson100
7testPerson199

可知,当我们赋予主键值为6时,直接在数据库中插入id为6的数据,跳过了4、5,在插入testPerson1的数据时,没有给出id,所以系统通过自增的方式给id赋值。

例: type = IdType.ASSIGN_ID

注:因为默认使用了雪花算法,对主键的数据类型有要求,建议用包装类Long

idnameage
126894546124674testPerson596

例4:type = IdType.ASSIGN_UUID

注:因为默认使用了雪花算法,对主键的数据类型有要求,必须使用String类型。

idnameage
b1w26rsar894y5g46sr12467i4feq56testPerson696

@TableField

非主键注解,标明数据库属性与实体类的映射关系。输出结果和@TableId基本相同,这里不再演示。

@Version

乐观锁的主要目的时防止多线程修改数据时,数据被多次修改,数据库无法及时更新的现象。

例:

给数据库添加version属性,并给出默认值。

idnameageversion
xxxxxxx1

给实体类添加@Version注解

    @Version
    private Integer version;

添加配置类,将乐观锁注入到容器中。

@Configuration
public class StudentConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

进行修改操作

    @Test
    void update(){
        Student student  = mapper.selectById(3);
        student.setName("zhangsanfeng");
        mapper.updateById(student);
    }

通过控制台我们可知

==>  Preparing: UPDATE user SET name=?, age=?, version=? WHERE id=? AND version=? 
==> Parameters: zhangsanfeng(String), 24(Integer), 2(Integer), 3(Integer), 1(Integer)
<==    Updates: 1

不但对姓名做了修改,当这条SQL语句成功后,version变为了2

原数据库

idnameageversion
3zhansgan121

修改后的数据库

idnameageversion
3zhangsanfengxx2

@EnumValue

通过枚举,将数据库中的字段映射成具有实际意义的新字段。

例:在数据库中,1代表男性 2代表女性,通过枚举,在控制台上直接输出sex = 男性而不是sex = 1

创建枚举类

public enum SexEnum {
    SEXM(1,"男性"),
    SEXF(2,"女性");
      
    @EnumValue
    private Integer code;
    private String sex;
    
    SexEnum(Integer code, String sex) {
        this.code = code;
        this.sex = sex;
    }
}

实体类中添加性别属性

    private SexEnum sex;

修改application.yml

  type-enums-package: com.woongcha.myspringbootmybatisplus.enums

执行查询语句

Student(myId=1, name=zhangsan, age=22, version=1, sex=SEXM)
Student(myId=2, name=lisi, age=23, version=1, sex=SEXM)
Student(myId=3, name=zhangsanfeng, age=24, version=2, sex=SEXM)

可以看到,sex=1被替换成了sex=SEXM。

@TableLogic

表字段逻辑处理注解(逻辑删除),即部分数据我们不想展示出来,可以隐藏起来。

实体类中添加隐藏属性

	private Integer hide;

修改application.yml

  global-config:
    db-config:
      logic-not-delete-value: 0
      logic-delete-field: 1	

执行删除语句

    @Test
    void delete() {
        mapper.deleteById(1);
    }

查看数据库

idnameagehide
1zhangsan221

数据并没有从数据库中删除,但hide的值由0变成了1,达到了逻辑上删除的目的。

执行查询语句

    @Test
    void test() {
        mapper.selectList(null).forEach(System.out::println);
    }
==>  Preparing: SELECT id AS myId,name,age,version,sex,hide FROM user WHERE hide=0 
==> Parameters: 
<==    Columns: myId, name, age, version, sex, hide
<==        Row: 2, lisi, 23, 1, 1, 0
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7da39774]
Student(myId=2, name=lisi, age=23, version=1, sex=SEXM, hide=0)

SQL语句默认执行where hide=0,说明逻辑删除成功,且查不到我们删除的数据。

手动编写SQL语句

    @Test
    void inSQL() {
        QueryWrapper wrapper =new QueryWrapper();
        wrapper.inSql("id","select id from user Where id = 1");
        System.out.println(mapper.selectList(wrapper));
    }

控制台可以看到查询到了结果

==>  Preparing: SELECT id AS myId,name,age,version,sex,hide FROM user WHERE hide=0 AND (id IN (select id from user Where id = 1)) 
==> Parameters: 
<==    Columns: myId, name, age, version, sex, hide
<==        Row: 1, zhangsan, 22, 1, 1, 0
<==      Total: 1

Mybatis Plus 逆向工程

什么是逆向工程?

逆向工程是通过数据库中已经存在的数据表,反向生成java中的实体类,并且生成对应的ORM(Object Relationship Mapping 对象关系映射)持久层代码。

在Mybatis官方中给出了Mybatis Generator(MBG),在Mybatis Plus中,AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

引入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.2</version>
</dependency>

在任意路径新建Generator.java

public class Generator {
    public static void main(String[] args) {


        // 代码生成器-创建generator对象
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("woongcha");
        gc.setOpen(false);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setUrl("jdbc:mysql://localhost:3306/myspringboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.woongcha.myspringbootmybatisplus");
        pc.setModuleName("generator");
        pc.setController("controller");
        pc.setService("service");
        pc.setServiceImpl("mapper");
        pc.setEntity("entity");
        mpg.setPackageInfo(pc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        mpg.setStrategy(strategy);
        mpg.execute();
    }
}

运行Generator.java

快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码。

总结

Mybatis Plus 由中国人开发,相比Mybaits,跟符合中国人的习惯,例如中文的注释等。

相比Mybatis 主要简化了编写SQL语句的过程,且提供了大量的接口,符合大多数人的使用。

Mybaits Plus Generator 集成了MBG的优点,且更灵活,能介入的更多,例如下划线命名法转换成驼峰命名等。

本文简化了CRUD的介绍,因为CRUD在编程的过程中Mybatis Plus过程中会有大量的中文提示,会明确的告诉你方法的意思以及属性的填写。

码字不易,感谢支持。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页