Mybatis的参数处理小结(#符和$符的区别)

这篇文章讲述的是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中的对象属性值
  • 二者区别:

    1. #{ } 以预编译的方法将参数值设置到sql语句中,类似于PreparedStatement
    2. ${ } 取出参数值直接放在sql语句中
    3. 大部分情况下都使用#{ },原生sql不支持占位符的地方可以使用 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

猜你喜欢

转载自blog.csdn.net/u013634252/article/details/80775180