文档章节

MyBatis传入参数与parameterType

小黄狗
 小黄狗
发布于 05/17 18:12
字数 1093
阅读 50
收藏 6

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中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:

 

Java代码  

// 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注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

 

并非原创内容来自:https://www.cnblogs.com/fangyu19900812/p/6046209.html

感谢!

© 著作权归作者所有

共有 人打赏支持
小黄狗
粉丝 30
博文 557
码字总数 179685
作品 0
唐山
程序员
使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常

使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常 问题描述 在使用mybatis对数据库执行更新操作时,parameterType为某个具体的bea...

优惠券活动
04/18
0
0
Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String'

一、发现问题 <select id="queryStudentByNum" resultType="student" parameterType="string"> select num,name,phone from student <where> <if test = " num!=null and num!='' "> AND num......

Candy520
2016/10/19
12
0
MyBatis占位符 #{ } 和 ${ }

相同点:如果传入的是基本类型,那么括号里的变量名称可以随意命名。 如果传入的是pojo对象,那么括号中的变量名称必须是pojo的属性名称。 不同点:#{} 占位符,占位 ${} 拼接符,字符串原样...

IT-Mamba
08/01
0
0
mybatis批量操作问题总结

1、mybatis接受list参数问题 在http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html#foreach里有一段说明: 写道 注意 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你...

Elivense
2016/11/30
3
0
Mybatis 中在传参时,$ 和# 的区别

做个小笔记: MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型。 在SQL中引用这些参数的时候,可以使用两种方式#{param...

牧羊人Berg
2016/06/28
89
0

没有更多内容

加载失败,请刷新页面

加载更多

转:XMLHttpRequest2 新技巧

”XMLHttpRequest 的异步调用网上找的例子运行没问题,但稍微改了一点点就报错”InvalidStateError: XMLHttpRequest has an invalid context“。断断续续 搞了3天终于通了,可以接收二进制文...

SamXIAO
15分钟前
0
0
=====D服务器定时任务=====

Linux定时任务 crontab linux系统是有cron这个系统服务来控制的,Liunx系统上包含很多的计划性工作,使用者自己可以设置计划任务,所以linux系统提供了使用者控制计划任务的命令 crontab的启...

覃光林
24分钟前
0
0
xilinx资源

本系列教学视频由赛灵思高级战略应用工程师带领你:从零开始,一步步深入 掌握 HLS 以及 UltraFAST 设计方法,帮助您成为系统设计和算法加速的大拿! http://www.eetrend.com/topics/2018-0...

whoisliang
35分钟前
2
0
企业级开源四层负载均衡解决方案--LVS

网盘链接 企业级开源四层负载均衡解决方案--LVS 本课程将在Linux环境下,学习配置使用LVS,对Web集群和MySQL集群进行负载均衡,并结合利用Keepalived实现负载均衡器的高可用,实现对后端Rea...

qq__2304636824
44分钟前
3
0
Windows上安装Spacemacs

emacs安装 下载地址emacs 安装比较简单,解压后执行\bin\addpm.exe即可 emacs配置 emacs的默认配置文件路径和.emacs.d文件夹都是在Windows主目录下的 C:\Users\Administrator\AppData\Roami...

yxmsw2007
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部