Mybatis selectOne方法执行sql有数据返回为null

问题描述:

初学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映射配置文件



<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 selectOne方法执行sql有数据返回为null_第1张图片

原因

因为实体类的属性名称和表结构的属性名称不一致导致,所以对于这种情况,必须在映射文件里配置标签,用来把实体类的属性和表字段名称一一匹配起来。
(假如双方的名称是一模一样的,则mybatis会自动关联)
所以,将映射文件修改一下如下:




<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" resultType="person" resultMap="personMap">
    select * from person where user_id = #{as}
  select>

mapper>

增加了resultMap标签,同时,select标签增加了resultMap属性。

再次执行结果如下:

Mybatis selectOne方法执行sql有数据返回为null_第2张图片

关于resultMap标签

他的作用是显性的告诉mybatis,从数据库结果集中取出的数据转换成实体类实例后,每个字段所对应的具体属性。

  1. resultMap属性
    • id:resultMap的唯一标识
    • type:resultMap返回的实际类型
  2. resultMap子元素
    • id:映射数据库主键,其中,property表示实体类属性名称,column表示结果集中对应数据库的列名
    • result:映射数据库的普通列,其中,property表示实体类属性名称,column表示结果集中对应数据库的列名

你可能感兴趣的:(mybatis)