SSM-Mybatis-映射器-参数
概述
在一些数据库字段返回为null,而Mybatis系统又检测不到使用哪种jdbcType进行处理时,会发生异常的情况,这时候执行对应的typeHandler进行处理:
insert into t_role(id,role_name,note) values(#{id},#{roleName,typeHandler=org.apache.ibatis.type.StringTypeHandler},#{note})
实际情况下不需要这样写,Mybatis会根据javaType和jdbcType去检测使用哪个typeHandler。
还可以自定义TypeHandler类似方法指定就不会抛出异常,也可以指定jdbcType和javaType:
#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}
Mybatis还提供了控制数值精确度支持:
#{width,javaType=double,jdbcType=NUMERIC,numericScale=2}
存储过程参数支持
在存储过程中存在:IN(输入),OUT(输出),INOUT(输入输出)三种参数类型:
- 输入参数是外界需要传递给存储过程的
- 输出参数是存储过程经过处理后返回的
- 输入输出参数,一方面外界需要传递给他,另一方面在最后存储过程也会返回给调用者
存储过程的参数类型有3种:
1: #{id,mode=IN}
2: #{roleName,mode=OUT}
3: #{note,mode=INOUT}
特殊字符串的替换和处理(#和$)
使用 #{} 时,Mybatis会创建PreparedStatement参数占位符,并通过占位符设置参数,这样做安全,更迅速,通常是首选做法
当需要在SQL语句中直接插入一个不转义的字符串可以使用 ${}
ORDER BY ${columnName}
当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。
@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);
@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);
@Select("select * from user where email = #{email}")
User findByEmail(@Param("email") String email);
上面例子中可以修改成如下的代码:
@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);
其中 ${column}
会被直接替换,而 #{value}
会使用 ?
预处理。 这样,就能完成同样的任务:
User userOfId1 = userMapper.findByColumn("id", 1L);
User userOfNameKid = userMapper.findByColumn("name", "kid");
User userOfEmail = userMapper.findByColumn("email", "noone@nowhere.com");
注意:这种方式是不安全的,会有潜在的SQL注入攻击