mybatis 使用参数
Parameter
1. 传入简单类型
JAVA代码:
- public User get(Long id) {
- return (User) getSqlSession().selectOne("com.liulanghan.get" , id);
- }
MAPPER :
- <select id="findUserListByIdList" parameterType="java.lang.Long" resultType="User">
- select * from user where id = #{id};
- </select>
2. 传入List
JAVA代码:
- public List<Area> findUserListByIdList(List<Long> idList) {
- return getSqlSession().selectList("com.liulanghan.findUserListByIdList", idList);
- }
MAPPER :
- <select id="findUserListByIdList" parameterType="java.util.ArrayList" resultType="User">
- select * from user user
- <where>
- user.ID in (
- <foreach item="guard" index="index" collection="list"
- separator=","> #{guard} </foreach>
- )
- </where>
- </select>
单独传入list时,foreach中的collection必须是list,不不管变量的具体名称是什么。比如这里变量名为idList,
collection却是是list。
3. 传入数组
JAVA代码:
- public List<Area> findUserListByIdList(int[] ids) {
- return getSqlSession().selectList("com.liulanghan.findUserListByIdList", ids);
- }
MAPPER :
- <select id="findUserListByIdList" parameterType="java.util.HashList" resultType="User">
- select * from user user
- <where>
- user.ID in (
- <foreach item="guard" index="index" collection="array"
- separator=","> #{guard} </foreach>
- )
- </where>
- </select>
单独传入数组时,foreach中的collection必须是array,不不管变量的具体名称是什么。比如这里变量名为ids,
collection却是是array
4. 传入map
JAVA代码:
- public boolean exists(Map<String, Object> map){
- Object count = getSqlSession().selectOne("com.liulanghan.exists", map);
- int totalCount = Integer.parseInt(count.toString());
- return totalCount > 0 ? true : false;
- }
MAPPER :
- <select id="exists" parameterType="java.util.HashMap" resultType="java.lang.Integer">
- SELECT COUNT(*) FROM USER user
- <where>
- <if test="code != null">
- and user.CODE = #{code}
- </if>
- <if test="id != null">
- and user.ID = #{id}
- </if>
- <if test="idList !=null ">
- and user.ID in (
- <foreach item="guard" index="index" collection="idList"
- separator=","> #{guard} </foreach>
- )
- </if>
- </where>
- </select>
MAP中有list或array时,foreach中的collection必须是具体list或array的变量名。比如这里MAP含有一个
名为idList的list,所以MAP中用idList取值,这点和单独传list或array时不太一样。
5. 传入JAVA对象
JAVA代码:
- public boolean findUserListByDTO(UserDTO userDTO){
- Object count = getSqlSession().selectOne("com.liulanghan.exists", userDTO);
- int totalCount = Integer.parseInt(count.toString());
- return totalCount > 0 ? true : false;
- }
MAPPER :
- <select id="findUserListByDTO" parameterType="UserDTO" resultType="java.lang.Integer">
- SELECT COUNT(*) FROM USER user
- <where>
- <if test="code != null">
- and user.CODE = #{code}
- </if>
- <if test="id != null">
- and user.ID = #{id}
- </if>
- <if test="idList !=null ">
- and user.ID in (
- <foreach item="guard" index="index" collection="idList"
- separator=","> #{guard} </foreach>
- )
- </if>
- </where>
- </select>
JAVA对象中有list或array时,foreach中的collection必须是具体list或array的变量名。比如这里UserDTO含有一个
名为idList的list,所以UserDTO中用idList取值,这点和单独传list或array时不太一样。
6.取值
由上面可以看出,取值的时候用的是#{}。它具体的意思是告诉MyBatis创建一个预处理语句参数。
使用JDBC,这样的一个参数在SQL中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:
- // Similar JDBC code, NOT MyBatis…
- String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
- PreparedStatement ps = conn.prepareStatement(selectPerson);
- ps.setInt(1,id);
可以看到这个写法比较简单,MyBatis为我们做了很多默认的事情,具体的写法应该如下:
- #{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 使用参数的更多相关文章
- mybatis 传递参数的方法总结
有三种mybatis传递参数的方式: 第一种 mybatis传入参数是有序号的,可以直接用序号取得参数 User selectUser(String name,String area); 可以在xml ...
- 【转载】Mybatis多参数查询映射
转载地址:http://www.07net01.com/zhishi/402787.html 最近在做一个Mybatis的项目,由于是接触不久,虽然看了一下资料,但在实际开发中还是暴 露了很多问题,其 ...
- MyBatis传递参数
MyBatis传递参数 一.使用 map 接口传递参数 在 MyBatis 中允许 map 接口通过键值对传递多个参数,把接口方法定义为 : public List<Role> findR ...
- MyBatis传入参数为list、数组、map写法(转载)
MyBatis传入参数为list.数组.map写法 1.foreach简单介绍: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有item ...
- Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入
Mybatis基于代理Dao实现CRUD操作 使用要求: 1.持久层接口和持久层接口的映射配置必须在相同的包下 2.持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定 ...
- MyBatis的参数,不能传入null
今天在调试的过程中发现一个bug,把传入的参数写到查询分析器中执行没有问题,但是在程序中执行就报错:org.springframework.jdbc.UncategorizedSQLException ...
- MyBatis传入参数为list、数组、map写法
1.foreach简单介绍: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有item,index,collection,open,sep ...
- mybatis中参数为list集合时使用 mybatis in查询
mybatis中参数为list集合时使用 mybatis in查询 一.问题描述mybatis sql查询时,若遇到多个条件匹配一个字段,sql 如: select * from user where ...
- 【mybatis源码学习】mybatis的参数处理
一.mybatis的参数处理以及参数取值 1.单个参数 mybatis不做任何处理 取值方式: #{参数名/任意名} <!-- Employee getEmpById(Integer id) ...
- Mybatis传入参数类型为Map
mybatis更新sql语句: <update id="publishT00_notice" parameterType="Map"> update ...
随机推荐
- 99_leetcode_Best Time to Buy and sell Stock
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- Python爬虫开发【第1篇】【Requests】
1.安装 利用 pip 安装 或者利用 easy_install 都可以完成安装: pip install requests easy_install requests 2.基本GET请求(heade ...
- js全局替换空格,制表符,换行符
this.value = this.value.replace(/\s+/g,'') "/ "这个是固定写法, "\s"匹配任何不可见字符,包括空格.制表符.换 ...
- java 开发webservice
这几天用java开发一个webservice,搞死了.java果然很难侍候! 传说java搞webservice,有好几种途径(为什么不是一种?要搞这么多种,让人一听,头都大了.当然啦,生物多样性总是 ...
- easyUI datagrid 前端假分页
datagrid有两种分页方式,真分页和假分页. 所谓真分页,就是真的每次只获取一张分页的数据. 所谓假分页,就是将所有数据全部获取下来,然后利用其分页控件进行分页. 下面具体说说假分页: 1.dat ...
- 【OI】线性筛
如何查找一个范围内的所有素数? 可以是从1~n挨个判断n%i 是否 == 0,也可以从 1~sqr(n) 一个个判断. 相信你们也听说过埃氏筛法,是使用每一个数的倍数筛掉合数!但是!每一个合数要被筛多 ...
- Bootstrap Tooltip源码分析
/* ======================================================================== * Bootstrap: tooltip.js ...
- go5--数组
package main /* 数组Array 定义数组的格式:var <varName> [n]<type>,n>=0 数组长度也是类型的一部分,因此具有不同长度的数组 ...
- Centos7 防火墙firewalld配置
开启80端口 firewall-cmd --zone=public --add-port=80/tcp --permanent 出现success表明添加成功 移除某个端口 firewall-cmd ...
- oracle-扫盲贴:存储过程实现增删改查
原文引入:http://blog.csdn.net/yangzhawen/article/details/8617179 oracle-扫盲贴:存储过程实现增删改查 分类: oracle2013-02 ...