MyBatis属性名和字段名不一致的问题解决方法
作者:666-LBJ-666
解决属性名和字段名不一致的问题
1. 问题
数据库中的字段
新建一个项目,拷贝之前的,测试实体类字段不一致的情况
测试出现问题
// select * from user where id = #{id} // 类型处理器 // select id,name,pwd from user where id = #{id}
解决方法:
- 起别名:修改sql语句
<select id="getUserById" resultType="com.kuang.pojo.User"> select id,name,pwd as password from USER where id = #{id} </select>
2. resultMap
结果集映射
id name pwd
id name password
解决简单的结果映射名的问题
<!--结果集映射--> <resultMap id="UserMap" type="User"> <!--column数据库中的字段,property实体类中的属性--> <result column="id" property="id"></result> <result column="name" property="name"></result> <result column="pwd" property="password"></result> </resultMap> <select id="getUserList" resultMap="UserMap"> select * from USER </select>
在MyBatis中, 元素用于映射查询结果到Java对象。在 中, 元素用于将查询结果的列映射到Java对象的属性。在进行映射时,MyBatis会尝试根据Java对象属性的类型和查询结果的列的类型进行自动转换,但有时需要手动配置映射关系,以确保类型匹配。
举例代码:
<resultMap id="exampleResultMap" type="com.example.domain.User"> <id property="id" column="user_id" /> <result property="username" column="user_name" /> <result property="email" column="user_email" /> <result property="birthDate" column="user_birth_date" /> </resultMap>
在这个例子中:
property
属性指定了Java对象的属性名称。
column
属性指定了数据库查询结果中的列名称。
MyBatis会根据属性和列的名称进行映射,但类型匹配仍然很重要。如果数据库中的列类型与Java对象属性的类型不匹配,可能会导致类型转换错误。在这种情况下,你可能需要手动指定类型转换器。
例如,如果数据库中的列是 VARCHAR 类型,而Java对象的属性是 java.util.Date 类型,你可能需要使用类型转换器来将字符串转换为日期。可以通过在 元素中添加 javaType 和 jdbcType 属性来手动指定类型:
<resultMap id="exampleResultMap" type="com.example.domain.User"> <id property="id" column="user_id" /> <result property="username" column="user_name" /> <result property="email" column="user_email" /> <result property="birthDate" column="user_birth_date" javaType="java.util.Date" jdbcType="VARCHAR" /> </resultMap>
在这个例子中,javaType 属性指定了Java对象属性的类型,而 jdbcType 属性指定了数据库列的类型。这有助于确保MyBatis正确进行类型转换。
3. javaType和jdbcType的对应关系
当你在MyBatis中使用 元素时,可以通过指定 javaType 和 jdbcType 属性来配置Java对象属性与数据库列的类型对应关系。以下是一些常见的Java类型与JDBC类型的对应关系:
javaType | jdbcType | |
---|---|---|
String类型 | String | VARCHAR |
Integer类型 | Integer 或int | INTEGER |
Long类型 | Long 或long | BIGINT |
Double类型 | Double 或 double | DOUBLE |
Float类型 | Float 或 float | REAL |
Boolean类型 | Boolean 或 boolean | BIT |
Date类型 | java.util.Date 或 java.sql.Date | DATE |
Timestamp类型 | java.sql.Timestamp | TIMESTAMP |
BigDecimal类型 | java.math.BigDecimal | DECIMAL |
Byte类型 | Byte 或 byte | TINYINT |
4.resultMap和resultType的区别?
在MyBatis中,resultMap 和 resultType 都用于配置查询结果的映射关系,但它们有一些关键的区别。
resultType:
resultType 是一种简化的映射配置方式,用于指定查询结果的类型。
你只需要指定一个Java类的全限定名,MyBatis会自动映射查询结果到该类的实例。
resultType 使用简单,适用于简单的查询,但对于复杂的映射关系,可能显得不够灵活。
示例:
<select id="getUserById" resultType="com.example.domain.User"> SELECT * FROM users WHERE id = #{id} </select>
resultMap:
resultMap 是一种更为灵活和强大的映射配置方式,允许你详细定义查询结果与Java对象之间的映射关系。
你可以指定每个查询结果列与Java对象属性的映射关系,同时还可以配置复杂的映射关系,如继承、关联关系等。
resultMap 通常用于复杂的查询,或者在需要手动配置映射关系时使用。
示例:
<resultMap id="userResultMap" type="com.example.domain.User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="email" column="user_email"/> <!-- 其他映射关系配置 --> </resultMap>
<select id="getUserById" resultMap="userResultMap"> SELECT * FROM users WHERE id = #{id} </select>
总体而言,resultMap 更加灵活,适用于复杂的映射需求,而 resultType 则更为简单,适用于简单的映射场景。在实际应用中,根据具体需求选择使用 resultMap 或 resultType。
- resultMap 元素是 MyBatis 中最重要最强大的元素。
- ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了,如上。
- ResultMap 的优秀之处——你完全可以不用显式地配置它们,需要什么,配置什么就好了,如上:需要pwd和password的映射,其它的可以不写。
如果这个世界总是这么简单就好了。
以上就是MyBatis属性名和字段名不一致的问题解决的详细内容,更多关于MyBatis属性名和字段名不一致的资料请关注脚本之家其它相关文章!