一、自动映射规则:
1.1.概述:
- 1.Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现
- 2.MybatisPlus是基于Mybatis的增强工具,所以也具有这样的映射规则。我们先来了解一下自动映射规则
1.2.自动映射规则:
- 1.
表名和实体类名映射: 表名user -> 实体类名User - 2.
字段名和实体类属性名映射:字段名name -> 实体类属性名name - 3.字段名下划线命名方式和实体类属性小驼峰命名方式映射:-> 字段名 user_email 实体类属性名 userEmail
二、映射配置:
2.1.下划线转驼峰映射:
a.映射规则:
- MybatisPlus支持下划线转驼峰的这种映射规则,配置实现方式:
map-underscore-to-camel-case: true表示支持下划线到驼峰的映射- map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射
b.配置实现:
- 配置文件修改:
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
2.2.表名映射的两种情况:
方式1:注解实现
- 1.通过
@TableName()注解可实现代码中的实体类名与表名的映射 - 2.如数据库的表为powershop_user,要完成表名和实体类名的映射,需要将实体类名中使用注解
@TableName("powershop_user")实现
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("powershop_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
方式2:配置文件实现:
- 1.通过配置文件,可以实现实体类名与表名的映射
- 2.如果有很多实体类,对应到数据库中的很多表,我们不需要每个依次配置,只需要
配置一个全局的设置,他都会给每个实体类名前面添加指定的前缀,这里我们演示一下全局配置的效果
mybatis-plus:
global-config:
db-config:
table-prefix: powershop_
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
2.3.字段与实体类的属性不一致时的映射
a.说明:
- 1.当数据库字段和表中实体类的属性不一致时,我们可以使用
@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致 - 2.数据库字段的名称我们为username,实体类中的字段名是name,那么可以使用
@TableField()中指定的名称username进行拼接,完成查询
b.映射案例:
- 此时的SQL语句是这样的:
SELECT id,username AS name,email FROM powershop_user
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableField("username")
private String name;
}
2.4.字段是关键字时的映射:
a.说明:
- 1.数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接sql语句,但是当实体类中的某个字段名是SQL中的关键字时,就会出现问题, 例如:
SELECT id,username AS name,age,email,desc FROM powershop_user,这条语句直接进行查询的时候,会出现错误
Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desc FROM powershop_user’ at line 1
- 2.原因是 ,
desc属于关键字,不能直接用于sql查询,要解决这个问题,就需要将desc字段加上``符号,将他变为不是关键字,才能完成查询
b.解决方案:
- 3.这个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过 @TableField() 改变实体类的属性名称,将desc变为
desc,就可以解决这个问题,此时可以观察到,框架拼接生成的SQL语句的字段名称变为了desc,这样是可以正常完成查询的
c.映射案例:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableField("`desc`")
private String desc;
}

2.5.字段失效
a.说明:
- 1.当数据库中有字段不希望被查询,我们可以通过
@TableField(select = false)来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段 - 2.如:如果不想显示年龄信息,那么可以在age属性上添加这个注解,来隐藏这个字段
b.映射案例:
- 1.编码实现:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableField(select = false)
private Integer age;
}
- 2.生成的SQL语句如下,通过查询生成的SQL语句,发现并没有拼接age字段

2.6.视图属性:
a.说明:
- 1.在实际开发中,
有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段 - 2.根据之前的经验,框架会默认将实体类中的属性作为查询字段进行拼接,那我们来思考,像这种视图字段,不能够作为查询条件么,因为数据库中没有这个字段,所以查询字段如果包含这个字段,SQL语句会出现问题。我们通过
@TableField(exist = false)来去掉这个字段,不让他作为查询字段
b.映射案例:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableField(exist = false)
private Integer online;
}
可以看到查询结果中不包含该字段

这一部分,我们讲解了MybatisPlus的映射规则,以及如果通过注解配置来改变这种映射规则
3万+

被折叠的 条评论
为什么被折叠?



