MyBatis mapper parameterType
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 mapper parameterType的更多相关文章
- mybatis mapper association collection
1.Question Description: sometimes, POJO bean contains another bean or collection as property, it's s ...
- mybatis mapper namespace
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete org.apache.ibatis.excep ...
- XML CDATA(Mybatis mapper and XML)
Tip:must be followed by either attribute specifications, ">" or "/>". 所有 X ...
- 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 ...
- mybatis mapper文件sql语句传入hashmap参数
1.怎样在mybatis mapper文件sql语句传入hashmap参数? 答:直接这样写map就可以 <select id="selectTeacher" paramet ...
- MyBatis Mapper XML 详解
MyBatis Mapper XML 详解 MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JD ...
- 自己挖的坑自己填--Mybatis mapper文件if标签中number类型及String类型的坑
1.现象描述 (1)使用 Mybatis 在进行数据更新时,大部分时候update语句都需要通过动态SQL进行拼接.在其中,if标签中经常会有 xxx !='' 这种判断,若 number 类型的字段 ...
- MyBatis Mapper.xml文件中 $和#的区别
MyBatis Mapper.xml文件中 $和#的区别 网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...
- MyBatis mapper文件中的变量引用方式#{}与${}的差别
MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...
随机推荐
- bash shell执行方式
五种bash shell执行方式 fork, source, exec, (), {} Shell脚本的执行方式: 注明:wd代表“脚本保存的目录” 1.fork语法:/wd/shell.shfork ...
- django form 组件插件
创建类: class RegForms(forms.Form): account = fields.CharField( required = True, #必填字段 max_length=12, m ...
- 使用Xshell调用linux的图形界面!
环境说明: OS: centos 6.5 64位,最小化安装. Xmanager: 17.0.0.714 1.设置Xshell 2.将操作系统安装如下包 yum install xclock xte ...
- 记一次windows服务开发中遇到的问题
最近在研究windows service和quartz.net,所以迅速在园子大神那里扒了一个demo,运行,安装一切顺利. 但在在App.config配置中增加了数据库连接字符串配置后,服务安装后无 ...
- Luogu 1071 - 潜伏者 - [字符串]
题目链接:https://www.luogu.org/problemnew/show/P1071 题解: 模拟就完事儿了. 注意failed的情况有:出现一个 $f[x]$ 对应多个值:存在两个不同的 ...
- git迁移
git迁移 项目开发的不同阶段可能要使用不同的git仓库,有时需要迁移. git有很好的方法,只需要几个命令 目标: 我们需要把代码从 http://a.com/projectA.git 迁移到 ht ...
- UI自动化框架——构建思维
目的:从Excel中获取列的值,传输到页面 技巧:尽可能的提高方法的重用率 Java包: 1.java.core包 3个类:1)日志(LogEventListener)扩展web driver自带的事 ...
- 10大必备的Intellij插件,大幅提高你的工作效率
转自: https://blog.csdn.net/qq1404510094/article/details/80379375 1. .ignore 生成各种ignore文件,一键创建git igno ...
- mysql脚本手动修改成oracle脚本
今天有一个需求,立了一个新项目,新项目初步定了使用了现有的框架,但数据库要求由原来的mysql改成oracle,所以原来的基础版本的数据库脚本就需要修改成符合oracle的脚本,修改完成后,总结了一下 ...
- MongoDB常用操作--简介
mongodb在项目中使用越来越觉得日志方面的记录和查询是远远优于MySQL的,所以对其一些基本的操作进行了整理,以下就是整理的一些规则插入数据: insert插入多组数据:inserrAll修改数据 ...