查询结果的列名和Java对象的属性名对应不上怎么办?
*第一种方式:as给列名起别名
*第二种方式:使用resultMap进行结果映射
*第三种方式:是否开启驼峰命名自动映射(配置settings)
一、resulrMap结果映射
可以专门定义一个结果映射,在这个结果映射当中指定数据库表的字段名和Java类的属性名的对应关系。
接口:
/**
* 查询所有的student信息,使用resultMap标签进行结果映射
* @return
*/
List<Student> selectAllBtReaultMap();
mapper.xml
*select标签中的resultMap属性,用来指定使用哪个结果映射 resultMap的值是resultMap的id
*resultMap标签中的type属性,用来指定POJO类的类名;id属性:指定resultMap的唯一标识,这个id将来要在select标签中使用。如果有主键,建议这里配置一个id标签,注意:这不是必须的 官方解释:这样的配置可以让mybatis提高效率
如果列column和property是一样的,则可以省略
<!--
1、不需要再起别名,可以专门定义一个结果映射,在这个结果映射当中指定数据库表的字段名和Java类的属性名的对应关系
2、type属性:用来指定POJO类的类名
3、id属性:指定resultMap的唯一标识,这个id将来要在select标签种使用
-->
<resultMap id="studentResultMap" type="student">
<id property="id" column="id"></id>
<!--如果数据库表中有主键,一般都是有主键,否则不符合数据库设计第一范式-->
<!--如果有主键,建议这里配置一个id标签,注意:这不是必须的 官方解释:这样的配置可以让mybatis提高效率-->
<!--property填写POJO类的属性名-->
<!--column填写数据库表的字段名-->
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<result property="height" column="height"></result>
<result property="birth" column="birth"></result>
<result property="sex" column="sex"></result>
</resultMap>
<!--select标签中的resultMap属性,用来指定使用哪个结果映射 resultMap的值是resultMap的id-->
<select id="selectAllBtReaultMap" resultMap="studentResultMap">
select * from t_student
</select>
测试:
@Test
public void testSelectAllResultMap() throws IOException, ParseException {
SqlSession session = SqlSessionUtil.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> students = mapper.selectAllBtReaultMap();
students.forEach(student -> {
System.out.println(student);
});
session.close();
}
运行结果:
二、驼峰命名自动映射
使用这种机制的前提是:属性名遵循Java的命名规范,数据库表的列名遵循SQL的命名规范。
Java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名方式。
SQL命名规范:全部小写,单词之间采用下划线分割
例如:
属性名:carNum 数据库表的列名:car_num
启用该功能:在mybatis-config.xml文件中进行配置:
<settings> <!--放在properties标签后面-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
https://mybatis.net.cn/configuration.html#settings(mybatis官方中文学习手册)