【Java 5】Unknown column 'user_name' in 'field list'
java.sql.SQLException: Unknown column 'user_name' in 'field list'
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666) at com.mysql.jdbc.Connection.execSQL(Connection.java:2994) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:936) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1030) at com.zzz.util.DbUtil.Logincheck(DbUtil.java:44) at com.zzz.servlet.LoginServlet.doGet(LoginServlet.java:34) at com.zzz.servlet.LoginServlet.doPost(LoginServlet.java:55) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
这是什么东西?缺少“user_name”,不是不是的。仔细再看,这是:不知道“user_name”在列表中。 根据经验一般就是实体类和数据库的字段名不一致导致的。但是后面将数据库中字段名和类中名字也改成一致了,启动服务,结果还是报一样的错,这时纳闷了,为什么呢?
翻了mybatis 和hibernate 的API,结果发现持久类的映射文件中的字段顺序必须和数据库中标的字段顺序一致,什么意思呢?数据库表中user_name是第三个字段,则你映射文件中的顺序也必须是第三个,否则Hibernate在映射时找不到,这是一个容易引起犯错误的地方。
总结分析思路:
1,查看mapper中的userName,与user_name
2,查看数据库中的user_name
3,查看实体类中的userName
后来又看了看“userMapper.xml”,userMapper.xml中的代码:
<sql id="Base_Column_List" > id, user_name, password, age
发现原因了,在数据库mysql表中第一次建表:
第二次建表:
现在问题解决了回过头来看着,这问题真是太简单了,当初怎么就花了不少时间才解决出来呢?
一开始以为是大小写用“username” ,“userName”和“user_name” 的尝试,最终是数据库中字段,早就应该看“userMapper.xml”里面的字段,可以一下就解决。其实就是持久类的字段和数据库表里的字段不对应。
思路本来是没有的,问题解决的多了,思路也就越来越多了,debug的速度也就越来越快了。
