记录一个mybatis resultType查询结果为空的问题
运行时日志如下:
2020-09-13 21:48:04.091 INFO 71052 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-09-13 21:48:04.092 INFO 71052 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-09-13 21:48:04.098 INFO 71052 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 6 ms
stuNo: 201101010101
2020-09-13 21:48:04.207 INFO 71052 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-09-13 21:48:04.295 INFO 71052 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
null
mybatis使用的是映射文件的方式写的sql语句
原因分析:
数据库字段名和实体类的字段命名不一样
// 实体类采用驼峰命名
private String stuNo;
private String stuName;
# 数据库字段采用下划线分割
CREATE TABLE `student` (
`stu_no` varchar(12) NOT NULL,
`stu_name` varchar(60) NOT NULL,
PRIMARY KEY (`stu_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
<!-- 直接查 * 返回的字段就是下划线,与实体属性对不上,导致返回为null -->
<select id="queryOne" resultType="org.monkey.mybatis.mybatisdemo.entity.Student">
select * from student where stu_no = #{stuNo};
</select>
修改方式
1、查询时,给字段起别名,别名和实体类字段名相同,对于字段很多的情况,这种方式不适用
<select id="queryOne" resultType="org.monkey.mybatis.mybatisdemo.entity.Student">
select stu_no as stuNo, stu_name as stuName from student where stu_no = #{stuNo};
</select>
2、使用resultMap,在map中定义映射关系,然后再查询语句中,使用resultMap属性返回查询结果
<resultMap id="BaseResultMap" type="org.monkey.mybatis.mybatisdemo.entity.Student">
<result column="stu_no" jdbcType="VARCHAR" property="stuNo" />
<result column="stu_name" jdbcType="VARCHAR" property="stuName" />
</resultMap>
<select id="queryOne" resultMap="BaseResultMap">
select * from student where stu_no = #{stuNo};
</select>