我的错误之mybatis查询

来源:互联网 发布:js date get 毫秒数 编辑:程序博客网 时间:2024/04/28 08:30

前言

贴出自己的错误,警醒自己!

题外话:【我爱笨媳妇】


错误的背景

        我在使用mybatis查询数据库的时候,将增删改查的方法都写好了,然而,增删改一点问题都没有,查询却一直返回空值(null)。我的心里很纳闷,这到底是怎莫回事呢?
        在经历了一番排查之后,我觉得一定是mybatis的配置出现问题,问题应该就出在了sql语句之上。后来,上网经过查询,才发现了问题!


解决思路

        先来看看我的实体类:


public class User {    private String username;    private String userpass;}

        现在,再来看看我的数据库里面的数据:


数据库详情


        问题来了,这里数据库里面的字段和我的实体类的字段其实是不对应的,但是,为何除了查找以外的所有方法均能执行成功,这是我最纳闷的问题!后来,我发现,问题就出在了xml文件的配置上。
UserDao.xml文件如下:


<?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"><mapper namespace="com.weimob.dao.UserDao">    <select id="getUser" parameterType="com.weimob.model.User"        resultType="com.weimob.model.User">        SELECT * FROM user WHERE user_name=#{user_name} AND        user_pass=#{user_pass}    </select>    <insert id="addUser" parameterType="com.weimob.model.User"        flushCache="true">        INSERT INTO user (user_name,user_pass) VALUES        (#{username},#{userpass})    </insert>    <update id="updateUser" parameterType="com.weimob.model.User">        UPDATE user SET        user_pass=#{userpass} WHERE user_name=#{username}    </update>    <delete id="deleteUser" parameterType="com.weimob.model.User">        DELETE FROM user WHERE        user_name=#{username}    </delete></mapper>

        注意看select属性中的resultType属性;这可是很重要的。
        其实mybatis默认为我们返回的是一个map,这个map中的键就是数据表的字段,而值就是查询到的值。如果我在这里设置为User类,他会自动赋值,然后新建一个User,但是,由于我的实体类的成员变量和表的字段不符,它找不到setUser_name()方法,所以只能返回null。
        但是,也不报错,这真是框架的一个小问题啊!话说回来了,为何别的方法能够顺利执行呢?原来,在更新、查找、删除的时候,只是会从我封装好的user对象里面取值,只用到了get方法,并没有和表的字段产生关系,所以自然就可以执行。
        哎,真是粗心大意害死人,看来,在建表和建立实体类的时候,一定多多注意这些细节!下面,是我查找的博客,是不错的参考,也是我解决问题的根据!


                                                mybatis参考资料


总结

        这次的错误真的很难查找,但是同时也让我对mybatis的一些配置有了更加深刻的认识,但是,同时我也发现了mybatis这些框架虽然好用,但是有时候会出现一些不经意的错误,所以,大家在实际的开发中,一定要谨慎使用!

0 0