关于Mybatis查询Sql结果未映射到对应得实体类上

使用Mybatis查询的时候,已经确定sql语句没问题,可以正常查询出正常的结果集,但是使用实体类接收的时候,发现对应的实体类中本该有值的字段好多却都是null。也就是说,有些查询结果并没有映射到实体类对应的字段上

首先要知道,Mybatis与实体类的映射方式,常见的主要是有两种。不同的映射方式,也对应不同的接收方式。

1)依靠resultMap参数映射

通过select标签中resultMap属性进行接收结果集,需要提前编写resultMap映射的xml

编写resultMap标签的xml如下可以将数据库字段实体类字段进行映射关联。

<resultMap id="BaseResultMap" type="com.**.job.model.Product">
    <id column="id" jdbcType="VARCHAR" property="id" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    <result column="version" jdbcType="INTEGER" property="version" />
</resultMap>

其中,id="BaseResultMap" 为resultMap标签的名称,通过BaseResultMap可在当前xml中引用该映射关系。type="***.***.***.job.model.Product" 代表该映射关系指向的实体类,另外column为数据库字段,property为实体类字段。


如果采用这种方式映射,那么使用select标签查询时,返回类型就可以用resultMapid进行接收。将select标签中的接收参数设置为resultMap = "BaseResultMap"。如下图所示

<select id="findAll" resultMap="BaseResultMap">
    select <include refid="Base_Column_List" />
    from product_tab
  </select>

如果此时,错误使用了resultType= "BaseResultMap"属性接收,编辑器会报红提示,同时会造成某些实体类字段接收不到值,显示为null

2)依靠resultType参数映射

如果不想编写resultMap,我们也可以使用select 标签中的resultType进行接收。

此时resultType 指向具体的实体类。

<select id="selectByDto" resultType="com.**.job.model.Product">

但是,这种方式需要满足下面三个条件之一:

  • 表中的字段和实体类字段一致
  • 实体类字段满足驼峰格式。如,表中字段product_url,实体类的字段,要写成productUrl。
  • sql语句中字段有别名,且别名和实体类字段要么一致,要么满足驼峰转换规则

上面三种方式,其实都是为了满足resultType隐式映射的条件。

如果以上三个条件都满足,还是出现某些实体类字段为null。就去检查一下是否未设置mybatis的mapUnderscoreToCamelCase参数。因为该参数默认为false


mapUnderscoreToCamelCase属性设置为true。 可以自动将以下画线方式命名的数据库列映射到 Java 对象的驼峰式命名属性中。

设置方式如下:

3)总结

1)如果你写了resultMap 的xml映射,那么select标签的属性选择resultMap。且确保column属性中的值对应sql 语句中的列,property属性中的值对应的是实体类中字段名

2)如果你没写resultMap 的xml映射,那也没事。mybatis会自动帮你映射。但是你的select标签的属性要使用resultType属性,用于指向具体的实体类。但同时,你要满足上面三个条件之一。同时确保mapUnderscoreToCamelCase参数为true


无论使用resultMap或者resultType进行接收,最终目的都是将SQL语句中,结果集的列和实体类的字段名相关联。resultMap是通过显式的方式,手动映射。resultType是通过隐式的方式,自动转换进行映射。


在使用的时候,建议编写resultMap,只要映射没错,基本上不会出现为null的情况,实体类的字段可以随便写。并且resultMap还支持一对多、多对多的映射方式。而resultType对实体类的命名规范比较严格。适合简单、编写规范的对象模型。

当然如果你库表中的字段很多的话,可以使用mybatis-generator生成工具,直接生成resultMap的xml

  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MyBatis 是一款持久层框架,可以通过 XML 文件或注解形式进行配置,将 Java 实体类数据库表进行映射。下面是一个示例: 1. 实体类定义 ```java public class User { private Long id; private String username; private String password; private Integer age; // getter 和 setter 略 } ``` 2. 数据库表定义 ```sql CREATE TABLE user ( id BIGINT(20) NOT NULL AUTO_INCREMENT, username VARCHAR(50) DEFAULT NULL, password VARCHAR(50) DEFAULT NULL, age INT(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 3. MyBatis XML 文件配置 ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userMap" type="com.example.entity.User"> <id column="id" property="id" /> <result column="username" property="username" /> <result column="password" property="password" /> <result column="age" property="age" /> </resultMap> <select id="getUserById" resultMap="userMap"> SELECT id, username, password, age FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO user (username, password, age) VALUES (#{username}, #{password}, #{age}) </insert> <update id="updateUser" parameterType="com.example.entity.User"> UPDATE user SET username = #{username}, password = #{password}, age = #{age} WHERE id = #{id} </update> <delete id="deleteUserById"> DELETE FROM user WHERE id = #{id} </delete> </mapper> ``` 4. Mapper 接口定义 ```java public interface UserMapper { User getUserById(Long id); void insertUser(User user); void updateUser(User user); void deleteUserById(Long id); } ``` 这样就完成了 Java 实体类数据库表的映射。在实际开发中,可以根据具体需求进行配置,比如使用注解方式配置映射关系,或者使用 MyBatis-Plus 等工具简化操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值