Parameter
 
1.   传入简单类型

JAVA代码:

  1. public User get(Long id) {
  2. return (User) getSqlSession().selectOne("com.liulanghan.get" , id);
  3. }

MAPPER :

  1. <select id="findUserListByIdList" parameterType="java.lang.Long" resultType="User">
  2. select * from user where  id = #{id};
  3. </select>

2.   传入List

JAVA代码:

  1. public List<Area> findUserListByIdList(List<Long> idList) {
  2. return getSqlSession().selectList("com.liulanghan.findUserListByIdList", idList);
  3. }

MAPPER :

  1. <select id="findUserListByIdList" parameterType="java.util.ArrayList" resultType="User">
  2. select * from user user
  3. <where>
  4. user.ID in (
  5. <foreach item="guard" index="index" collection="list"
  6. separator=","> #{guard} </foreach>
  7. )
  8. </where>
  9. </select>

单独传入list时,foreach中的collection必须是list,不不管变量的具体名称是什么。比如这里变量名为idList,
 collection却是是list。
 
3.  传入数组

JAVA代码:

  1. public List<Area> findUserListByIdList(int[] ids) {
  2. return getSqlSession().selectList("com.liulanghan.findUserListByIdList", ids);
  3. }

MAPPER :

  1. <select id="findUserListByIdList" parameterType="java.util.HashList" resultType="User">
  2. select * from user user
  3. <where>
  4. user.ID in (
  5. <foreach item="guard" index="index" collection="array"
  6. separator=","> #{guard} </foreach>
  7. )
  8. </where>
  9. </select>

单独传入数组时,foreach中的collection必须是array,不不管变量的具体名称是什么。比如这里变量名为ids,
 collection却是是array

4.  传入map
 
 JAVA代码:

  1. public boolean exists(Map<String, Object> map){
  2. Object count = getSqlSession().selectOne("com.liulanghan.exists", map);
  3. int totalCount = Integer.parseInt(count.toString());
  4. return totalCount > 0 ? true : false;
  5. }

MAPPER :

  1. <select id="exists" parameterType="java.util.HashMap" resultType="java.lang.Integer">
  2. SELECT COUNT(*) FROM USER user
  3. <where>
  4. <if test="code != null">
  5. and user.CODE = #{code}
  6. </if>
  7. <if test="id != null">
  8. and user.ID = #{id}
  9. </if>
  10. <if test="idList !=null ">
  11. and user.ID in (
  12. <foreach item="guard" index="index" collection="idList"
  13. separator=","> #{guard} </foreach>
  14. )
  15. </if>
  16. </where>
  17. </select>

MAP中有list或array时,foreach中的collection必须是具体list或array的变量名。比如这里MAP含有一个
    名为idList的list,所以MAP中用idList取值,这点和单独传list或array时不太一样。
 
 
5. 传入JAVA对象
 
 JAVA代码:

  1. public boolean findUserListByDTO(UserDTO userDTO){
  2. Object count = getSqlSession().selectOne("com.liulanghan.exists", userDTO);
  3. int totalCount = Integer.parseInt(count.toString());
  4. return totalCount > 0 ? true : false;
  5. }

MAPPER :

  1. <select id="findUserListByDTO" parameterType="UserDTO" resultType="java.lang.Integer">
  2. SELECT COUNT(*) FROM USER user
  3. <where>
  4. <if test="code != null">
  5. and user.CODE = #{code}
  6. </if>
  7. <if test="id != null">
  8. and user.ID = #{id}
  9. </if>
  10. <if test="idList !=null ">
  11. and user.ID in (
  12. <foreach item="guard" index="index" collection="idList"
  13. separator=","> #{guard} </foreach>
  14. )
  15. </if>
  16. </where>
  17. </select>

JAVA对象中有list或array时,foreach中的collection必须是具体list或array的变量名。比如这里UserDTO含有一个
    名为idList的list,所以UserDTO中用idList取值,这点和单独传list或array时不太一样。

6.取值

由上面可以看出,取值的时候用的是#{}。它具体的意思是告诉MyBatis创建一个预处理语句参数。
 使用JDBC,这样的一个参数在SQL中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:

  1. // Similar JDBC code, NOT MyBatis…
  2. String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
  3. PreparedStatement ps = conn.prepareStatement(selectPerson);
  4. ps.setInt(1,id);

可以看到这个写法比较简单,MyBatis为我们做了很多默认的事情,具体的写法应该如下:

  1. #{property,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler,mode=OUT,resultMap=User}

property:属性名,即代码传入的变量名。
 javaType:该字段在JAVA中的类型,比如int。
 jdbcType:该字段在JDBC中的类型,比如NUMERIC。
 typeHandler:类型处理器
 mode:参数类型为IN,OUT或INOUT参数
 resultMap:结果。
 
 还好,MyBatis比较体谅我们,一般我们只需写一个属性名即可,如#{id},其他的如javaType和typeHandlerMybatis
 会自动帮我们填好。可是这样有时也会出问题,比如出现CLOB字段时。
 
 由于JAVA代码中的String类型对应的默认typeHandler为StringTypeHandler,当用String类型处理时,如果String长度超过一定长度,就会报如下错误:

