目录
三种mybatis表的列名和对象属性名不一致处理方法
1.使用 resultMap 映射
1)mapper
2)mapper.xml
3)测试代码
4)测试结果
编辑
2.使用别名
1)mapper
2)mapper.xml
3)测试代码
4)测试结果
3.使用 @Results 注解
1)mapper
2)mapper.xml
3)测试代码
4)测试结果
附录
1)NameMapper文件
2)NameMapper.xml文件
3)NameMapperTest文件
4)user表结构
三种mybatis表的列名和对象属性名不一致处理方法
在MyBatis中,当数据库表的列名与Java对象的字段名不一致时,可以通过多种方式来处理这种情况。以下是几种常用的方法:
1.使用 resultMap 映射
resultMap 是 MyBatis 提供的一个非常强大的映射机制,可以用来定义复杂的映射关系。使用 resultMap 可以解决列名和字段名不一致的问题。
1)mapper
/**
* 通过ResultMap方式
*/
User queryUserByResultMap(int id);
2)mapper.xml
<!--定义ResultMap--> <resultMap id="user" type="org.xiji.enty.User"> <!--定义主键id映射--> <id property="id" column="id"/> <!--定义名字映射--> <result property="username" column="username"/> <!--定义密码映射--> <result property="password" column="password"/> <!--定义信息映射--> <result property="userInfo" column="user_info"/> </resultMap>.
<!--通过ResultMap处理表名和列名不一致的情况--> <select id="queryUserByResultMap" resultMap="user"> select * from user where id=#{id} </select>
3)测试代码
/** * 通过resultMap的方式 */ @Test public void testGetNameByResultMap() { System.out.println("+====================================="); User user = nameMapper.queryUserByResultMap(3); System.out.println(user.toString()); }
4)测试结果
2.使用别名
在 SQL 查询语句中使用别名来匹配 Java 字段名。
1)mapper
/**
* 通过sql起别名的方式
*/
User queryUserByAlias(int id);
2)mapper.xml
<!--通过起别名的方式处理列名与对象名不一致的情况--> <select id="queryUserByAlias" resultType="org.xiji.enty.User"> select id,username,password,user_info as userInfo from user where id=#{id} </select>
3)测试代码
/** * 通过起别名的方式 */ @Test public void testGetName() { System.out.println("+====================================="); User user = nameMapper.queryUserByAlias(1); System.out.println(user); System.out.println(user.toString()); }
4)测试结果
3.使用 @Results 注解
如果你使用的是 MyBatis 的注解风格,可以通过 @Results
注解来指定列名和字段名的对应关系。
1)mapper
* 通过注解的方式@Results */ @Select("select * from user where id=#{id}") @Results( { @Result(column = "id",property = "id"), @Result(column = "username",property = "username"), @Result(column = "password",property = "password"), @Result(column = "user_info",property = "userInfo") } ) User queryUserByAnnotation(int id);
2)mapper.xml
这个是使用mybatis注解风格编写sql,没有xml
3)测试代码
/** * 通过注解的方式 */ @Test public void testGetNameByAnnotation() { System.out.println("+====================================="); User user = nameMapper.queryUserByAnnotation(2); System.out.println(user.toString()); }
4)测试结果
附录
1)NameMapper文件
package org.xiji.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.xiji.enty.User;
@Mapper
public interface NameMapper {
/**
* 通过ResultMap方式
*/
User queryUserByResultMap(int id);
/**
* 通过sql起别名的方式
*/
User queryUserByAlias(int id);
/**
* 通过注解的方式@Results
*/
@Select("select * from user where id=#{id}")
@Results(
{
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "user_info",property = "userInfo")
}
)
User queryUserByAnnotation(int id);
}
2)NameMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.xiji.mapper.NameMapper"> <!--定义ResultMap--> <resultMap id="user" type="org.xiji.enty.User"> <!--定义主键id映射--> <id property="id" column="id"/> <!--定义名字映射--> <result property="username" column="username"/> <!--定义密码映射--> <result property="password" column="password"/> <!--定义信息映射--> <result property="userInfo" column="user_info"/> </resultMap> <!--通过起别名的方式处理列名与对象名不一致的情况--> <select id="queryUserByAlias" resultType="org.xiji.enty.User"> select id,username,password,user_info as userInfo from user where id=#{id} </select> <!--通过ResultMap处理表名和列名不一致的情况--> <select id="queryUserByResultMap" resultMap="user"> select * from user where id=#{id} </select> </mapper>
3)NameMapperTest文件
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.xiji.enty.User; import org.xiji.mapper.NameMapper; @SpringJUnitConfig(locations = {"classpath:springConfig.xml"}) public class NameMapperTest { @Autowired private NameMapper nameMapper; /** * 通过起别名的方式 */ @Test public void testGetName() { System.out.println("+====================================="); User user = nameMapper.queryUserByAlias(1); System.out.println(user.toString()); } /** * 通过注解的方式 */ @Test public void testGetNameByAnnotation() { System.out.println("+====================================="); User user = nameMapper.queryUserByAnnotation(2); System.out.println(user.toString()); } /** * 通过resultMap的方式 */ @Test public void testGetNameByResultMap() { System.out.println("+====================================="); User user = nameMapper.queryUserByResultMap(3); System.out.println(user.toString()); } }
4)user表结构
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户名字', `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户密码', `userInfo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户信息', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;