错误问题
当我使用Maven+SSM写登录案例的时候,mybatis的映射文件中的sql直接放在navicat中能查询出值,但是程序中的返回值却是null,控制台也不会报错,没有错误信息的提示。
解决方案
首先检查配置文件
<?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.crm.sys.login.dao.AdminDao">
<resultMap id="BaseResultMap" type="com.crm.sys.login.entity.Admin">
<result column="admin_id" property="adminId" jdbcType="INTEGER" />
<result column="admin_name" property="adminName" jdbcType="VARCHAR" />
<result column="admin_pwd" property="adminPwd" jdbcType="VARCHAR" />
</resultMap>
<!--用户登录 -->
<select id="login" parameterType="java.util.Map" resultType="com.crm.sys.login.entity.Admin">
SELECT
*
FROM
admin
WHERE
admin_name=#{adminName, jdbcType=VARCHAR}
AND
admin_pwd=#{adminPwd, jdbcType=VARCHAR}
</select>
</mapper>
-
检查数据库名字是否错误
-
检查dao层是否扫描到
-
检查namespace是不是自己的dao层路径
-
检查parameterType参数类型是不是传入参数的类型
-
检查resultType是不是实体类的类型
如上,依旧查询不到数据,控制台也不会报错,返回值为null
重点检查
检查数据库字段名
我的数据库的字段:admin_name admin_pwd
javaBean的实体类属性名:adminName adminPwd
sql语句:
SELECT * FROM admin WHERE
admin_name=#{adminName, jdbcType=VARCHAR}
AND
admin_pwd=#{adminPwd, jdbcType=VARCHAR}
发现问题
由于查询结果的字段为admin_name,admin_pwd,在实体类中没有定义,所以查询结果为null
解决方案一
修改实体类为:admin_name admin_pwd,问题得到解决 能正常的查询到数据,
同样需要set get。
解决方案二
修改查询语句,给查询出来的数据取别名
sql语句:
SELECT
admin_name as adminName, admin_pwd as adminPwd
FROM
admin
WHERE
admin_name=#{adminName, jdbcType=VARCHAR}
AND
admin_pwd=#{adminPwd, jdbcType=VARCHAR}
总结
如果使用select * 来查询的 那么实体类中的属性必须和数据表中对应的字段一模一样
如果使用select 字段名 as 别名来查询的 ,那么实体类中的属性必须和你取的别名对应
总之,你查询出来的字段和你实体类中对应的属性名必须一致