MyBatis传入参数与parameterType

1.   传入简单类型


    JAVA代码:

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

 
 MAPPER :

 

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

  
2.   传入List

 

    JAVA代码:

 

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

 

MAPPER :

 

 

Xml代码  收藏代码
  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代码:

 

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

 

 MAPPER :

 

 

Xml代码  收藏代码
  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代码:

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 :

Xml代码  收藏代码
  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代码:

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 :

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

 

Java代码  收藏代码
  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为我们做了很多默认的事情,具体的写法应该如下:

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis的xml配置实例

主表&#xff1a; <?xml version"1.0" encoding"UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.1//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 软件信息数据查询相关 yangxuefe…

火狐浏览器Firefox怎样设置中文

火狐浏览器Firefox怎样设置中文&#xff1f;很多用户从官网下载火狐浏览器后&#xff0c;会发现他默认的是英文版&#xff0c;不知道如何更改为中文版&#xff0c;下面小编就为大家介绍下Firefox设置中文方法。 如果下载的是官方版的火狐浏览器&#xff0c;默认的预言可能会是…

qq浏览器如何进入私密 qq浏览器怎样进入私密

随着移动互联网的发展&#xff0c;越来越多人使用QQ浏览器浏览新闻&#xff0c;有时想开启文件私密空间&#xff0c;那么QQ浏览器如何开启文件私密空间呢?下面让小编告诉一下详细操作步骤。 打开手机&#xff0c;找到“QQ浏览器”图标并点击它。 <a styleqq浏览器如何进入…

win7系统屏保时间设置更改教程

win7的屏保可以在我们短暂离开电脑时节省电量&#xff0c;延长屏幕存活时间&#xff0c;还可以保护屏幕信息不泄露出去&#xff0c;但是如果屏保时间设置不好可能就起不到作用&#xff0c;因此我们可以在个性化设置中对屏保时间进行手动设置&#xff0c;下面就一起来看一下win7…

Easyui+Spring+Mybatis完整示例(前台)

典型的EasyuiSpringMybatis例子,方便自己的记忆.JSP:<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://…

win7系统管理员权限更改教程

我们在使用win7系统的时候&#xff0c;有时候会发现自己的账户因为没有管理员权限从而无法更改某些设置或者打开一些文件&#xff0c;非常不方便&#xff0c;因此我们可以通过下面的方法让自己获得管理员权限&#xff0c;下面就一起来看一下win7系统管理员权限更改教程吧。 wi…

Highcharts+Spring饼图使用实例

项目上要用到Hightcharts展示平台机器占用情况,使用这类第三方插件很方便就能实现 JSP: <script type"text/javascript" src"<%basePath%>/resources/thirdparty/highcharts/highcharts.js"></script><div id"machineRate"…

win7更改适配器设置没有本地连接解决方法

最近有很多朋友反映遇到了需要更改适配器设置时&#xff0c;发现我们的适配器设置中没有本地连接&#xff0c;这有可能是因为我们的网卡没有插好&#xff0c;也可能是网卡驱动出现了问题&#xff0c;可以使用下面的方法进行排查和解决。下面小编介绍win7更改适配器设置没有本地…

Easyui+Spring+Mybatis完整示例(后台)

