问题描述:
初学mybatis,在简单查询的时候,执行mybatis的selectOne(String,Object)方法,数据库查询有一条数据,但是mybatis实际返回的结果却是null,对于这种情况可能有多个原因,我遇到的情况可能比较普遍,记录一下以提供初学的同学参考
具体的代码和配置文件
实体类
public class Person {
private int pp_id;
private String person_name;
private String person_sex;
private int person_age;
}
表结构
CREATE TABLE `person` (
`user_id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`sex` varchar(10) DEFAULT NULL,
`age` int(4) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;
sql映射配置文件
<?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">
<!-- namespace指用户自定义的命名空间。 -->
<mapper namespace="com.xuxinyu.mybatis.mapper.PersonMapper">
<select id="selectPerson" parameterType="int" resultType="person">
select * from person where user_id = #{as}
</select>
</mapper>
测试类
public class MybatisTest {
public static void main(String[] args) throws IOException {
InputStream iputstream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlsessionFactory = new SqlSessionFactoryBuilder().build(iputstream);
SqlSession session = sqlsessionFactory.openSession();
Person person = session.selectOne("com.xuxinyu.mybatis.mapper.PersonMapper.selectPerson", 31);
System.out.println(person);
session.commit();
session.close();
}
}
执行结果
原因
因为实体类的属性名称和表结构的属性名称不一致导致,所以对于这种情况,必须在映射文件里配置标签,用来把实体类的属性和表字段名称一一匹配起来。
(假如双方的名称是一模一样的,则mybatis会自动关联)
所以,将映射文件修改一下如下:
<?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">
<!-- namespace指用户自定义的命名空间。 -->
<mapper namespace="com.xuxinyu.mybatis.mapper.PersonMapper">
<resultMap id="personMap" type="com.xuxinyu.mybatis.pojo.Person">
<id property="pp_id" column="user_id"/>
<result property="person_name" column="name"/>
<result property="person_sex" column="sex"/>
<result property="person_age" column="age"/>
</resultMap>
<select id="selectPerson" parameterType="int" resultMap="personMap">
select * from person where user_id = #{as}
</select>
</mapper>
增加了resultMap标签,同时,select标签增加了resultMap属性。
再次执行结果如下:
关于resultMap标签
他的作用是显性的告诉mybatis,从数据库结果集中取出的数据转换成实体类实例后,每个字段所对应的具体属性。
- resultMap属性
- id:resultMap的唯一标识
- type:resultMap返回的实际类型
- resultMap子元素
- id:映射数据库主键,其中,property表示实体类属性名称,column表示结果集中对应数据库的列名
- result:映射数据库的普通列,其中,property表示实体类属性名称,column表示结果集中对应数据库的列名