`
gaddma
  • 浏览: 17357 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从Ibatis升级到Mybatis及与spring集成

阅读更多

这段时间因为做一个应用的需要,重新捡起ibatis+spring做web开发。

用ibatis的原因是速度,hibernate的执行速度和执行过程中产生的海量的类文件加载卸载的垃圾太多了,需要设置很大的Permgen的大小,才能保证运行正常。

但是重新使用Ibatis的时候,发现Ibatis好多的方法都被@Deprecated的,看样子升级到mybatis势在必行。

 

升级过程主要包括几个方面

1,jar包升级。

需要引入mybatis的包,同时 引入mybatis和spring集成的包。还包括数据库的包,连接池的包,另外mybatis估计使用的是动态代理机制,所以需要引入cglib的包。

 

<!-- mybatis -->
		<dependency>
		  <groupId>org.mybatis</groupId>
		  <artifactId>mybatis</artifactId>
		  <version>3.2.5</version>
		</dependency>
		
		<dependency>
		  <groupId>org.mybatis</groupId>
		  <artifactId>mybatis-spring</artifactId>
		  <version>1.1.1</version>
		</dependency>

		<dependency>
		  <groupId>cglib</groupId>
		  <artifactId>cglib</artifactId>
		  <version>3.1</version>
		</dependency>

		<!-- dbcp -->
		<dependency>
		  <groupId>commons-dbcp</groupId>
		  <artifactId>commons-dbcp</artifactId>
		  <version>1.4</version>
		</dependency>

		<!--Mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.13</version><!--$NO-MVN-MAN-VER$ -->
		</dependency>

2,修改spring的配置方式

 

      spring配置主要是配置数据源、配置SqlSessionFactoryBean和配置SqlSessionTemplate。SqlSessionTemplate是mybatis和ibatis的区别项,ibatis使用SqlMapClientDaoSupport作为应用调用ibatis的接口,mybatis升级使用了SqlSessionTemplate,因此配置的时候需要更改这个选项。

 

 

<!-- 数据源配置, 使用应用中的DBCP数据库连接池 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<!-- Connection Info -->
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />

		<!-- Connection Pooling Info -->
		<property name="maxActive" value="${dbcp.maxActive}" />
		<property name="maxIdle" value="${dbcp.maxIdle}" />
		<property name="defaultAutoCommit" value="true" />
		<property name="timeBetweenEvictionRunsMillis" value="3600000" />
		<property name="minEvictableIdleTimeMillis" value="3600000" />
	</bean>

	<!-- iBatis -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation">
			<value>classpath:sqlMapConfig.xml</value>
		</property>
	</bean>
	
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
        <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>  
    </bean>

 3,修改sqlMapConfig.xml的配置参数。

由于mybatis和ibatis配置方式区别很大,备注几点,1引入的dtd文件需要改,2,别名的配置必需在这个文件中,不能再每个映射文件里面分别配置3,配置文件使用mapper而不是sqlMap。

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<!-- 这个配置使全局的映射器启用或禁用缓存 -->
		<setting name="cacheEnabled" value="true" />
		<!-- 允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如 
			Derby) -->
		<setting name="useGeneratedKeys" value="true" />
		<!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 -->
		<setting name="defaultExecutorType" value="REUSE" />
		<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间。 -->
		<setting name="defaultStatementTimeout" value="25000" />
	</settings>

	<!-- 别名配置 -->
	<typeAliases>
		<typeAlias alias="Product" type="com.eelicai.po.Product" />
	</typeAliases>

	<!-- 指定映射器路径 -->
	<mappers>
		<mapper resource="com/eelicai/dao/sql/ProductSQL.xml" />
	</mappers>
</configuration>

 4,修改mapper文件。

 

这个修改的项比较多,可以参考http://www.myexception.cn/software-architecture-design/1165287.html

主要是

          1,不要使用之前的动态SQL方式,比如isNotEmpty

          2,变量的引用方式使用#{}     

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ProductSQL">


	<select id="getProductList_sql" resultType="Product">  
       	<![CDATA[
			select * from product
       	]]>
	</select>

	<!--通过id获取resultPage记录 -->
	<select id="getProductById_sql" parameterType="long" resultType="Product">   
		<![CDATA[   
		select * from product where id=#{id}   
		]]>
	</select>

	<!--增加新的记录 -->
	<insert id="saveProduct_sql" parameterType="Product" useGeneratedKeys="true" keyProperty="id">
		insert into product(name,introduction,url,dailyValue,avgValue)
		values
		(#{name},#{introduction},#{url},#{dailyValue},#{avgValue})
		<selectKey resultType="long" keyProperty="id">  
	    	SELECT LAST_INSERT_ID() AS id
		</selectKey>
	</insert>

	<!--修改记录 -->
	<update id="updateProductById_sql" parameterType="Product">
		update product
		set id=#{id} ,name=#{name}
		,introduction=#{introduction}
		,url=#{url}
		,dailyValue=#{dailyValue}
		,avgValue=#{avgValue}
		where id=#{id}
	</update>

	<!--删除记录 -->
	<delete id="delProductById_sql" parameterType="long">
		delete from
		product where id=#{id}
	</delete>

</mapper>

 

 

这儿需要标记一个小点,我需要实现一个保存之后可以返回ID的功能。按照之前的方式,根据save方法返回的数字可以得到这个ID,但是mybatis已经修改了这个功能,返回的是影响的条数而不是ID。mybatis的处理方式和hibernate比较像,直接把相应的值设定到对象中。

因此,着重标记几点

1),使用selectKey,其中有个order属性,可以使用before和after,用来标记前后,可以自己google这点。

 

		<selectKey resultType="long" keyProperty="id">  
	    	SELECT LAST_INSERT_ID() AS id
		</selectKey>

 2),mysql数据库使用@@identity 和LAST_INSERT_ID()都可以返回使用的ID。但是很容易想到的一个问题是关于并发的,如果说所有的应用都共享这个查询数据的话,那么高并发的时候,返回的ID就一定是不对的。

所以查了一下这个相关的问题,主要的回答有几个:

http://zhidao.baidu.com/link?url=3wZfO_VNtyb3rj-C_lSKUOLbC7hGHXC6JXRRF1EZBAv6mz5jxsRPMiuleV-Mi8p5m9GOiodrKrPamCEnFTse2a

http://forums.devshed.com/php-development-5/last_insert_id-deal-concurrency-545291.html

 

 简单的说就是,LAST_INSERT_ID()这个函数是和连接绑定的,保证每个连接可以返回自身修改的数据,其它连接的修改提交是修改不了本连接返回的值的。

 

 

 5,修改调用方式

 

	@Resource
	private SqlSessionTemplate sqlSession;

 

 

 

6,其它特性

 

mybatis加了一些新的特性需要继续研究,下次在写

6.1   动态SQL的书写

参考http://haohaoxuexi.iteye.com/blog/1338557

大体的意思是使用OGNL标签(类似JSTL)去做相应的操作。所以猜测mybatis使用的是模板配置的方式,生成SQL语句,速度不知道怎么样。

6.2   加了一个叫映射器的新东西,只需要写出接口而不需要实现类就能够操作数据

 

 

 

 

 

 

That's All.

 本文只是记录最近做的事情和一些经验所得,由于没有系统整理过,所以自己看懂就可以了。

 

分享到:
评论

相关推荐

    从iBatis迁移到MyBatis

    标题 "从iBatis迁移到MyBatis" 暗示了本次讨论的主题是关于数据库持久层框架的升级,从较早的iBatis转向更现代的MyBatis。iBatis是一个Java语言中的SQL映射框架,而MyBatis是在iBatis的基础上发展起来的,提供了更多...

    ibatis2.X升级mybatis3.X之曲径通幽处

    本篇文章将探讨从ibatis2.x升级到mybatis3.x的过程,揭示其中的技术变迁和核心变化。 Ibatis2.x是一款轻量级的ORM框架,它允许开发者通过SQL Map配置文件来编写SQL语句,提供了灵活的SQL控制。然而,随着技术的发展...

    MyBatis(iBatis 3)入门示例 及 整合Mybatis与Spring3

    通过以上步骤,你就可以在Spring应用中顺利集成并使用MyBatis进行数据库操作了。这种方式不仅简化了代码,还使得事务管理和对象管理变得更加方便。在实际开发中,这种整合方式被广泛应用,极大地提升了开发效率和...

    mybatis-spring集成

    MyBatis-Spring集成是MyBatis与Spring框架整合的方案,旨在帮助开发者无缝地将MyBatis整合到Spring项目中。这种整合不仅使MyBatis能够利用Spring框架提供的事务管理功能,还提供了一种方便的方式来注入MyBatis的数据...

    ibatis迁移到mybatis3共6页.pdf.zip

    【标题】:“ibatis迁移到mybatis3共6页.pdf.zip”这个压缩文件显然包含了关于将旧版的iBATIS数据持久层框架升级至MyBatis 3版本的指南或教程。iBATIS和MyBatis都是Java开发中广泛使用的ORM(对象关系映射)框架,但...

    mybatis_spring_struts2_tjz.zip_ibatis_mybatis_spring_spring stru

    初学者通过这个项目可以学习到如何配置这三个框架,如何在Struts2的Action中注入Spring管理的Service,以及Service如何调用MyBatis(iBATIS)进行数据库操作。同时,了解如何将Struts2的Action结果转发或重定向到...

    2011最新ibatis+Mybatis+Spring整合文档全集以及案例

    总结起来,这份文档全集对于Java开发者来说是一份宝贵的资源,它涵盖了从基础理论到实践应用的全方位知识,特别是对于想要学习或已经在使用ibatis、Mybatis和Spring进行整合开发的人来说,具有很高的参考价值。...

    Spring高版本对ibatis的支持

    最近想在最新的Spring5.0中集成ibatis(不是mybatis),发现已经不在支持SqlmapClientTemplate和SqlmapClientFactoryBean,于是搞了这个工具jar来进行支持如下配置 &lt;bean id="sqlMapClient" class="org.spring...

    iBatis和MyBatis对比

    从iBatis迁移到MyBatis,开发者可以享受到更多现代框架带来的便利,同时,对于熟悉iBatis的开发者,MyBatis的学习成本并不会很高,因为它保留了iBatis的核心理念和大部分API。因此,无论你是刚接触持久层框架的新手...

    mybatis3+spring配置

    - MyBatis-Spring是一个辅助工具库,它旨在简化MyBatis与Spring框架之间的集成过程。通过使用该库中的类,Spring能够自动加载所需的MyBatis工厂类和会话类。此外,它还提供了注入MyBatis数据映射器和SqlSession到...

    mybatis与spring三种整合方式与需要的jar包列表

    总的来说,MyBatis与Spring的整合提供了多样化的选择,开发者可以根据项目需求选择最适合的集成方式。每种方式都有其优势,例如仅使用MyBatis时,配置相对简单,而结合Spring后,事务管理、依赖注入等特性可以进一步...

    mybaits-spring(ibatis-spring)-1.0.2-bundle

    《MyBatis-Spring整合详解及1.0.2版本剖析》 MyBatis-Spring是MyBatis和Spring框架的集成库,旨在简化在Spring应用中使用MyBatis的过程,实现两者的无缝连接。本篇文章将深入探讨MyBatis-Spring的核心功能,以及...

    mybatis、ibatis、spring各种整合方式

    标题 "mybatis、ibatis、spring各种整合方式" 涉及的是在Java开发中将MyBatis、iBatis与Spring框架集成的各种方法。MyBatis和iBatis(后更名为MyBatis)是两个流行的持久层框架,而Spring是一个全面的企业级应用框架...

    spring与ibatis整合集成实例

    以上就是 Spring 与 iBATIS 整合集成的主要步骤和知识点。通过这样的集成,可以利用 Spring 的强大功能管理和协调整个应用程序,同时利用 iBATIS 的灵活性处理数据库操作,实现高效的企业级应用开发。在实际项目中,...

    mybatis-spring-1.2.5.zip

    《MyBatis-Spring 1.2.5:整合MyBatis与Spring的桥梁》 在Java开发领域,MyBatis和Spring都是极为重要的框架,它们分别在持久层和应用层发挥着重要作用。MyBatis-Spring是这两个框架的集成工具,它提供了一种无缝的...

    Spring与iBATIS的集成

    ### Spring与iBATIS的集成 #### 概述 在软件开发领域,特别是Java企业级应用开发中,Spring框架和iBATIS(现已更名为MyBatis)是非常重要的两个技术组件。Spring作为一款全面的企业级应用解决方案,其核心功能包括...

    Windchill+spring+mybatis

    ### Windchill与Spring+MyBatis集成技术详解 #### 一、背景介绍 随着企业信息化建设的深入发展,各种信息系统被广泛应用。其中,Windchill作为一款领先的产品生命周期管理(PLM)软件,在制造业中得到了广泛的应用...

    struts2+spring+mybatis+easyui的实现

    下面我们将深入探讨这三个框架以及EasyUI的集成与实现。 **Struts2** 是一个强大的MVC框架,负责处理HTTP请求并将其映射到特定的Action,进而执行业务逻辑。在Struts2中,Action类是业务逻辑的载体,配置在struts....

    spring boot 集成 mybatis

    在本文中,我们将深入探讨如何将Spring Boot与MyBatis集成,以便在初学者的项目中实现用户查询功能。Spring Boot以其简洁的配置和自动配置特性,极大地简化了Java应用程序的开发过程。MyBatis则是一个优秀的持久层...

Global site tag (gtag.js) - Google Analytics