解决spring boot + mybatis 查询数据返回实体类时,实体类个别字段值为null的问题

主要原因:表的字段名找不到实体类的对应的属性

解决方案:

        1、开启mybatis的字段命名驼峰转换,在 application.yml添加

mybatis:
  configuration:
    map-underscore-to-camel-case: true

即可。

        2、采用resultMap,将查出的数据的列名称对应的实体属性单独定义,形式为<resultMap>...</resultMap>。例如:

        

<resultMap id="ResultMap1" type="model.student"> 
    <id column="student_id" property="id" jdbcType="VARCHAR" /> 
    <result column="studnet_name" property="name" jdbcType="VARCHAR" /> 
    <result column="student_sex" property="sex" jdbcType="VARCHAR" /> 
</resultMap> 


然后在写SELECT语句时,就可以引用了, 
        

<select  id="queryStudnetInfo" resultMap="ResultMap1"> 
    select * from department 
    where 
    student_id=#{id,jdbcType=VARCHAR} 
</select> 

        3、写SQL语句时给列名添加别名,别名对应实体的属性

对应的实体类如下:

        

public class Member {
    private Integer memberId;
    private String memberName;
    private String department;
    // 省略getter和setter
}

对应的Mapper.xml如下:

        

<select id="selectMemberByMemberName" resultType="Member">
    SELECT member_id as memberId,member_name as memberName
    FROM member
    WHERE member_name = #{memberName}
</select>
Spring BootMyBatis Plus结合开发中,TableInfoHelper负责根据实体类动态获取结构信息。当实体类数量较多,TableInfoHelper的结构检查过程可能会变得缓慢,影响系统启动性能。以下是一些优化方案: ### 1. 缓存TableInfo信息 TableInfoHelper默认会在每次需要重新加载结构信息,可以通过自定义缓存机制避免重复加载。可以在应用启动将所有结构信息加载一次,并存储到缓存中,后续直接读取缓存[^1]。 ```java @Component public class TableInfoCache { private static final Map<Class<?>, TableInfo> TABLE_INFO_MAP = new ConcurrentHashMap<>(); public static TableInfo getTableInfo(Class<?> entityClass) { return TABLE_INFO_MAP.computeIfAbsent(entityClass, TableInfoHelper::getTableInfo); } } ``` ### 2. 延迟加载TableInfo 对于部分不常用的实体类,可以采用延迟加载策略,仅在需要才加载对应的结构信息,避免启动一次性加载过多数据。 ```java public class LazyTableInfoLoader { private static final Map<Class<?>, Supplier<TableInfo>> LAZY_TABLE_INFO_MAP = new HashMap<>(); public static void register(Class<?> entityClass, Supplier<TableInfo> supplier) { LAZY_TABLE_INFO_MAP.put(entityClass, supplier); } public static TableInfo getTableInfo(Class<?> entityClass) { Supplier<TableInfo> supplier = LAZY_TABLE_INFO_MAP.get(entityClass); return supplier != null ? supplier.get() : null; } } ``` ### 3. 避免重复初始化 在MyBatis Plus中,TableInfoHelper.getTableInfo方法会进行多次反射操作。可以通过自定义TableInfo管理类,减少重复的反射调用。 ```java public class CustomTableInfoManager { private static final Map<Class<?>, TableInfo> TABLE_INFO_REGISTRY = new WeakHashMap<>(); public static synchronized TableInfo registerTableInfo(Class<?> entityClass) { if (TABLE_INFO_REGISTRY.containsKey(entityClass)) { return TABLE_INFO_REGISTRY.get(entityClass); } TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass); TABLE_INFO_REGISTRY.put(entityClass, tableInfo); return tableInfo; } } ``` ### 4. 预加载并持久化结构信息 可以将结构信息在构建或第一次启动预加载并持久化到本地文件或数据库中,后续直接读取持久化数据,减少启动数据查询和反射操作。 ```java public class TableInfoPreloader { public static void preloadAndPersist() { List<Class<?>> entityClasses = getAllEntityClasses(); // 获取所有实体类 for (Class<?> entityClass : entityClasses) { TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass); persistTableInfo(entityClass, tableInfo); // 将结构信息持久化 } } private static void persistTableInfo(Class<?> entityClass, TableInfo tableInfo) { // 持久化逻辑,例如写入文件或数据库 } } ``` ### 5. 禁用不必要的自动映射检查 如果结构已经确定,可以禁用自动映射检查,减少不必要的数据查询和反射操作。 ```yaml mybatis-plus: global-config: db-config: table-underline-to-camel: false ``` ### 6. 使用注解减少反射 通过使用MyBatis Plus提供的注解(如`@TableName`、`@TableId`等)明确结构信息,减少TableInfoHelper的依赖[^1]。 ```java @TableName("user_table") public class User { @TableId(value = "user_id", type = IdType.AUTO) private Long id; @TableField("user_name") private String name; } ``` ### 7. 优化实体类加载顺序 将常用实体类的加载优先级提高,不常用的实体类延迟加载,减少启动的负载。 ### 8. 使用工具类预处理 在应用启动前,使用工具类预处理结构信息,并存储到缓存或配置文件中,避免运行重复处理。 ```java public class TableInfoPreprocessor { public static void preprocess() { List<Class<?>> entityClasses = EntityScanner.scan(); // 扫描所有实体类 for (Class<?> entityClass : entityClasses) { TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass); // 预处理逻辑 } } } ``` ### 9. 减少实体类数量 如果实体类过多,可以考虑合并部分实体类,减少冗余实体类数量。例如,使用`@TableField(exist = false)`忽略非数据字段,避免不必要的实体类拆分[^1]。 ```java public class User { @TableId private Long id; private String name; @TableField(exist = false) private String temporaryField; // 非数据字段 } ``` ### 10. 升级MyBatis Plus版本 确保使用的是最新版本的MyBatis Plus,官方可能已经优化了相关性能问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值