Mybatis报红 Could not set parameters for mapping: ParameterMapping{property=‘id‘, mode=IN, javaType=cl
2021-06-08 23:45:15
<?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.kuang.dao.StudentMapper">
这里的resultType是在核心配置里面设置了别名,所以是Student
1.查询所有学生信息
2.根据查询出来的学生tid,去查找对应的老师
<select id="getStudent" resultMap="StudentTeacher">
select * from student;
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
复杂的属性:我们需要单独处理
不能像普通属性单单这样写,是错误的!!(这里举的例子是之前结果集映射时候的)
<result property="password" column="pwd"/>
如果Student类的属性是一个对象: association 关联的意思
如果Student类的属性是一个集合: collection 集合的意思
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
解析:为什么后面要跟一个javaType 和 select呢?
javaType:
因为我们知道这个属性(property="teacher")是一个引用类型(Teacher)
所以就是说明这个属性是什么类型的,因为这个成员变量teacher是一个对象
所以要给这个对象设置一个类型
select:
我们的目的是什么?就是将teacher的信息给查询出来,那么就需要根据column的值即tid的值
就是获得学生类里的tid然后用这个tid去老师表里再查返回一个teacher对象
和子查询很像mysql子查询(in)的实现
#SELECT * from student s ,teacher t WHERE s.tid in (SELECT t.id from teacher t)
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
一种解析(有错误的):
1.student中有teacher成员变量,而teacher不是基本类型,因此需要告诉mybatis这个对象从哪来(就是怎么才能查到并且初始化一个对象)
2.在查询学生的语句中,写上resultMap来告诉mybatis我的teacher成员变量来自名为studentTeacher的结果映射
3.在StudentTeacher结果映射中,我们需要写出teacher怎么来的,property写出teacher成员变量,select告诉mybatis我是通过下边的getTeacher获得teacher
4.column标识getTeacher中缺省参数casual 值的来源是student表中的tid (ps:casual是随便的意思,你想填什么名字都可以)
另一种解析(这说的没毛病):前面写的tid没用,都没给getTeacher传参不信你把 where id=\#{id}去掉照样能查出来,因为他建的表只有一个老师 看不出来
select * from mybatis.teacher where id=#{id}
</select>
</mapper>
MyTest类
public class MyTest {
@Test
public void testStudent(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> student = mapper.getStudent();
for (Student stu : student) {
System.out.println(stu);
sqlSession.close();
如果你使用的是xml文件配置mapper,并且传入了null值,则也会引发这个错误:
Exception in thread "main" org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for...
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping
Could not set parameters for mapping: ParameterMapping{property=‘id’, mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId=‘null’, jdbcTypeName=‘null’, expression=‘n...
Error updating database. Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property=‘id’, mode=IN, javaType=int, jdbcType=null, numericScale=null, resultMapId=‘null’, jdbcTypeName=‘null’, expression=‘null’
报错信息:
"nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='id', mode=IN, javaType=class java.lang.Long, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expres
错误及解决方法
因为担心@Builder的注解的类不支持mybatis做查询,刚好也有了一个错误,跟了一圈发现不是mybatis的问题,是自己mapper的like写错导致。记录一下跟踪过程,做个总结。
这个错误的原因是mapper的参数和要导入的参数数量不一致,我这里的原因是把参数写在''里了,导致mapper没有解析到这个参数。
错误的写法'#{userNamePinyin}%',正确的写法#...
当问们遇到Could not set parameters for mapping: ParameterMapping
错误时,多数为我们的mapper映射写的有问题,检查我们的sql语句。
如:中英文符号、大于小于号等 ,特别是小于号。只要细心,都不是问题。
< 小于号 > 大于号
1.今天上午来的时候,在我们自己UAT环境遇到一个奇怪的错误,从dao层到mybatis里面遇到一个错误,Could not set parameters for mapping…等等,这很显然,是告诉我们sql语句里面的动态传值有误,但是我检查了好几次,没发现有错误呀,全部用的#占位符,毫无问题,但是 上到uat环境里面就报错,很是纳闷。
2.随后我仔细观察,发现我在sql语句里面注释了一条语句...