首页 > 其他分享 >ibatis学习注意事项

ibatis学习注意事项

时间:2023-04-30 20:03:28浏览次数:33  
标签:学习 name map 注意事项 ibatis 参数 sql where id


1.对于多参数的问题:

在ibatis中,会发现其输入参数只能有一个,于是当出现需要进行多个输入参数的时候,就要想点办法了,我看到的有以下两种比较好的方法能够解决这个问题
用String代替

<select id="checkLogin" parameterClass="java.lang.String" resultClass="java.lang.Integer">
SELECT count(*) AS value FROM userinfo WHERE $sql$
</select>
比如如上的map statement代码中,将输入的参数设置为String类型,而在select语句中直接使用该String,于是用户可以在Java程序代码中手工植入需要匹配的参数。
String sql = "uid = '" + username + "' and pwd='" + password + "'";
Integer r = (Integer) sqlMap.queryForObject("checkLogin", sql);
这个方法很简单,但是弊端也很多。首先得需要用户自己手动写sql语句代码在java中,这与ibatis的本质要将数据层的操作和业务逻辑操作分隔开来是违背的。其次,这个办法可能会被利用造成sql injection的问题。比如在sql语句的最后加上一句;drop some table。这样的结果显而易见,就是灾难性的。用 Map
情形一: 
<select id="checkLogin2" parameterClass="java.util.Map" resultClass="java.lang.Integer">
SELECT count(*) AS value FROM userinfo WHERE uid=#uid# and pwd=#pwd#
</select>
这种办法显得要清楚的很多,也不需要自己手动编写sql到java之中。
Map map=new HashMap();
map.put("uid", username);
map.put("pwd", password);
Integer r = (Integer) sqlMap.queryForObject("checkLogin2", map);
在java中首先生成需要的map,然后作为输入参数传入即可。这个方法应该是比较好的,值得推荐。情形二: 
在方法体里:我们把多个参数存放在map里,然后在前面获得它:
Map map = new HashMap();
map.put("userid", userid);
map.put("name", name);cardList = (List)sqlMapClient.queryForList("findByName", map);
在SQL语句中:
<select id="findByName" parameterClass="java.util.Map" resultClass="Card">
select * from cardinfo where userid=#userid# and name like '$name$'
</select>这样就可以将多个参数传过去了。
 
2.ibatis动态update:
情形一
<update id="updateUser" parameterClass="user">     
      update user   
       <dynamic prepend="set">   
           <isNotNull prepend="," property="username">             
                username=#username#   
            </isNotNull>   
           <isNotNull prepend="," property="password">             
                password=#password#   
            </isNotNull>   
       </dynamic>   
      where id=#id#     
</update>  情形二
<update id="updateUser" parameterClass="user">       
     update table       
      set ID=#ID#      
     <isNotEmpty prepend="," property="name">     
         NAME=#name#      
     </isNotEmpty>     
     <isNotEmpty prepend="," property="pwd">     
         PWD=#pwd#      
     </isNotEmpty>     
     <isNotEmpty prepend="," property="add">     
         ADD=#add#       
     </isNotEmpty>     
      where ID=#ID#      
</update>

3.ibatis中的#和$的使用区别:

在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行编译,进行类型匹配,而$不进行数据类型匹配,例如:

select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是'id'类型,如果id为整型,那么#id#就是id类型。 
select * from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成 select * from table where id = '$id$'

说通俗一点就是:

$中间的变量就是直接替换成值的 
  #会根据变量的类型来进行替换 
  比如articleTitle的类型是string, 值是"标题"的时候 
  $articleTitle$ = 标题 
  #articleTitle# = '标题'

标签:学习,name,map,注意事项,ibatis,参数,sql,where,id
From: https://blog.51cto.com/u_4427045/6238088

