引用:http://xdwangiflytek.iteye.com/blog/1750996
MyBatis中的批量操作主要是通过feacher标签进行循环完成的,主要有批量删除、批量更新、批量插入等。
批量删除
- <!-- 设备的批量删除 -->
- <delete id="deleteEquipmentList" parameterType="java.lang.Integer" >
- delete from dbo.teg_equipment
- where id in
- <foreach item="idItem" index="index" collection="list" open="(" separator="," close=")">
- #{idItem}
- </foreach>
- </delete>
这里对于foreach标签的使用可以参考:MyBatis动态SQL
Mapper接口中定义一个方法:
- /**
- * @descrption 批量删除
- * @author xdwang
- * @create 2012-11-21下午2:32:52
- * @param ids 需要删除的id集合
- */
- void deleteEquipmentList(List<Integer> ids);
批量更新
- <update id="delByUpdateEquipmentList">
- update dbo.teg_equipment
- <set >
- isdeleted = 1
- </set>
- where id in
- <foreach item="idItem" index="index" collection="list" open="(" separator="," close=")">
- #{idItem}
- </foreach>
- </update>
批量插入
- <insert id="addBatchStudent" useGeneratedKeys="true" parameterType="java.util.List">
- <selectKey resultType="long" keyProperty="id" order="AFTER">
- SELECT
- LAST_INSERT_ID()
- </selectKey>
- insert into tbl_student (name,birth,birth)
- values
- <foreach collection="list" item="item" index="index" separator="," >
- (#{item.name},#{item.birth},#{item.birth})
- </foreach>
- </insert>
这里需要注意的时,如果我们将foreach 放进<![CDATA[ ]]>中去,执行时会报错: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,查看错误信息就是传入的参数都是null。是因为<![CDATA[ ]]>把xml中的<foreach>标签括起来后把标签直接当成字符串处理了。后面把外面的<![CDATA[ ]]>去掉后就能正常执行了。
添加日志显示SQL
MyBatis添加日志是非常有必要的,因为MyBatis可以采用动态SQL,很难保证一次性将SQL语句拼写正常,这时候就需要日志将SQL显示出来,然后供出错时分析。Ok,废话少说,将上次项目中添加的日志拿过来
log4j.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{MMM dd yyyy HH:mm:ss,SSS} %-5p %c - %m%n" />
- </layout>
- </appender>
- <category name="net.carefx" additivity="false">
- <priority value="DEBUG" />
- <appender-ref ref="console" />
- </category>
- <category name="org.springframework" additivity="false">
- <priority value="DEBUG" />
- <appender-ref ref="console" />
- </category>
- <category name="org.springframework.orm.ibatis3" additivity="false">
- <priority value="DEBUG" />
- <appender-ref ref="console" />
- </category>
- <category name="org.apache.ibatis" additivity="false">
- <priority value="DEBUG" />
- <appender-ref ref="console" />
- </category>
- <category name="java.sql" additivity="false">
- <priority value="DEBUG" />
- <appender-ref ref="console" />
- </category>
- <logger name="org.apache.ibatis.common.jdbc.SimpleDataSource">
- <level value="DEBUG" />
- </logger>
- <logger name="org.apache.ibatis.common.jdbc.SimpleDataSource">
- <level value="DEBUG" />
- </logger>
- <logger name="org.apache.ibatis.common.jdbc.ScriptRunner">
- <level value="DEBUG" />
- </logger>
- <logger name="org.apache.ibatis.common.jdbc.SqlMapClientDelegate">
- <level value="DEBUG" />
- </logger>
- <logger name="java.sql.Connection">
- <level value="DEBUG" />
- </logger>
- <logger name="java.sql.Statement">
- <level value="DEBUG" />
- </logger>
- <logger name="java.sql.PreparedStatement">
- <level value="DEBUG" />
- </logger>
- <logger name="java.sql.ResultSet">
- <level value="DEBUG" />
- </logger>
- <root>
- <priority value="DEBUG" />
- <appender-ref ref="console" />
- </root>
- </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表达式简化了配置文件的复杂性,使用起来更简洁。