当前mybatis的版本:
1. 声明
当前内容主要用于记录使用MyBatis Generator生成器生成代码后,使用MyBatis执行的时候出现的一个问题
当前异常:
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'userName' in 'field list' ; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'userName' in 'field list'] with root cause
分析异常:
说有一个userName的列不在字段列表中,但是实际上数据库和实体类中都有这个名词,并且类型一致
pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version><!-- 父类中的版本控制所有的依赖包的版本信息 -->
<relativePath />
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 导入mybatis的依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
2.问题再现
1.当前数据库字段
数据库字段中有userName字段
2.实体类中:
@Data
@NoArgsConstructor
public class User {
private Integer id;
private String userName;
private String loginName;
private String loginPwd;
private String userType;
private Integer userGroupId;
private String home;
private String email;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
private Integer createUserId;
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", userName=").append(userName);
sb.append(", loginName=").append(loginName);
sb.append(", loginPwd=").append(loginPwd);
sb.append(", userType=").append(userType);
sb.append(", userGroupId=").append(userGroupId);
sb.append(", home=").append(home);
sb.append(", email=").append(email);
sb.append(", createTime=").append(createTime);
sb.append(", createUserId=").append(createUserId);
sb.append("]");
return sb.toString();
}
}
全部是MyBatis Generator自动生成的,发现也有 private String userName;
这个属性,这里使用Lombok
3.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.app.dao.UserMapper">
<resultMap id="BaseResultMap" type="com.app.entity.User">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="userName" jdbcType="VARCHAR" property="userName" />
<result column="loginName" jdbcType="VARCHAR" property="loginName" />
<result column="loginPwd" jdbcType="VARCHAR" property="loginPwd" />
<result column="userType" jdbcType="VARCHAR" property="userType" />
<result column="userGroupId" jdbcType="INTEGER" property="userGroupId" />
<result column="home" jdbcType="VARCHAR" property="home" />
<result column="email" jdbcType="VARCHAR" property="email" />
<result column="createTime" jdbcType="TIMESTAMP" property="createTime" />
<result column="createUserId" jdbcType="INTEGER" property="createUserId" />
</resultMap>
<sql id="Base_Column_List">
id, userName, loginName, loginPwd, userType, userGroupId, home, email, createTime,
createUserId
</sql>
<select id="selectAllUsingPage" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
<if test="limitStart != null and limitSize >= 0">
limit #{limitStart} , #{limitSize}
</if>
</select>
</mapper>
也是具有userName属性的,发现都没有问题
4.sql执行中无问题
3.执行结果
个人感觉都没有问题,但是还是报错
反正就是说你的userName字段不存在…
4.解决办法
这里解决放解决办法
1.如果使用全部查询可以使用select * 方式代替
,结果发现不报错了!
<select id="selectAllUsingPage" resultType="com.app.entity.User">
SELECT
<!-- id, `userName` AS 'userName', loginName, loginPwd, userType, userGroupId, home, email, createTime,
createUserId -->
*
FROM `user`
<if test="limitStart != null and limitSize >= 0">
limit #{limitStart} , #{limitSize}
</if>
</select>
执行结果:
但是只要执行查询userName就会报错,这个不会是一个bug吧,查询一个字段userName一样报错
结果发现是一个乌龙:当前访问的数据库中没有字段,而本人认为是访问的是这个字段,通过分析发现原来访问的数据库完全都不一致,test表中的user无userName属性,而实际要查询的为my_web_file_system中的userName属性,尴尬!