相关文章

  • 堆与二叉搜索树学习笔记
    部分内容来自OI-WIKI。1.堆堆的定义堆是一棵二叉树,满足每个节点的键值都大于等于它的父亲节点或者小于等于它的父亲节点。每个节点的键值都大于等于它的父亲节点的叫小根堆,每个节点的键值都小于等于它的父亲节点的叫大根堆。优先队列是一种抽象数据类型,它是一种容器,里面有......
  • Http学习之使用HttpURLConnection…
    post请求的OutputStream实际上不是网络流,而是写入内存,在getInputStream中才真正把写道流里面的内容作为正文与根据之前的配置生成的httprequest头合并成真正的http request,并在此时才真正向服务器发送。函数可以改变这个模式,设置了ChunkedStreamingMode后,不再等待Out......
  • 详细的BoltDB学习记录文档
    最近项目中用到了boltdb这个go开发的key/value数据库,但是之前并有接触过,所以特意去看了官方,也找了些资料,网上找的资料要不就是官方文档的翻译,要不就是简单的介绍一点,都不是很全,所以这里记录下。话不多说,冲!本篇文章是参考了官方的文档,内容和官方的基本一致,只是加了些自己的理解......
  • 嵌入式学习笔记汇总
    本文整理STM32、STM8和uCOS-III的所有文章链接。STM32学习笔记目录源码:mySTM32-learnSTM32学习笔记(1)——LED和蜂鸣器STM32学习笔记(2)——按键输入实验STM32学习笔记(3)——时钟系统STM32学习笔记(4)——NVIC中断优先级管理和外部中断EXTISTM32学习笔记(5)——系统定时器SysTickS......
  • matlab学习2(数据预处理、简单线性规划)
    1.matlab导入数据注意事项:记得保存数据,清空工作区或者关闭matlab后数值就没有了。2.数据预处理清理缺失值实时编辑器-->任务-->清理缺失数据处理异常值:实时编辑器-->任务-->清理离群数据例子:x=1:100;%构造一个数组,元素为1,2,...,100%randn(1,100)生成1行100列矩......
  • ActiveMQ学习(一)——MQ的基本概念…
    1)队列管理器队列管理器是MQ系统中最上层的一个概念,由它为我们提供基于队列的消息服务。2)消息在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的内容并对消息进行广义的理解,比如:用户的各种类型的数据文件,某个应用向其它应用发出的处理请求等都可以作为消息。......
  • OpenCV加载深度学习模型
    目录1.单张图像(1)构建网络模型(2)图像预处理(3)预测结果2.多张图像本文使用OpenCV加载深度学习模型,实现了对传入的单张图像或多张图像进行预测。步骤:首先读入Caffe框架训练好的模型,然后对输入图像进行预处理操作,并将其传入已构建的网络模型,最后对得到的预测结果进行排序,找......
  • Gradio: 使用Python构建机器学习网页应用
    Gradio:用Python构建机器学习网页APPGradio是一个开源的Python库,用于构建演示机器学习或数据科学,以及web应用程序。使用Gradio,您可以基于您的机器学习模型或数据科学工作流快速创建一个漂亮的用户界面,让用户可以”尝试“拖放他们自己的图像、粘贴文本、录制他们自己的声音,并通......
  • 树分治学习笔记
    一、点分治一、概述前置知识:数的重心。假设我们要统计一棵有\(n\)个节点的树上所有点对之间距离是\(k\)的有多少对。注意树上的边有长度。\(n\le10^5,k\le10^6\)。一个朴素的算法是遍历树上的所有点对,处理出距离(也就是链的长度)。时间复杂度\(O(n^2)\)。考虑优化。......
  • ActiveMQ学习(三)——MQ的通讯模式…
    1)点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一、一对多、多对多、多对一等多种配置方式,支持树状、网状等多种拓扑结构。2)多点广播:MQ适用于不同类型的应用。其中重要的,也是正在发展中的是"多点广播"应用,即能够将消息发送到多个目标站点(DestinationList)。可以......