使用 SpringBoot 整合 Mybatis 时, 遇到了像标题的异常, 博主当时是用 Bean 类对象作为参数的, 所以百度了很久都没有建设性答案. 贴一下报错的 xxxDao 文件和 xxxMapper.xml 文件:
- package com.cjs.dao;
- import com.cjs.bean.User;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Param;
- import java.util.*;
- @Mapper
- public interface UserDao {
- public int insertUser(User user);
- }
- <?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.cjs.dao.UserDao">
- <insert id="insertUser" parameterType="user">
- insert into tb_users(username, loginname, password, phone, address)
- values (#{user.username},#{user.loginname}, #{user.password}, #{user.phone}, #{user.address})
- </insert>
- </mapper>
嗯~ 按照常规 SSM 的操作, 上面的代码不会出异常的, 但实际上就报了 nested exception is org.apache.ibatis.reflection.ReflectionException 的异常, 完整的标题语句是 There is no getter for property named 'user' in class 'com.cjs.bean.User', 他的意思是在 User 对象里没有 user 的 getter 方法. 什么???(黑人问号. jpg)user 是一个对象, 怎么会搞个 getter 方法进去?! 于是博主又写了一个简单的方法, 参数是一个 String 类型, 按照优良编码习惯, 在 Dao 方法的参数上加上 @Param("username"), 很正常, 完美插入一条数据, 于是大胆在原来的方法加上 @Param("user"), 运行, 哟~ 竟然插入成功了, 这是一个神奇的操作.
修改后的 Dao 文件代码:
- package com.cjs.dao;
- import com.cjs.bean.User;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Param;
- import java.util.*;
- @Mapper
- public interface UserDao {
- public int insertUser(@Param("user") User user);
- }
其实就是一个简单的操作, 现在来分析一下, 加上 @Param("user")是为了在 XXXMapper.xml 文件能够准确找到该参数, parameterType="user", 这里的 user 是类型, 表示传进来的参数类型是 user, 其实是 User 对象, 这里设定了 User 的别名是 user;#{user.username}这里的 user 是参数名, 问题就出在这里了 (敲黑板), 在 SpringBoot 整合 Mybatis 里面, 如果不设置 @Param("user"), 它会把 #{user.username} 里的 user 当作你传进去的参数的一个属性值, 即变成了 user.user.username, 那么 User 对象里面自然没有 user 属性了, 相反, 我表明了 #{user.username}里的 user 就是我传进去的参数, 即标明 @Param("user"). 这种解决方法可以推广到参数为非 bean 对象的情况.
按照刚才的分析, 如果使用 #{user.username}, 就要加 @Param("user")来标记 user 参数, 换句话说, 如果不加, 就把 #{user.username}里的 user 当作是参数里的一个属性 (注意上面有下划线的一句话), 那么这里出现第二种修改方式: 将 #{user.username} 换成 #{username}
- package com.cjs.dao;
- import com.cjs.bean.User;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Param;
- import java.util.*;
- @Mapper
- public interface UserDao {
- public int insertUser(User user);
- }
- <?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.cjs.dao.UserDao">
- <insert id="insertUser" parameterType="user">
- insert into tb_users(username, loginname, password, phone, address)
- values (#{username},#{loginname}, #{password}, #{phone}, #{address})
- </insert>
- </mapper>
来源: http://www.bubuko.com/infodetail-2827965.html