【1】表名和实体类名映射 -> 表名user 实体类名User
【2】字段名和实体类属性名映射 -> 数据库字段名name 实体类属性名name
在这个映射里其实就是识别setget去掉前缀再小写首字母:
MyBatis 在进行自动映射时,会根据 Java 对象中的 Setter 方法(即属性的设置方法)来确定属性名,并将查询结果集中的列值赋给该属性。具体来说,MyBatis 会按照以下规则生成属性名:
- 获取 Setter 方法的名称,例如
setId
。 - 去掉
set
前缀,得到属性名的首字母大写形式,例如 Id。 - 将属性名的首字母变为小写,得到属性名,例如
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