Spring4及已经的版本放弃了对ibatis的集成支持,那有什么办法可以将自己的框架迁移升级到spring4呢。
我这里有2个办法可供参考:
1、改造spring-orm包:
A、首先从spring-orm的jar包中将ibatis相关的class文件及包结构全部复制出来,以备后用。
B、更改工程的spring版本号到spring4
C、将已经复制出来的ibatis包结构全部拖入spring4中spring-orm包的响应位置
D、测试一下当前的应用,是不是已经可以了呢 ^_^
2、将spring直接升级到spring4.0,同时集成新的mybatis替代老版本的ibatis。
说明:这两种办法都各有优势,同时也各有不足,实际升级过程中需要权衡考虑利弊关系。
第一中方法,在架构升级过程中,确保了最小改动量的原则,但是会造成一个隐形的私有开发包,一旦架构再次进行spring版本升级,本次的升级操作无法平滑过渡,这种潜规则式的改造方式,需要通过口传心授的方式进行知识的传递,其实在一定程度上给后来的开发人员埋了一个不大不小的坑。
第二种方法将系统的依赖变更提现在pom文件的依赖变化,虽然解决了升级产生的潜规则,但改造周期、测试周期都比较长。因此需要升级者权衡,如果工期紧张,而后续又有持续的改进升级计划,第一种方式可以作为一种临时的高效过渡方案,当有较充足的资源时,可以采用第二种方式,彻底将问题解决掉。
下面我们详细介绍下spring4.0与ibatis的集成,便于大家在升级框架的过程中进行参考:
1、为方便说明,我们新建一个工程,来演示spring与mybatis的集成,新建工程:webinst,结构如下:
D:. └─src ├─main │ ├─java │ │ └─com │ │ └─myteay │ │ └─common │ │ └─dal │ │ └─dinner │ │ ├─dao │ │ ├─dataobject │ │ ├─exec │ │ └─ibatis │ ├─resources │ │ ├─META-INF │ │ │ └─spring │ │ └─sqlmap │ │ └─goods │ └─webapp │ └─WEB-INF └─test └─java └─com └─myteay └─myibatis
工程树说明:
- dao路径下用于存放定义的mybatis数据库操作接口
- dataobject路径下用于存放数据模型
- ibatis路径下用于存放数据库操作接口的实现
- exec用于执行相关测试验证代码
- META-INF/spring路径下存放当前工程的spring配置
- sqlmap路径下存放mybatis相关配置文件
- WEB-INF路径下存放工程相关基础配置如:applicationContext.xml、log4j.xml、web.xml等
本例以spring4.0.0.RELEASE版本为例来说明spring与mybatis的集成,pom文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.myteay</groupId> <artifactId>webinst</artifactId> <version>0.0.1</version> <packaging>war</packaging> <name>webinst</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-servlet_2.4_spec</artifactId> <version>1.1.1</version> <scope>provwided</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.7.25</version> </dependency> <!-- zxing --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.0.0</version> </dependency> <!-- mysql dependency start --> <dependency> <groupId>org.mysql</groupId> <artifactId>mysql-connector-java-commercial</artifactId> <version>5.1.33</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency> <!-- mysql dependency end --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- spring dependency start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.0.0.RELEASE</version> </dependency> <!-- spring dependency end --> <!-- unit test start --> <dependency> <groupId>jmock</groupId> <artifactId>jmock</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>jmock</groupId> <artifactId>jmock-cglib</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- unit test end --> <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> <version>2.0.4</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-sqlmap</artifactId> <version>2.3.4.726</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.5</version> </dependency> <dependency> <groupId>commons-jelly</groupId> <artifactId>commons-jelly</artifactId> <exclusions> <exclusion> <groupId>servletapi</groupId> <artifactId>servletapi</artifactId> </exclusion> </exclusions> <version>1.0-RC1</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>commons-digester</groupId> <artifactId>commons-digester</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>commons-discovery</groupId> <artifactId>commons-discovery</artifactId> <version>0.4</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.0</version> </dependency> <dependency> <groupId>commons-jexl</groupId> <artifactId>commons-jexl</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>nekohtml</groupId> <artifactId>nekohtml</artifactId> <version>0.9.5</version> </dependency> <dependency> <groupId>org.w3c.css</groupId> <artifactId>sac</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>jdom</groupId> <artifactId>jdom</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xerces</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>1.6.4</version> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr-runtime</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.28</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <!--javamail--> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!--velocity--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-tools</artifactId> <version>2.0</version> </dependency> </dependencies> <build> <finalName>webinst</finalName> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.26</version> <configuration> <scanIntervalSeconds>3</scanIntervalSeconds> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>80</port> </connector> </connectors> <scanTargetPatterns> <scanTargetPattern> <directory>src/main/webapp/WEB-INF</directory> <excludes> <exclude>**/*.jsp</exclude> </excludes> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </scanTargetPattern> </scanTargetPatterns> </configuration> </plugin> </plugins> </build> </project>
说明:
- pom中增加了对jetty的依赖,这样可以方便我们后面的测试验证
- 为方便演示,增加了数据库操作相关jar依赖
- 本例中已mybatis3.4.2为目标集成版本
其中对mybatis的关键依赖如下:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency>
对spring的关键依赖如下:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.0.0.RELEASE</version> </dependency>
其他依赖为本人框架升级需要用到的,各位可以忽略。
下面开始进行工程完善:
1、定义数据模型(建数据库表的过程这里省略):
/** * Myteay.com Inc. * Copyright (c) 2015-2016 All Rights Reserved. */ package com.myteay.common.dal.dinner.dataobject; import java.io.Serializable; import java.util.Date; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; /** * 商品信息数据模型 * * @author Administrator * @version $Id: GoodsInfoDO.java, v 0.1 2016年3月5日 上午12:28:53 Administrator Exp $ */ public class GoodsInfoDO implements Serializable { /** serialVersionUID */ private static final long serialVersionUID = 4624303532159349944L; /** ID流水号 */ private String id; /** 店铺流水号 */ private String shopId; /** 图片地址 */ private String picAddr; /** 商品标题 */ private String goodsTitle; /** 价格 */ private String price; /** 备注 */ private String summary; /** 上架时间 */ private Date gmtCreated; /** 最后修改时间 */ private Date gmtModified; /** * Getter method for property <tt>id</tt>. * * @return property value of id */ public String getId() { return id; } /** * Setter method for property <tt>id</tt>. * * @param id value to be assigned to property id */ public void setId(String id) { this.id = id; } /** * Getter method for property <tt>shopId</tt>. * * @return property value of shopId */ public String getShopId() { return shopId; } /** * Setter method for property <tt>shopId</tt>. * * @param shopId value to be assigned to property shopId */ public void setShopId(String shopId) { this.shopId = shopId; } /** * Getter method for property <tt>picAddr</tt>. * * @return property value of picAddr */ public String getPicAddr() { return picAddr; } /** * Setter method for property <tt>picAddr</tt>. * * @param picAddr value to be assigned to property picAddr */ public void setPicAddr(String picAddr) { this.picAddr = picAddr; } /** * Getter method for property <tt>goodsTitle</tt>. * * @return property value of goodsTitle */ public String getGoodsTitle() { return goodsTitle; } /** * Setter method for property <tt>goodsTitle</tt>. * * @param goodsTitle value to be assigned to property goodsTitle */ public void setGoodsTitle(String goodsTitle) { this.goodsTitle = goodsTitle; } /** * Getter method for property <tt>price</tt>. * * @return property value of price */ public String getPrice() { return price; } /** * Setter method for property <tt>price</tt>. * * @param price value to be assigned to property price */ public void setPrice(String price) { this.price = price; } /** * Getter method for property <tt>summary</tt>. * * @return property value of summary */ public String getSummary() { return summary; } /** * Setter method for property <tt>summary</tt>. * * @param summary value to be assigned to property summary */ public void setSummary(String summary) { this.summary = summary; } /** * Getter method for property <tt>gmtCreated</tt>. * * @return property value of gmtCreated */ public Date getGmtCreated() { return gmtCreated; } /** * Setter method for property <tt>gmtCreated</tt>. * * @param gmtCreated value to be assigned to property gmtCreated */ public void setGmtCreated(Date gmtCreated) { this.gmtCreated = gmtCreated; } /** * Getter method for property <tt>gmtModified</tt>. * * @return property value of gmtModified */ public Date getGmtModified() { return gmtModified; } /** * Setter method for property <tt>gmtModified</tt>. * * @param gmtModified value to be assigned to property gmtModified */ public void setGmtModified(Date gmtModified) { this.gmtModified = gmtModified; } /** * @see java.lang.Object#toString() */ public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } }
2、定义DAO接口
/** * Danlley Wei (mailto://danlley@126.com) * Copyright (c) 2005-2017 All Rights Reserved. */ package com.myteay.common.dal.dinner.dao; import java.util.List; import com.myteay.common.dal.dinner.dataobject.GoodsInfoDO; /** * * @author danlley(danlley@126.com) * @version $Id: GoodsInfoDAO.java, v 0.1 2017年4月3日 下午5:19:11 danlley(danlley@126.com) Exp $ */ public interface GoodsInfoDAO { public List<GoodsInfoDO> findAll(); }
相关推荐
最近想在最新的Spring5.0中集成ibatis(不是mybatis),发现已经不在支持SqlmapClientTemplate和SqlmapClientFactoryBean,于是搞了这个工具jar来进行支持如下配置 <bean id="sqlMapClient" class="org.spring...
Spring与iBATIS的集成 iBATIS似乎已远离众说纷纭的OR框架之列,通常人们对非常流行的Hibernate情有独钟。但正如Spring A Developer's Notebook作者Bruce Tate 和Justin Gehtland所说的那样,与其他的OR框架相比...
当我们将 Spring 与 iBatis 集成时,我们可以利用 Spring 的强大管理能力来控制 iBatis 的 SqlSession 和 SqlSessionFactory,从而实现更优雅的数据库操作。以下是一些关于 Spring 集成 iBatis 的关键知识点: 1. *...
Spring还包含一个强大的数据访问抽象层,可以方便地与各种持久层技术(如Ibatis)集成。 Struts是经典的MVC框架,它定义了请求的生命周期,以及模型、视图和控制器之间的交互。当用户发送请求时,Struts拦截请求,...
通过编写单元测试或集成测试来验证ibatis与Spring的整合是否成功。 #### 五、总结 通过以上步骤,我们可以将ibatis与Spring框架很好地整合在一起,利用Spring的强大功能来简化ibatis的配置和管理。这种整合方式...
在整合 iBATIS 时,Spring 会负责创建 SqlSessionFactory 和 SqlSession 的实例,并通过配置文件或注解来注入到需要的地方。 2. **SqlSessionFactory**:这是 iBATIS 提供的工厂类,用于创建 SqlSession 对象。...
部调整了),而iBatis目前最新版本是基于旧版的Castle.DynamicProxy 1.5,如果升级到3.0代码修改量 和测试工作量比较大,估计要看iBatis的发展规划了。 我把Castle.DynamicProxy1.5 和 IBatis.NET 1.92 1.6.2(目前...
Spring 3.0 和 iBatis 的集成是一个常见的企业级应用开发模式,它结合了Spring的强大依赖注入(DI)和面向切面编程(AOP)能力与iBatis灵活的SQL映射机制,实现了业务逻辑层与数据访问层的分离,提高了代码的可维护...
本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...
### Spring与iBatis集成开发详解 #### 一、引言 在Java企业级应用开发领域,Spring框架因其强大的依赖注入(DI)和面向切面编程(AOP)能力而备受青睐;而iBatis(现称为MyBatis)则以其简洁的SQL映射功能而闻名。...
标题 "Eclipse Spring3.x集成ibatis2.x开发案例" 提供了我们即将探讨的核心内容:如何在Eclipse环境中利用Spring3.x版本与iBatis2.x版本进行整合开发。这个主题涵盖了Java企业级开发中的两个重要框架,Spring作为...
在Java Web开发中,Spring和iBatis是两个非常重要的框架。Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等特性,而iBatis则是一个优秀的持久层框架,它将SQL语句与Java代码分离,...
这篇博客可能讨论的是如何将这三个技术——XFire、iBatis和Spring——集成在一起,构建一个Web服务应用程序。在这样的集成中,Spring可以管理整个应用的生命周期,包括XFire的Web服务和iBatis的数据访问层。通过...
集成后的系统可以享受到各框架的优点,如Struts2的MVC结构、iBATIS的简单数据库操作和Spring的强大管理能力。同时,这种集成也使得代码更加模块化,便于维护和扩展。在实际开发中,开发者可以根据项目需求选择合适的...
《基于Spring、Struts和iBatis的jpetstore4.0详解》 jpetstore4.0是一款经典的电子商务示例应用,它采用Spring、Struts和iBatis这三个核心框架构建,展示了如何在Java环境下实现一个完整的MVC(Model-View-...
在本示例中,我们将探讨如何在Spring框架中集成iBATIS,并且将这个集成应用部署到WebSphere 5.1服务器上,并提供一个基于Web服务的接口。首先,我们需要理解Spring和iBATIS的基本概念。 Spring是一个开源的Java企业...
在IT行业中,集成Spring、Struts和iBatis与MySQL是构建企业级Java Web应用程序的常见选择。这个项目集成了Spring 2.5.5、Struts 2.1.6、iBatis 2.3.4以及MySQL 5.1数据库,使用IntelliJ IDEA 9作为开发环境。下面将...
《夏昕的3部开发手册》是一套针对Java开发者的重要参考资料,主要涵盖了三大热门框架——Hibernate、Ibatis和Spring的深度解析。这三者在Java企业级应用开发中扮演着核心角色,是构建高效、可扩展后端服务的基石。 ...