MyBatis中如何实现数据封装

MyBatis中的数据封装

在使用MyBatis的时候,我们发现有些查询后的数据库表的字段名能够正确封装到实体类的属性名中,而有些数据库表中的字段名却不能够正确封装到实体类的对应属性中,这是为什么呢?

观察控制台输出打印日志以及实体类属性和数据库表字段的关系如下:

只有实体类属性名和数据库表中查询返回的字段名保持一致时,MyBatis才会为我们实现自动映射,在实体类属性名和数据库表字段名不一致时,通过控制台打印的日志可以知道MyBatis并不能为我们实现对应数据的自动映射。那么该如何解决数据映射的问题呢?

  • 手动结果映射
  • 给字段名起别名
  • 在配置文件中开启驼峰命名的配置

手动结果映射

1). 在Mapper持久层接口方法上,通过@Results@Result注解进行手动结果映射。

  • @Results的源码
java 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Results {
  /**
   * Returns the id of this result map.
   *
   * @return the id of this result map
   */
  String id() default "";//这个结果映射集的名字

  /**
   * Returns mapping definitions for property.
   *
   * @return mapping definitions
   */
  Result[] value() default {};//Result类型数组
}
  • @Result部分源码
java 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(Results.class)
public @interface Result {
  /**
   * Returns whether id column or not.
   *
   * @return {@code true} if id column; {@code false} if otherwise
   */
  boolean id() default false;//通过true/false表示当前列是否为主键

  /**
   * Return the column name(or column label) to map to this argument.
   *
   * @return the column name(or column label)
   */
  String column() default "";//指定表中要映射字段名

  /**
   * Returns the property name for applying this mapping.
   *
   * @return the property name
   */
  String property() default "";//指定类中要被映射的属性名
}

观察控制台手动结果映射后的日志:

当然如果在别的SQL中也需要复用这个映射关系时,我们可以给这个@Results中指定一个名字id,最后通过使用@ResultMap注解来使用这个映射关系。

  • @ResultMap
java 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ResultMap {
  /**
   * Returns result map names to use.
   *
   * @return result map names
   */
  String[] value();//映射关系名
}

在其他方法中引用这个映射关系,并在控制台打印映射后的日志:

2). 当然除了在通过注解来实现手动结果映射外,我们还可以在XML文件中通过<resultMap>...</resultMap>标签来自定义映射结果集,从而实现手动结果映射。

起别名

通过在SQL语句中对数据库表字段名与实体类属性名无法映射的列起别名,使得数据库表中字段名的别名与实体类属性名一致实现映射。

在配置文件中开启驼峰命名

打开配置文件application.properties中驼峰转换的开关

propertie 复制代码
# 配置Mybatis的驼峰命名自动转换,使数据库表中字段名和实体类属性间实现蛇形命名和驼峰命名的自动映射
mybatis.configuration.map-underscore-to-camel-case=true

如果数据库表中字段名与实体类属性名符合驼峰命名规则,MyBatis会自动通过驼峰命名规则实现自动映射。驼峰命名规则:abc_xyz => abcXyz

  • 数据库表中字段名:abc_xyz
  • 实体类中属性名:abcXyz

这里做一个特别补充:通常我们在保存信息的时候,需要记录这个操作的id号来保存操作记录。所以当我们保存完信息后需要获取到保存信息的id号,这时候可以通过MyBatis中提供的主键返回功能来获取。

Options(useGeneraateKeys = true, keyProperty = "id"),通过这个注解声明要使用返回的主键,并将这个主键映射到keyProperty指定的类属性中。

这时候可以通过MyBatis中提供的主键返回功能来获取。

Options(useGeneraateKeys = true, keyProperty = "id"),通过这个注解声明要使用返回的主键,并将这个主键映射到keyProperty指定的类属性中。

相关推荐
wind_one142 分钟前
7.基础--SQL--DDL-数据类型及案例
数据库·sql
l1t2 小时前
利用DeepSeek改写SQLite版本的二进制位数独求解SQL
数据库·人工智能·sql·sqlite
QT 小鲜肉2 小时前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
研究司马懿2 小时前
【ETCD】ETCD常用命令
网络·数据库·云原生·oracle·自动化·运维开发·etcd
刘一说3 小时前
深入理解 Spring Boot 中的数据库迁移:Flyway 与 Liquibase 实战指南
数据库·spring boot·oracle
August_._4 小时前
【MySQL】SQL语法详细总结
java·数据库·后端·sql·mysql·oracle
升鲜宝供应链及收银系统源代码服务4 小时前
升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
java·开发语言·数据库·redis·缓存·开源·供应链系统
苦学编程的谢5 小时前
Redis_8_List
数据库·redis·缓存
曹天骄6 小时前
阿里云 DCDN → CDN 无缝切换教程(以 example.com 为例)
数据库·阿里云·云计算
workflower7 小时前
软件工程-练习
数据库·需求分析·个人开发·极限编程·结对编程