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

 

         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 也基本上总结完了,简单总结一下 MyBatisiBatis 的区别吧

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

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

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

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

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

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

 

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

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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值