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
属性 | 类型 | 必须 | 默认 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 表名,不加则默认 类名 |
schema | String | 否 | “” | schema(@since 3.1.1) |
keepGlobalPrefix | String | 否 | false | 使用全局的 tablePrefix 值? |
resultMap | String | 否 | “” | xml 中 resultMap 的id |
autoResultMap | String | 否 | false | 是否自动构建 resultMap (设置了resultMap则无效) |
excludeProperty | String[] | 否 | [ ] | 需要排除的属性名 |
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));
}
相关文章
暂无评论...