前言
贴出自己的错误,警醒自己!
题外话:【我爱笨媳妇】
错误的背景
我在使用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这些框架虽然好用,但是有时候会出现一些不经意的错误,所以,大家在实际的开发中,一定要谨慎使用!