这篇文章讲述的是Mybatis的参数处理小结,如有错误或者不当之处,还望各位大神批评指正。
单个参数
- Mybatis遇到一个参数不会做特殊处理
- 直接用 #{参数名} :来取出参数值
多个参数/Collection/数组
- Mybatis遇到多个参数时会做特殊处理,多个参数会被封装成Map
key:param1-paramN
value:传入参数的值 若直接使用 #{参数名}取值会报错:
org.apache.ibatis.binding.BindingException: Parameter ‘id’ not found. Available parameters are [arg1, arg0, param1, param2]正确的取法:
1.#{param1}取出param1键所对应的值
<select id="getStudentByIdAndName" resultType="com.cn.cmc.bean.Student">
select *
from student
where id = #{param1} and name = #{param2}
</select>
2.使用@Param指定封装时指定的key值
接口中:
public Student getStudentByIdAndName(@Param("id")Integer id , @Param("name")String name ) ;
xml文档中:依旧使用#{变量名}取值即可
<select id="getStudentByIdAndName" resultType="com.cn.cmc.bean.Student">
select *
from student
where id = #{id} and name = #{name}
</select>
Collection/数组
- 如果传入参数时List,Set,或是数组,Mybatis也会封装成Map但是键有所不同
list:#{ list[序号] }
set:#{ list[序号] }
数组:#{ array[序号] }
POJO
- 如果传入的多个参数正好对应业务的数据模型,可以直接传入POJO类
取值方法:#{属性名}
接口中:
public void addStudent(Student student) ;
xml文档中:
<insert id="addStudent" parameterType="com.cn.cmc.bean.Student">
insert into student (id , name , sex , age )
values(#{id}, #{name} , #{sex} , #{age})
</insert>
Map
- 如果传入参数不是业务的数据模型,为了方便也可以传入一个Map
取值方法:#{key}取出map中对应的值
例:
接口中
public Student getStudentByIdAndName(Map<String , Object> map) ;
使用:
Map<String , Object> map = new HashMap<String, Object>() ;
map.put("id", 100001) ;
map.put("name", "叶清逸") ;
Student student = mapper.getStudentByIdAndName(map) ;
注:映射文档里使用#{key}取值即可
To
- 如果传入参数不是业务对象但经常被使用,则推荐编写一个专门的数据传输对象。
参数值的获取
- #{ }:可以获取map或POJO中的对象属性值
- ${ }:也可以获取map或POJO中的对象属性值
二者区别:
- #{ } 以预编译的方法将参数值设置到sql语句中,类似于PreparedStatement
- ${ } 取出参数值直接放在sql语句中
- 大部分情况下都使用#{ },原生sql不支持占位符的地方可以使用 如:select∗from 如 : s e l e c t ∗ f r o m {year}_Salary 按年份查询表
有着更丰富用法的#{ }
可以规定参数的规则:如property、column、javaType、jdbcType、typeHandler
javaType:如果与数据库类型匹配则使用该类型,如果不匹配使用指定类型
支持的类型有:BIT、FLOAT、CHAR、TIMESTAMP、OTHER、UNDEFINED、TINYINT、REAL、VARCHAR、BINARY、BLOG、NVARCHAR、SMALLINT、DOUBLE、LONGVARCHAR、VARBINARY、CLOB、NCHAR、INTEGER、NUMERIC、DATE、LONGVARBINARY、BOOLEAN、NCLOB、BIGINT、DECIMAL、TIME、NULL、CURSOR、ARRAY