setString can only process strings of less than 32766 chararacters

解决办法是指定该属性的typeHandler,如下:

#{message,typeHandler=org.apache.ibatis.type.ClobTypeHandler}

我们也可以自定义typeHandler来处理需要的数据,具体这里详述。
 
 JDBC类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是JDBC的需要,而不是MyBatis的。一般不需要配置
 
 mode、resultMap一般不需要,在写存储过程时会用到,这里不详述。
 
7.字符串替换

一般情况下,我们采用#{}取值,产生预处理语句,但是有时我们可能不希望Mybatis来帮我们预处理,比如ORDER BY时,可以
 采用如下写法:
 
 ORDER BY ${columnName}
 
 这里MyBatis不会修改或转义字符串。而是直接拼接到SQL字符串后面。
 
 重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你
 不应该允许用户输入这些字段,或者通常自行转义并检查。

mybatis 使用参数的更多相关文章

  1. mybatis 传递参数的方法总结

    有三种mybatis传递参数的方式: 第一种 mybatis传入参数是有序号的,可以直接用序号取得参数 User selectUser(String name,String area); 可以在xml ...

  2. 【转载】Mybatis多参数查询映射

    转载地址:http://www.07net01.com/zhishi/402787.html 最近在做一个Mybatis的项目,由于是接触不久,虽然看了一下资料,但在实际开发中还是暴 露了很多问题,其 ...

  3. MyBatis传递参数

    MyBatis传递参数 一.使用 map 接口传递参数 在 MyBatis 中允许 map 接口通过键值对传递多个参数,把接口方法定义为 : public List<Role> findR ...

  4. MyBatis传入参数为list、数组、map写法(转载)

    MyBatis传入参数为list.数组.map写法 1.foreach简单介绍: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有item ...

  5. Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入

    Mybatis基于代理Dao实现CRUD操作 使用要求: 1.持久层接口和持久层接口的映射配置必须在相同的包下 2.持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定 ...

  6. MyBatis的参数,不能传入null

    今天在调试的过程中发现一个bug,把传入的参数写到查询分析器中执行没有问题,但是在程序中执行就报错:org.springframework.jdbc.UncategorizedSQLException ...

  7. MyBatis传入参数为list、数组、map写法

    1.foreach简单介绍: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有item,index,collection,open,sep ...

  8. mybatis中参数为list集合时使用 mybatis in查询

    mybatis中参数为list集合时使用 mybatis in查询 一.问题描述mybatis sql查询时,若遇到多个条件匹配一个字段,sql 如: select * from user where ...

  9. 【mybatis源码学习】mybatis的参数处理

    一.mybatis的参数处理以及参数取值 1.单个参数 mybatis不做任何处理 取值方式: ​ #{参数名/任意名} <!-- Employee getEmpById(Integer id) ...

  10. Mybatis传入参数类型为Map

    mybatis更新sql语句: <update id="publishT00_notice" parameterType="Map"> update ...

随机推荐

  1. python的一些常用函数

    1 filter(function, iterable) 等价于(item for item in iterable if function(item)) 就是说,filter会遍历iterable中 ...

  2. b-is-in- (1267, "Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='") SELECT id FROM qqzoneshuoshuo WHERE words=

    db-is-in- (1267, "Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci, ...

  3. JavaScript总结01

    1 JavaScript 与 Java 的关系? 雷锋和雷峰塔的关系JavaScript和Java都与sun公司有合作,是借势Java 2 JavaScript 的特点是什么? 脚本语言(一种轻量级的 ...

  4. RK3288 6.0 双屏异显,横屏+竖屏【转】

    本文转载自:http://blog.csdn.net/clx44551/article/details/78215730?locationNum=8&fps=1 RK3288 6.0 双屏异显 ...

  5. Ubuntu14.04 x64 zabbix 3.0 安装

    U buntu14.04 x64   zabbix 3.0 安装 苦于网上的文档很多,但是对初学者来说,很多都搭建不成功,我重新安装一下.记录一下. 下载deb wget http://repo.za ...

  6. Bing必应地图中国API入门讲座之八:显示驾车路线

    Bing必应地图中国API入门讲座之八:显示驾车路线 2011-05-24 14:47:36|  分类: Bing&Google|字号 订阅     这篇文章非常值得纪念,因为我是在Googl ...

  7. [翻译]NUnit---Action Attributes(八)

    Attributes NUnit 1.0使用传统的基于继承和命名约定来识别测试.从2.0开始NUnit使用自定义特性来实现. 因为NUnit的test fixtures不是从框架类库继承,所以开发人员 ...

  8. mybatis多表关联配置

    首先需要的jar包 mybatis-3.4.1 配置文件(mybatis.cfg.xml) <?xml version="1.0" encoding="UTF-8& ...

  9. ODB——基于c++的ORM映射框架尝试(使用)

    摘要: 2.使用 首先,需要定义一个对象,用来和数据库字段对应: [cce lang=”cpp”] #ifndef VOLUME_H #define VOLUME_H #include #includ ...

  10. Spark SVM分类器

    package Spark_MLlib import java.util.Properties import org.apache.spark.mllib.regression.LabeledPoin ...