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文件如下:
4.0.0 com.myteay webinst 0.0.1 war webinst http://maven.apache.org org.apache.geronimo.specs geronimo-servlet_2.4_spec 1.1.1 provwided org.slf4j slf4j-nop 1.7.25 com.google.zxing core 3.0.0 org.mysql mysql-connector-java-commercial 5.1.33 commons-dbcp commons-dbcp 1.2.1 org.mybatis mybatis 3.4.2 org.mybatis mybatis-spring 1.3.1 org.springframework spring-aop 4.0.0.RELEASE org.springframework spring-beans 4.0.0.RELEASE org.springframework spring-context 4.0.0.RELEASE org.springframework spring-context-support 4.0.0.RELEASE org.springframework spring-core 4.0.0.RELEASE org.springframework spring-expression 4.0.0.RELEASE org.springframework spring-jdbc 4.0.0.RELEASE org.springframework spring-oxm 4.0.0.RELEASE org.springframework spring-tx 4.0.0.RELEASE org.springframework spring-web 4.0.0.RELEASE org.springframework spring-webmvc 4.0.0.RELEASE org.springframework spring-orm 4.0.0.RELEASE org.springframework spring-test 4.0.0.RELEASE jmock jmock 1.2.0 jmock jmock-cglib 1.2.0 junit junit 3.8.1 test org.apache.mina mina-core 2.0.4 javax.servlet servlet 1.2.0 commons-lang commons-lang 2.2 org.apache.ibatis ibatis-sqlmap 2.3.4.726 commons-logging commons-logging-api 1.1 commons-beanutils commons-beanutils 1.7.0 commons-configuration commons-configuration 1.5 commons-jelly commons-jelly servletapi servletapi 1.0-RC1 commons-collections commons-collections 3.1 commons-digester commons-digester 1.8 commons-codec commons-codec 1.3 commons-io commons-io 1.2 commons-discovery commons-discovery 0.4 commons-pool commons-pool 1.3 commons-httpclient commons-httpclient 3.0 commons-jexl commons-jexl 1.1 nekohtml nekohtml 0.9.5 org.w3c.css sac 1.3 dom4j dom4j 1.6.1 jdom jdom 1.0 xerces xerces 2.4.0 xerces xercesImpl 2.6.2 com.thoughtworks.xstream xstream 1.2.1 org.codehaus.groovy groovy-all 1.6.4 org.antlr antlr 3.1.3 org.antlr antlr-runtime 3.1.3 commons-fileupload commons-fileupload 1.3 com.alibaba fastjson 1.1.28 log4j log4j 1.2.16 javax.mail 1.4.7 org.apache.velocity velocity 1.6.2 org.apache.velocity velocity-tools 2.0 webinst org.mortbay.jetty maven-jetty-plugin 6.1.26 3 80 src/main/webapp/WEB-INF **/*.jsp **/*.properties **/*.xml
说明:
- pom中增加了对jetty的依赖,这样可以方便我们后面的测试验证
- 为方便演示,增加了数据库操作相关jar依赖
- 本例中已mybatis3.4.2为目标集成版本
其中对mybatis的关键依赖如下:
org.mybatis mybatis 3.4.2 org.mybatis mybatis-spring 1.3.1
对spring的关键依赖如下:
org.springframework spring-aop 4.0.0.RELEASE org.springframework spring-beans 4.0.0.RELEASE org.springframework spring-context 4.0.0.RELEASE org.springframework spring-context-support 4.0.0.RELEASE org.springframework spring-core 4.0.0.RELEASE org.springframework spring-expression 4.0.0.RELEASE org.springframework spring-jdbc 4.0.0.RELEASE org.springframework spring-oxm 4.0.0.RELEASE org.springframework spring-tx 4.0.0.RELEASE org.springframework spring-web 4.0.0.RELEASE org.springframework spring-webmvc 4.0.0.RELEASE org.springframework spring-orm 4.0.0.RELEASE org.springframework spring-test 4.0.0.RELEASE
其他依赖为本人框架升级需要用到的,各位可以忽略。
下面开始进行工程完善:
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 id. * * @return property value of id */ public String getId() { return id; } /** * Setter method for property id. * * @param id value to be assigned to property id */ public void setId(String id) { this.id = id; } /** * Getter method for property shopId. * * @return property value of shopId */ public String getShopId() { return shopId; } /** * Setter method for property shopId. * * @param shopId value to be assigned to property shopId */ public void setShopId(String shopId) { this.shopId = shopId; } /** * Getter method for property picAddr. * * @return property value of picAddr */ public String getPicAddr() { return picAddr; } /** * Setter method for property picAddr. * * @param picAddr value to be assigned to property picAddr */ public void setPicAddr(String picAddr) { this.picAddr = picAddr; } /** * Getter method for property goodsTitle. * * @return property value of goodsTitle */ public String getGoodsTitle() { return goodsTitle; } /** * Setter method for property goodsTitle. * * @param goodsTitle value to be assigned to property goodsTitle */ public void setGoodsTitle(String goodsTitle) { this.goodsTitle = goodsTitle; } /** * Getter method for property price. * * @return property value of price */ public String getPrice() { return price; } /** * Setter method for property price. * * @param price value to be assigned to property price */ public void setPrice(String price) { this.price = price; } /** * Getter method for property summary. * * @return property value of summary */ public String getSummary() { return summary; } /** * Setter method for property summary. * * @param summary value to be assigned to property summary */ public void setSummary(String summary) { this.summary = summary; } /** * Getter method for property gmtCreated. * * @return property value of gmtCreated */ public Date getGmtCreated() { return gmtCreated; } /** * Setter method for property gmtCreated. * * @param gmtCreated value to be assigned to property gmtCreated */ public void setGmtCreated(Date gmtCreated) { this.gmtCreated = gmtCreated; } /** * Getter method for property gmtModified. * * @return property value of gmtModified */ public Date getGmtModified() { return gmtModified; } /** * Setter method for property gmtModified. * * @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://[email protected]) * 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([email protected]) * @version $Id: GoodsInfoDAO.java, v 0.1 2017年4月3日 下午5:19:11 danlley([email protected]) Exp $ */ public interface GoodsInfoDAO { public ListfindAll(); }