Mybatis-plus之映射篇(部分注解使用)

Posted 汤姆猫少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-plus之映射篇(部分注解使用)相关的知识,希望对你有一定的参考价值。

1. pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.atguigu</groupId>
    <artifactId>mybatis_plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatis_plus</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--lombok用来简化实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- JSON ↔ Object -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
        <!-- IOC装配,池化技术 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.7.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2. 注解分析

前言,Mybatis-plus中默认开启驼峰式下划线转换映射。即库中 top_id 查到数据后—》会映射到实体类中 topId 该属性上。
可以手动关闭:

mybatis-plus.configuration.map-underscore-to-camel-case=false

关闭后 top_id —》top_id

2.1 @TableName

属性类型必须默认描述
valueString“”表名,不加则默认 类名
schemaString“”schema(@since 3.1.1)
keepGlobalPrefixStringfalse使用全局的 tablePrefix 值?
resultMapString“”xml 中 resultMap 的id
autoResultMapStringfalse是否自动构建 resultMap (设置了resultMap则无效)
excludePropertyString[][ ]需要排除的属性名

schema 在数据库中,schema是数据库的组织和结构。不同的数据库schema的作用有差异。例如:

 Mysql(一般不使用):  在MySQL中基本认为schema和数据库相同,也就是说schema的名称和数据库的实例的名称相同,一个数据库有一个schema。

PostgreSQL(同下):  而在PostgreSQL中,可以创建一个数据库,然后在数据库中,创建不同的schema,每个schema又有着一些各自的表,索引等。

Oracle(一个库中不同空间有两个同名的表): 类似pgsql,可以理解为表空间。

resultMap 需要手动在xml写映射。
例如:

@TableName(resultMap = "userRole")  //采用xml中 id = userRole 的映射。
public class User  
    private Integer id;
    private String name;
    private String address;
    private String sex;

    //一个用户对应多个账户,也就是一个User有多个Account对象。
    private List<Account> account; //对应collection中的 property="account"

    //一个用户有多个角色
    private List<Role> roles;
<!--定义封装Role和user的resultmap-->
    <resultMap id="userRole" type="user">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <result property="address" column="address"/>
        <collection property="roles"  ofType="role">
            <id property="roleId" column="role_id"/>
            <result property="roleName" column="role_name"/>
            <result property="roleDesc" column="role_desc"/>
        </collection>
    </resultMap>

autoResultMap 自动映射,此处别有洞天
通常配合 @TableField() 一起使用,确定映射规范性。

  • 情况一:不开启autoResultMap,即autoResultMap=false
    • 开启下划线转换(默认开启)
      库中查询结果列名 top_id —》topId
    • 关闭下划线转换
      库中查询结果列名 top_id —》top_id
  • 情况二: 开启autoResultMap,即autoResultMap=true
    此时映射,下划线转换 开不开都不受影响。默认会使用属性名作为映射。
    private Long top_id; 即映射规则 库top_id —》top_id
  • 情况三:若库中属性和字段名不同。则可以使用@TableField()固定。name_ip —》name_ip

    @TableField(value = “name_ip”) //不设定查询列的时候也默认该值。
    private String name;

excludeProperty 干啥都排除某属性。

@TableName(excludeProperty = "address,sex") //排除address和sex
public class User  
    private Integer id;
    private String name;
    private String address;
    private String sex;

2.2 @TableId

2.3 @TableField

补充一下,exist = false 的时候,和 excludeProperty 干啥都排除某属性。是同一种效果。

以下注解不常用

2.4 @Version

乐观锁注解、标记 @Verison 在字段上

2.5 @EnumValue

通枚举类注解(注解在枚举字段上)

2.6 @TableLogic

表字段逻辑处理注解(逻辑删除)

2.7 @SqlParser

租户注解

2.8 @KeySequence

序列主键策略

3. 问题箱

3.1 什么情况下会出现查询结果为null呢?

结论
若查询结果有数据Total: 2,但是一条字段都映射不上,就会出现null
解决方案

  • 1. 关闭Mybatis-plus的驼峰下划线转换。
    mybatis-plus.configuration.map-underscore-to-camel-case= false。但是这个只能解决top_id的映射。
  • 2. 自定义映射,详情上看resultMap
  • 3. 自动映射,@TableName(autoResultMap = true)
    此时激活@TableField(value = "name_ip")name_ip能正确映射。
    top_id没有使用@TableField,所以默认属性名,top_id。对应,能正确映射。

若代码过多字段命名不规范,建议使用第三种。如图所示:

情景复现

@Date //一定要有lombok(不然自己写),因为映射是通过set方法放值的。
public class User1 
    @TableId(type = IdType.AUTO)
    private Long top_id;
    @TableField(value = "name_ip")
    private String name;
    @TableField(value = "address")
    private String address;
    @TableField(value = "sex")
    private String sex;

@Repository
public interface UserGateway extends BaseMapper<User1> 

   @Autowired
    UserGateway userGateway;
    @Test
    void jpaTset()
        QueryWrapper<User1> qu = new QueryWrapper<>();
        qu.select("top_id,name_ip");
        qu.in("name_ip", "牛一","牛二");
        List<User1> user1s=userGateway.selectList(qu);
        System.out.println(JSON.toJSONString(user1s));
    

以上是关于Mybatis-plus之映射篇(部分注解使用)的主要内容,如果未能解决你的问题,请参考以下文章

mybatis-plus查询时不能映射字段

MyBatis应用开发应用之开发方式注解方式篇

mybatis-plus思维导图,让mybatis-plus不再难懂

mybatis-plus小技能:代码生成器(增加Mapper注解和Fill填充)

mybatis-plus小技能:代码生成器(增加Mapper注解和Fill填充)

java面试之Mybatis篇