MyBatis 批量操作、添加日志显示、MyBatis与iBatis区别

本文介绍MyBatis中的批量删除、更新及插入操作,并详细展示了对应的XML配置示例。此外,还提供了MyBatis日志配置示例,帮助开发者轻松调试SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用:http://xdwangiflytek.iteye.com/blog/1750996

      MyBatis中的批量操作主要是通过feacher标签进行循环完成的,主要有批量删除、批量更新、批量插入等。

批量删除

Xml代码   收藏代码
  1. <!-- 设备的批量删除 -->  
  2. <delete id="deleteEquipmentList" parameterType="java.lang.Integer" >  
  3.     delete from dbo.teg_equipment  
  4.     where id in  
  5.     <foreach item="idItem" index="index" collection="list" open="(" separator="," close=")">   
  6.         #{idItem}  
  7.     </foreach>     
  8.  </delete>  

 

这里对于foreach标签的使用可以参考:MyBatis动态SQL

Mapper接口中定义一个方法:

Java代码   收藏代码
  1. /** 
  2.  * @descrption 批量删除  
  3.  * @author xdwang 
  4.  * @create 2012-11-21下午2:32:52 
  5.  * @param ids 需要删除的id集合 
  6.  */  
  7. void deleteEquipmentList(List<Integer> ids);  
 

 

批量更新

Xml代码   收藏代码
  1. <update id="delByUpdateEquipmentList">  
  2.     update dbo.teg_equipment   
  3.      <set >  
  4.          isdeleted = 1  
  5.      </set>  
  6.     where id in  
  7.     <foreach item="idItem" index="index" collection="list" open="(" separator="," close=")">   
  8.         #{idItem}  
  9.     </foreach>     
  10.  </update>  

 

批量插入

