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 mapper parameterType的更多相关文章

  1. mybatis mapper association collection

    1.Question Description: sometimes, POJO bean contains another bean or collection as property, it's s ...

  2. mybatis mapper namespace

    http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete org.apache.ibatis.excep ...

  3. XML CDATA(Mybatis mapper and XML)

    Tip:must be followed by either attribute specifications, ">" or "/>". 所有 X ...

  4. mybatis mapper.xml 写关联查询 运用 resultmap 结果集中 用 association 关联其他表 并且 用 association 的 select 查询值 报错 java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mybatis.map

    用mybaits 写一个关联查询 查询商品表关联商品规格表,并查询规格表中的数量.价格等,为了sql重用性,利用 association 节点 查询 结果并赋值报错 商品表的mapper文件为Gooo ...

  5. mybatis mapper文件sql语句传入hashmap参数

    1.怎样在mybatis mapper文件sql语句传入hashmap参数? 答:直接这样写map就可以 <select id="selectTeacher" paramet ...

  6. MyBatis Mapper XML 详解

    MyBatis Mapper XML 详解 MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JD ...

  7. 自己挖的坑自己填--Mybatis mapper文件if标签中number类型及String类型的坑

    1.现象描述 (1)使用 Mybatis 在进行数据更新时,大部分时候update语句都需要通过动态SQL进行拼接.在其中,if标签中经常会有 xxx !='' 这种判断,若 number 类型的字段 ...

  8. MyBatis Mapper.xml文件中 $和#的区别

    MyBatis Mapper.xml文件中 $和#的区别   网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...

  9. MyBatis mapper文件中的变量引用方式#{}与${}的差别

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...

随机推荐

  1. mysql批量update的两种方法

    today a question let me happy(抓狂) 头儿分了一个小任务,让修改循环调用dao层的那些不啦不啦不啦,鉴于之前写过批量更新的玩意,so 很快代码就修改完了,but 测的时候 ...

  2. 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作

    题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...

  3. TypeError: object() takes no parameters

    1.定义了类,在类中实现函数功能,但是需要传参数,我在类中没有建立__init__(self,) 导致没法传参.

  4. VAE (variational autoencoder)

    https://www.zhihu.com/question/41490383/answer/103006793 自编码是一种表示学习的技术,是deep learning的核心问题 让输入等于输出,取 ...

  5. 网络对抗实验一 逆向及Bof基础实践

    网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  6. Oracle11g 配置DG broker

    在配置DG broker之前需要确保Dataguard配置正常且主库和备库均使用spfile. 1. 主库配置 配置DG_BROKER_START参数 检查主库dg_broker_start设置 SQ ...

  7. Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElement

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  8. word简单优化--提高效率

    1.文件 ---选项---校对(去掉下面这些项) 2.点击自动更正,去掉如下 3.文件--选项--保存

  9. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  10. Qt中信号(signal)和槽(slot)的几种关联方法

    声明,个人总结,不一定正确! 1.最常见的,使用connect语句.比如:connect(btnSend,SIGNAL(clicked()),this,SLOT(clear()); 2.在 .ui设计 ...