文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Mybatis中自动映射规则(包含mp),setget方法作用,以及占位符理解

2023-09-06 07:44

关注

 
【1】表名和实体类名映射 -> 表名user 实体类名User
【2】字段名和实体类属性名映射 -> 数据库字段名name 实体类属性名name

   在这个映射里其实就是识别setget去掉前缀再小写首字母:

MyBatis 在进行自动映射时,会根据 Java 对象中的 Setter 方法(即属性的设置方法)来确定属性名,并将查询结果集中的列值赋给该属性。具体来说,MyBatis 会按照以下规则生成属性名:

  1. 获取 Setter 方法的名称,例如 setId
  2. 去掉 set 前缀,得到属性名的首字母大写形式,例如 Id
  3. 将属性名的首字母变为小写,得到属性名,例如 id(此时与数据库保持一致)

 所以只要get和set后面的名字跟数据库保持一致就可以了 在这里你完全可以将变量id的名字改成其他的也不会有影响,建议大家试一试便于理解。

【3】字段名下划线命名方式和实体类属性小驼峰命名方式映射 ->
字段名 user_email 实体类属性名 userEmail
MybatisPlus支持这种映射规则,可以通过配置来设置
map-underscore-to-camel-case: true 表示支持下划线到驼峰的映射
map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射
              ****** mybatisplus默认开启驼峰规则

    以上说的是mybatis和mybatisplus中都存在默认映射规则,因为最近我正在学习mp所以下面的表映射和字段映射我用的都是mp中规则,当然mybatis中也有相应的自定义映射规则。

     

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

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

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

 

3.字段映射

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

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

此时的SQL语句是这样的
SELECT id,username AS name,email FROM powershop_user

【2】数据库字段和表实体类的属性一致,框架在拼接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

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

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

 此时可以观察到,框架拼接生成的SQL语句的字段名称变为了desc,这样是可以正常完成查询的

MyBatis 中的自动映射(Auto Mapping)是指将查询结果自动映射到 Java 对象中,而不需要手动编写映射规则。在 MyBatis 中,自动映射的原则是将查询结果集中的列名(或列别名)与 Java 对象中的属性名进行匹配,如果匹配成功,则自动将列值赋给对应的属性。

在进行自动映射时,MyBatis 会使用 Java 对象中的 Setter 方法为属性赋值。Setter 方法是一种 Java 编程语言中的方法,用于设置类中的属性值。例如,如果 Java 对象中有一个名为 name 的属性,则 MyBatis 会在查询结果集中查找名为 name 的列,并调用 setUserName 方法将该列的值赋给该属性。

         总结来说就是当你用sql语句查询到结果后,mybaits会运用set方法将查询的数据赋给java对象,这样你就可以直接输出对象查看结果。(这里运用的就是上面自动映射的第二个  不懂的可以再滑上看看)

 

当使用 MyBatis 执行插入、更新或删除操作时,会根据 Java 对象中的 Getter 方法来获取属性值,并将属性值映射到数据库表的列中。下面是一个示例:

假设有一个名为 User 的 Java 类,其中包含一个名为 id 的属性:

public class User {    private Long id;    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }}

在进行插入操作时,MyBatis 会使用 getId() 方法获取 id 属性的值,并将该值映射到数据库表的列中。例如,对于以下的插入语句

INSERT INTO user (id) VALUES (#{id})

MyBatis 会自动调用 getId() 方法获取 id 属性的值,并将该值映射到 SQL 语句中的 #{id} 占位符中。

       总结来说就是当你增删改的时候,你传入一个对象参数这样mybatis就会把你传入的参数自动映射到占位符上

 

在 MyBatis 中,Getter 方法主要用于获取 Java 对象中的属性值,并将其映射到 SQL 语句中的 #{} 占位符或者查询结果集中的列中。

在 SQL 语句中,#{} 占位符用于接收参数值。MyBatis 会自动使用 Getter 方法获取 Java 对象中的属性值,并将该值映射到 #{} 占位符中。

    这里需要注意一个点就是当你传入一个对象的时候,mybatis会自动获取相应的属性来放到占位符中,举个例子:

SELECT * FROM user WHERE id = #{id}

     因为mybatis会自动获取 where后面字段id, WHERE 条件语句,并且条件中包含了 Java 对象中的属性时,MyBatis 会自动调用相应的 Getter 方法获取该属性的值,并将其映射到 SQL 语句中的条件中。  所以此时占位符可以随便写 如下:

SELECT * FROM user WHERE id = #{我好帅xxx}

   但是我们不可能每次都传入一个对象,很多时候我们只会传入一个参数,这个时候我们就不可以在占位符上随便写。举个例子:

Long id = 1L;List userList = sqlSession.selectList("com.example.UserMapper.selectUserById", id);

在这个例子中,将 id 变量参数值传递给 selectUserById 方法,MyBatis 会直接将 id 参数值映射到 SQL 语句中的 #{id} 占位符中,执行查询操作,并将查询结果集映射为 User 对象的列表返回。不过如果你想自定义字段名字可以在dao层的方法参数上加上如下注解。

@Param("userId") Long id,

      总的来说就是当你传入对象的时候占位符可以不受限制,但是当你传入的普通参数时必须和实体类属性一致,MyBatis 不会自动调用 Java 对象中的 Getter 方法获取属性值,而是直接将变量参数的值映射到 SQL 语句中的 #{} 占位符中。(也可以使用注解自定义)!!!


    第一次写博客的感想

      因为最近在学习springboot ,这个过程避免不了就要涉及到mybatisplus所以我在基本了解boot项目构建后就开始mp的学习。在学习mp的过程中发现很多mybatis的知识都忘了还有一些根本都不了解,所以写下这个博客文章记录一下自己的学习过程,方便以后知识点忘记后回顾。以上我写的大部分的内容都是我经过查阅资料和自己测试后的结果,所以不能保证所有内容都正确,如果你发现有任何问题和错误请及时与我联系,也非常欢迎大家在评论区一起交流感想和技术。

      

          

  致谢:

   1.本文引用内容:动力节点全新升级版MybatisPlus教程学习笔记——进阶篇_专心摸鱼二十年的博客-CSDN博客

   2.感谢大佬 Mr.D.Chuang 对于我在编写博客文章上的指导和帮助。Mr.D.Chuang的博客_CSDN博客-Java基础,Spring,SpringCloud领域博主

来源地址:https://blog.csdn.net/m0_57176999/article/details/130607345

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