Xml代码   收藏代码
  1. <insert id="addBatchStudent" useGeneratedKeys="true" parameterType="java.util.List">  
  2.     <selectKey resultType="long" keyProperty="id" order="AFTER">  
  3.         SELECT  
  4.         LAST_INSERT_ID()  
  5.     </selectKey>  
  6.     insert into tbl_student (name,birth,birth)   
  7.     values  
  8.     <foreach collection="list" item="item" index="index" separator="," >  
  9.         (#{item.name},#{item.birth},#{item.birth})  
  10.     </foreach>  
  11. </insert>  

 

这里需要注意的时,如果我们将foreach 放进<![CDATA[ ]]>中去,执行时会报错: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,查看错误信息就是传入的参数都是null。是因为<![CDATA[ ]]>把xml中的<foreach>标签括起来后把标签直接当成字符串处理了。后面把外面的<![CDATA[ ]]>去掉后就能正常执行了。

 

添加日志显示SQL

MyBatis添加日志是非常有必要的,因为MyBatis可以采用动态SQL,很难保证一次性将SQL语句拼写正常,这时候就需要日志将SQL显示出来,然后供出错时分析。Ok,废话少说,将上次项目中添加的日志拿过来

log4j.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
  4.     <appender name="console" class="org.apache.log4j.ConsoleAppender">  
  5.         <param name="Target" value="System.out" />  
  6.         <layout class="org.apache.log4j.PatternLayout">  
  7.             <param name="ConversionPattern" value="%d{MMM dd yyyy HH:mm:ss,SSS} %-5p %c - %m%n" />  
  8.         </layout>  
  9.     </appender>  
  10.     <category name="net.carefx" additivity="false">  
  11.         <priority value="DEBUG" />  
  12.         <appender-ref ref="console" />  
  13.     </category>  
  14.     <category name="org.springframework" additivity="false">  
  15.         <priority value="DEBUG" />  
  16.         <appender-ref ref="console" />  
  17.     </category>  
  18.     <category name="org.springframework.orm.ibatis3" additivity="false">  
  19.         <priority value="DEBUG" />  
  20.         <appender-ref ref="console" />  
  21.     </category>  
  22.     <category name="org.apache.ibatis" additivity="false">  
  23.         <priority value="DEBUG" />  
  24.         <appender-ref ref="console" />  
  25.     </category>  
  26.     <category name="java.sql" additivity="false">  
  27.         <priority value="DEBUG" />  
  28.         <appender-ref ref="console" />  
  29.     </category>  
  30.     <logger name="org.apache.ibatis.common.jdbc.SimpleDataSource">  
  31.         <level value="DEBUG" />  
  32.     </logger>  
  33.     <logger name="org.apache.ibatis.common.jdbc.SimpleDataSource">  
  34.         <level value="DEBUG" />  
  35.     </logger>  
  36.     <logger name="org.apache.ibatis.common.jdbc.ScriptRunner">  
  37.         <level value="DEBUG" />  
  38.     </logger>  
  39.     <logger name="org.apache.ibatis.common.jdbc.SqlMapClientDelegate">  
  40.         <level value="DEBUG" />  
  41.     </logger>  
  42.     <logger name="java.sql.Connection">  
  43.         <level value="DEBUG" />  
  44.     </logger>  
  45.     <logger name="java.sql.Statement">  
  46.         <level value="DEBUG" />  
  47.     </logger>  
  48.     <logger name="java.sql.PreparedStatement">  
  49.         <level value="DEBUG" />  
  50.     </logger>  
  51.     <logger name="java.sql.ResultSet">  
  52.         <level value="DEBUG" />  
  53.     </logger>  
  54.     <root>  
  55.         <priority value="DEBUG" />  
  56.         <appender-ref ref="console" />  
  57.     </root>  
  58. </log4j:configuration>  

 

 

至此,MyBatis也基本上总结完了,简单总结一下MyBatis与iBatis的区别吧

1、Mybatis实现了接口绑定,使用更加方便

         ·在iBatis2.x中,我们需要在DAO的是实现类中指定具体对应哪个XML文件,这一点,可以从iBatis入门(http://xdwangiflytek.iteye.com/blog/1332520) 中可以发现。而MyBatis实现了DAO接口与XML映射文件的绑定,自动为我们生成接口的具体实现,使用起来更加省事和方便,这点可以在TODO中发现。

         说明:虽然MyBatis支持在接口中直接使用annotation的配置方式来简化配置,不过强烈建议仍然使用XML配置的方式,毕竟annotation的配置方式功能有限且代码侵入性太强,使用XML配置方式才能体现MyBatis的优势所在,自己在项目中也是以XML的方式开发的。

 

2、对象关系映射的改进,效率更高

         ·相信很多在使用ibatis2.x的朋友并没有通过ibatis的xml映射文件来实现对象间的关系映射。其实也确实没有必要那么做,因为ibatis2.x采用的是“嵌套查询”的方式将对象之间的关系通过查询语句的直接拼装来实现,其效果和在DAO或Service中自行封装是一样的。不过这种方式存在“N+1查询问题”。概括地讲,N+1查询问题可以是这样引起的:

· 你执行了一个单独的SQL语句来获取结果列表(就是+1)。

· 对返回的每条记录,你执行了一个查询语句来为每个加载细节(就是N)。

这个问题会导致成百上千的SQL语句被执行。这通常不是期望的。

而在Mybatis中,除了兼容ibatis2.x中的“嵌套查询”方式外,还提供了直接“嵌套结果”的方式,其效果相当于直接通过一句sql将查询出的dto对象自动封装成所需的对象。不过实际上这一改进所带来的好处也是很有限的。因为这一方式在使用分页的时候并不起作用,或者说嵌套对象的结果集是不允许进行分页的。这一点在Mybatis框架中已经做出了明确的限制

 

3、MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。

·熟悉struts2的人应该对OGNL表达式不会感到陌生,MyBatis采用OGNL表达式简化了配置文件的复杂性,使用起来更简洁。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值