问题:
MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
解决方案:
1.写sql语句时起别名
<!-- id属性:必须是接口中方法的方法名
resultType属性:必须是方法的返回值的全类名-->
<select id="getEmployeeById" resultType="MyBatis中当实体类中的属性名和表中的字段名不一样怎么办.entities.Employee">
select id,last_name lastName,email,salary,dept_id deptId from employees where id = #{id}</select>
2.在MyBatis的全局配置文件中开启驼峰命名规则
<settings>
<!-- 开启驼峰命名规则 ,可以将数据库中的下划线映射为驼峰命名
例如:last_name可以映射为lastName -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
3.在Mapper映射文件中使用resultMap来自定义映射规则
<select id="getEmployeeById" resultMap="myMap">
select * from employees where id = #{id}
</select> <!-- 自定义高级映射 -->
<resultMap type="MyBatis中当实体类中的属性名和表中的字段名不一样怎么办.entities.Employee" id="myMap">
<!-- 映射主键 -->
<id column="id" property="id"/>
<!-- 映射其他列 -->
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="salary" property="salary"/>
<result column="dept_id" property="deptId"/>
</resultMap>
测试用例:
//1.MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
/*
* 解决方案:
* 1.写sql语句时起别名
* 2.在MyBatis的全局配置文件中开启驼峰命名规则
* 3.在Mapper映射文件中使用resultMap来自定义映射规则
*/ @Test
void testGetEmployee() throws IOException {
//1.创建SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取sqlSession,sqlSession就相当于JDBC中的connection
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//3.获取Mapper对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//4.调用EmployeeMapper中获取Employee的方法
Employee employee = mapper.getEmployeeById(1);
System.out.println(employee);
} finally {
//5.关闭sqlSession
sqlSession.close();
}
运行结果:
完整代码:
https://gitee.com/ZhangShunHai/interview_atguigu_seasonone/tree/master/ssm_mybatis%20mapping