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 表达式简化了配置文件的复杂性,使用起来更简洁。