mybatisplus映射解读

举报
yd_249383650 发表于 2023/07/30 17:15:24 2023/07/30
【摘要】 ​ 目录自动映射表映射字段映射字段失效 视图属性Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现。既然MybatisPlus是基于Mybatis的增强工具,所以也具有这样的映射规则。我们先来了解一下自动映射规则。自动映射【1】表名和实体类名映射 -> 表名user   实体类名User...

 


目录

自动映射

表映射

字段映射

字段失效 

视图属性



Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现。既然MybatisPlus是基于Mybatis的增强工具,所以也具有这样的映射规则。

我们先来了解一下自动映射规则。

自动映射

  • 【1】表名和实体类名映射 -> 表名user   实体类名User
  • 【2】字段名和实体类属性名映射 -> 字段名name   实体类属性名name
  • 【3】字段名下划线命名方式和实体类属性小驼峰命名方式映射 -> 字段名 user_email   实体类属性名 userEmail

MybatisPlus支持这种映射规则,可以通过配置来设置

map-underscore-to-camel-case: true 表示支持下划线到驼峰的映射
map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射

可以在application.yml文件中进行配置:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true


表映射

通过@TableName()注解指定映射的数据库表名,就会按照指定的表名进行映射如:此时将数据库的表名改为study_user,要完成表名和实体类名的映射,需要将实体类名也要指定为study_user

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("study_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

果有很多实体类,对应到数据库中的很多表,我们不需要每个依次配置,只需要配置一个全局的设置,他都会给每个实体类名前面添加指定的前缀,这里我们演示一下在application.yml全局配置的效果

mybatis-plus:
  global-config:
    db-config:
      table-prefix: study_

表名的前缀为study_ 

字段映射

什么场景下会改变字段映射呢?

【1】当数据库字段和表实体类的属性不一致时,我们可以使用@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致
如:此时将数据库字段的名称我们改为username,在根据实体类的属性拼接SQL的使用,就会使用@TableField()中指定的名称username进行拼接,完成查询

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField("username")
    private String name;
   }

此时的SQL语句是这样的

SELECT id,username AS name,email FROM study_user


【2】数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接sql语句,例如:

SELECT  id,username AS name,age,email,desc  FROM study_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 study_user' at line 1

原因是,desc属于关键字,不能直接用于sql查询,要解决这个问题,就需要将desc字段加上``符号,将他变为不是关键字,才能完成查询,那这个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过@TableField()改变实体类的属性名称,将desc变为`desc`,就可以解决这个问题

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField("`desc`")
    private String desc;
}

字段失效 

当数据库中有字段不希望被查询,我们可以通过@TableField(select = false)来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段

如:如果不想显示年龄信息,那么可以在age属性上添加这个注解,来隐藏这个字段

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField(select = false)
    private Integer age;
}

生成的SQL语句如下,通过查询生成的SQL语句,发现并没有拼接age字段

编辑

视图属性

在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段。

根据之前的经验,框架会默认将实体类中的属性作为查询字段进行拼接,那我们来思考,像这种视图字段,能够作为查询条件么,显示是不能的。因为数据库中没有这个字段,所以查询字段如果包含这个字段,SQL语句会出现问题。我们通过@TableField(exist = false)来去掉这个字段,不让他作为查询字段。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField(exist = false)
    private Integer online;
}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。