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映射配置文件
<?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();

    }

}

执行结果

显示为null

原因

因为实体类的属性名称和表结构的属性名称不一致导致,所以对于这种情况,必须在映射文件里配置标签,用来把实体类的属性和表字段名称一一匹配起来。
(假如双方的名称是一模一样的,则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,从数据库结果集中取出的数据转换成实体类实例后,每个字段所对应的具体属性。

  1. resultMap属性
  • id:resultMap的唯一标识
  • type:resultMap返回的实际类型
  1. resultMap子元素
  • id:映射数据库主键,其中,property表示实体类属性名称,column表示结果集中对应数据库的列名
  • result:映射数据库的普通列,其中,property表示实体类属性名称,column表示结果集中对应数据库的列名
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值