1.自动映射规则 【1】表名和实体类名映射 -> 表名user 实体类名User 【2】字段名和实体类属性名映射 -> 数据库字段名name 实体类属性名name 在这个映射里其实就是识别setget去掉前缀再小写首字母:
1.自动映射规则
【1】表名和实体类名映射 -> 表名user 实体类名User
【2】字段名和实体类属性名映射 -> 数据库字段名name 实体类属性名name
在这个映射里其实就是识别setget去掉前缀再小写首字母:
mybatis 在进行自动映射时,会根据 Java 对象中的 Setter 方法(即属性的设置方法)来确定属性名,并将查询结果集中的列值赋给该属性。具体来说,MyBatis 会按照以下规则生成属性名:
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中也有相应的自定义映射规则。
2.表映射
通过@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
,这样是可以正常完成查询的
4.set方法作用
MyBatis 中的自动映射(Auto Mapping)是指将查询结果自动映射到 Java 对象中,而不需要手动编写映射规则。在 MyBatis 中,自动映射的原则是将查询结果集中的列名(或列别名)与 Java 对象中的属性名进行匹配,如果匹配成功,则自动将列值赋给对应的属性。
在进行自动映射时,MyBatis 会使用 Java 对象中的 Setter 方法为属性赋值。Setter 方法是一种 Java 编程语言中的方法,用于设置类中的属性值。例如,如果 Java 对象中有一个名为 name
的属性,则 MyBatis 会在查询结果集中查找名为 name
的列,并调用 setUserName
方法将该列的值赋给该属性。
5.get方法作用
当使用 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}
占位符中。
6.占位符理解
在 MyBatis 中,Getter 方法主要用于获取 Java 对象中的属性值,并将其映射到 SQL 语句中的 #{}
占位符或者查询结果集中的列中。
在 SQL 语句中,#{}
占位符用于接收参数值。MyBatis 会自动使用 Getter 方法获取 Java 对象中的属性值,并将该值映射到 #{}
占位符中。
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,
#{}
占位符中。(也可以使用注解自定义)!!!第一次写博客的感想
1.本文引用内容:动力节点全新升级版MybatisPlus教程学习笔记——进阶篇_专心摸鱼二十年的博客-CSDN博客
2.感谢大佬 Mr.D.Chuang 对于我在编写博客文章上的指导和帮助。Mr.D.Chuang的博客_CSDN博客-Java基础,Spring,SpringCloud领域博主
来源地址:https://blog.csdn.net/m0_57176999/article/details/130607345
--结束END--
本文标题: Mybatis中自动映射规则(包含mp),setget方法作用,以及占位符理解
本文链接: https://lsjlt.com/news/396639.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0