Controller: /**软件管理*/ Controller RequestMapping("/deploySoftware") public class DeploySoftwareController extends BaseController {Autowiredprivate DeploySoftwareService deploySoftwareService;/**跳转到软件信息页面 */RequestMapping("/list&q…

猎豹浏览器怎么收藏网页 网页收藏方法简述

在网站上看到了喜欢的内容&#xff0c;许多人都会选择将之收藏起来&#xff0c;以便下一次观看。但不同浏览器产品中的网页收藏方法&#xff0c;也各不相同!那么&#xff0c;猎豹浏览器要怎么收藏网页呢?下面小编就来详细介绍一下猎豹浏览器中网页收藏的具体方法&#xff0c;小…

Highcharts双饼图使用实例

这次实践了Highcharts的双饼图,确实比普通饼图复杂多了,关键相关数据 多不能继续用简单基本数据类型Map,list了,单独建了个VO存放要用到的数据,不多说,贴代码! JS: /**查看机器占比(按产品线) 2015/8*/ function loadMachineRate(){var chart;$(document).ready(function(){ch…

火狐浏览器如何更改字体 火狐浏览器字体更改方法分享

中文俗称“火狐”的Mozilla Firefox&#xff0c;不仅是一款自由及开放源代码的网页浏览器&#xff0c;其在国内也不乏拥趸。当然&#xff0c;想要熟练使用火狐浏览器&#xff0c;还需要一定的经验和技巧!那么&#xff0c;在火狐浏览器中该如何更改字体呢?下面就让我们来了解一…

一个API接口的例子,包括单元测试

功能大体需求是通过平台获取该平台的所有节点(节点按省,运营商分组)以及节点的所有IP信息(地址和层级),表关系比较复杂,搞了两天才好,是自己一开始搞复杂了。 VO:存放所需元素实体类 public class PlatformIpVO implements Serializable {private String province;private Str…

SpringMVC+uploadify文件上传

前言 准备筹划一个自己的个人网站&#xff0c;初步的架构设计采用SSH&#xff08;Spring-MVC&#xff0c;Spring&#xff0c;Hibernate&#xff09;&#xff0c;在这里 顺便记录一下设计和开发过程&#xff0c;以备参考。后续会陆续更新文档&#xff0c;如有任何问题&#xff0…

谷歌浏览器怎么更新升级 谷歌浏览器手动更新方法

谷歌浏览器怎么更新升级?作为走在网页浏览器行业最前端的浏览器&#xff0c;谷歌相当受欢迎。浏览器的升级是为了修复漏洞和完善浏览器的功能&#xff0c;但有时候浏览器本身并不会自动升级&#xff0c;当你的电脑管家也没有提醒你软件升级的时候&#xff0c;我们如何手动给谷…

Easyui动态加载后台数据的例子

JS: /**接口验证查询按钮*/ function strategyCheckSearch(){var strategyRows $("#strategyCheckDg").datagrid(getRows);var strategyIp $("#strategyIp").val().trim();var strategyPort $("#strategyPort").val().trim();if(strategyIp.le…

火狐怎么在线升级 火狐浏览器在线升级方法分享

想要尝试最新版本的火狐浏览器&#xff0c;不仅可以前往火狐官网下载最新版本的客户端&#xff0c;还可以将现有的版本进行升级。那么&#xff0c;火狐该怎么在线升级呢?下面小编就来分享一下火狐浏览器在线升级的方法&#xff0c;不清楚具体操作的朋友可以稍作参考。 方法步…

win7系统任务管理器如何强制关闭程序

win7系统是一款大家用了都说好的系统&#xff0c;最近一直有很多的小伙伴们反应不知道win7任务管理器如何强制关闭程序?今天小编就为大家带来了win7系统任务管理器强制关闭程序的方法&#xff0c;让我们一起来看看吧。 win7系统任务管理器如何强制关闭程序&#xff1a; 1、按…

jquery获取checkbox是否选中

$(#checkbox).attr(checked); 返回的是checked或者是undefined&#xff0c;不是原来的true和false了&#xff0c;有关此问题的解决方法如下: <input typecheckbox idcb/> <script> //获取是否选中 var isChecked $(#cb).prop(checked); //或 var isChecked …

win7让任务管理器pid显示出来的方法

win7怎么让任务管理器pid显示出来?win7系统是一款优秀的电脑系统。各种各样的设置都可以帮助用户们更好的使用win7系统&#xff0c;今天小编为大家带来的就是win7任务管理器pid显示出来的设置方法一起来看看吧。 win7让任务管理器pid显示出来的方法&#xff1a; 1、鼠标右键…