`

Spring+Ibatis构建多库业务系统(一)

阅读更多

http://244369.blog.chinajavaworld.com/entry/4974/0/

 

Spring+Ibatis构建多库业务系统 

一、前言 
听说Spring的功能如何强大已经很久了,甚至自己非常擅长使用的Ibatis,也从V2.3以后完全拿掉了自身的Dao实现,转而推荐使用Spring的Bean实现了。于是怀着很激动地心情开始了Spring+Ibatis的整合之旅。原以为按照Spring的说明书,以及参考网友们的实践经验,一定也能很快搭建出全新的开发架构。然而,遇见的问题之多,确实也让自己始料未及。下面把一步步的构建过程记录下来,一方面是对前一阶段工作的一个总结,另外一方面也期望更多的高手能够指点一二。 

二、此架构适用的范围 
此架构基于Spring+Ibatis整合而成,在最初的设计中,我期望这个架构能够不仅仅做基本的SQL操作,而且能够比较方便地扩展更多的数据库进入这个架构,并且能够实现单库或多库的事务处理。基于很多应用服务器并不支持JTATransactionManager(如Tomcat), 我采用JdbcTransactionManager实现单库或多库的事务处理。所以这个架构适用于基于JdbcTransactionManager实现单库或多库事务处理的情况。 

三、搭建架构过程 
1. 确定搭建成功的目标 
下面的搭建过程已实现多库的事务处理成功为目标。为了验证这个目标是否完成,我们将使用Oracle和mysql两个数据库。我们将假设一个业务,业务的步骤是同时向oracle库中的offered表和test表写入测试数据,向mysql库中的contact表写入数据。如果此业务的每一个步骤都执行成功,数据将写入数据库。如果此业务的任何一个步骤出错,那么两个数据库都将执行回滚,数据将不写入数据库。 
2. 初始化数据库 
1)初始化oracle 
1234567891011121314151617181920212223 --创建offered表主键所需的序列
create sequence SEQ_FA_ID minvalue 1 maxvalue 9999999999
start with 1 increment by 1 cache 20;
--创建表offered 
create table OFFERED
(
  ID            NUMBER not null,
  CONTACTMAN    VARCHAR2(64) not null,
  CONTACTTEL    VARCHAR2(64),
  CONTACTEMAIL  VARCHAR2(128),
  ORGANIZATION  VARCHAR2(128),
  LOCATION      VARCHAR2(128),
  OFFEREDAMOUNT NUMBER default 0,
  OFFEREDWISH   VARCHAR2(512),
primary key(ID)
);
--创建表test
create table TEST
(
  NAME      VARCHAR2(128),
  INPUTTIME DATE default sysdate,
  CONTENT   CLOB
);
 

2)初始化mysql 
需要注意的是,mysql数据库的InnoDB类型库才支持事务处理。 
1234567891011 CREATE TABLE contact(                                
           id int(11) NOT NULL auto_increment,                 
           contactMan varchar(64) NOT NULL,                    
           contactTel varchar(64) default NULL,                
           contactEmail varchar(128) default NULL,             
           organization varchar(128) default NULL,             
           location text,                                      
           offeredAmount int(11) default 0,                  
           offeredWish text,                                   
           PRIMARY KEY  (id)                                   
         ) ENGINE=InnoDB
 


3.创建数据对象DataObject 
1)结构图 
 
2)创建抽象类DataObject 
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 /**
 * DataObject.java
 * Abstract class for all DataObject
 * Copyright 2008 
 * $Author: Lawrence Lin $
 */
package supercms.domain;
import java.util.Date;
import supercms.util.Message;
 
public abstract class DataObject{
    protected boolean checked;
    protected String inputbyman;
    protected Date inputDate;
    protected String modifiedby;
    protected Date modifiedDate;
    protected String ipAddress;
    protected Message echoMessage;
 
                public Message getEchoMessage() {
		return echoMessage;
	}
	public void setEchoMessage(Message echoMessage) {
		this.echoMessage = echoMessage;
	}
	public Date getInputDate() {
		return inputDate;
	}
	public void setInputDate(Date inputDate) {
		this.inputDate = inputDate;
	}
	public DataObject(){
                               checked = false;
               }
	public boolean isChecked() {
		return checked;
	}
	public void setChecked(boolean checked) {
		this.checked = checked;
	}
 
	public String getInputbyman() {
		return inputbyman;
	}
	public void setInputbyman(String inputbyman) {
		this.inputbyman = inputbyman;
	}
	public String getModifiedby() {
		return modifiedby;
	}
	public void setModifiedby(String modifiedby) {
		this.modifiedby = modifiedby;
	}
	public Date getModifiedDate() {
		return modifiedDate;
	}
	public void setModifiedDate(Date modifiedDate) {
		this.modifiedDate = modifiedDate;
	}
	public String getIpAddress() {
		return ipAddress;
	}
	public void setIpAddress(String ipAddress) {
		this.ipAddress = ipAddress;
	}
}
 


3)创建数据对象Offered 
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 package supercms.domain;
 
public class Offered extends DataObject{
	private int id;
	private String contactMan;
	private String contactTel; 
	private String contactEmail; 
	private String organization;
	private String location;
	private int offeredAmount;
	private String offeredWish;
	
	public Offered(){
		super();
	}
	
	public void init(){
		
	}
	
	public void copy(Offered source){
		
	}
	
	public String getContactEmail() {
		return contactEmail;
	}
	public void setContactEmail(String contactEmail) {
		this.contactEmail = contactEmail;
	}
	public String getContactMan() {
		return contactMan;
	}
	public void setContactMan(String contactMan) {
		this.contactMan = contactMan;
	}
	public String getContactTel() {
		return contactTel;
	}
	public void setContactTel(String contactTel) {
		this.contactTel = contactTel;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getLocation() {
		return location;
	}
	public void setLocation(String location) {
		this.location = location;
	}
	public int getOfferedAmount() {
		return offeredAmount;
	}
	public void setOfferedAmount(int offeredAmount) {
		this.offeredAmount = offeredAmount;
	}
	public String getOfferedWish() {
		return offeredWish;
	}
	public void setOfferedWish(String offeredWish) {
		this.offeredWish = offeredWish;
	}
	public String getOrganization() {
		return organization;
	}
	public void setOrganization(String organization) {
		this.organization = organization;
	}
}
 


4)创建数据对象 Test 
1234567891011121314151617181920 package supercms.domain;
 
public class Test extends DataObject {
    private String name;
    private String content;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
}
 
 
 

5)创建数据对象 Contact 
为了方便,我们使用和Offered一样的数据结构 
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 package supercms.domain;
 
public class Contact extends DataObject{
	private int id;
	private String contactMan;
	private String contactTel; 
	private String contactEmail; 
	private String organization;
	private String location;
	private int offeredAmount;
	private String offeredWish;
	
	public Contact(){
		super();
	}
	
	public void init(){
	}
	
	public void copy(Contact source){
		
	}
	
	public String getContactEmail() {
		return contactEmail;
	}
	public void setContactEmail(String contactEmail) {
		this.contactEmail = contactEmail;
	}
	public String getContactMan() {
		return contactMan;
	}
	public void setContactMan(String contactMan) {
		this.contactMan = contactMan;
	}
	public String getContactTel() {
		return contactTel;
	}
	public void setContactTel(String contactTel) {
		this.contactTel = contactTel;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getLocation() {
		return location;
	}
	public void setLocation(String location) {
		this.location = location;
	}
	public int getOfferedAmount() {
		return offeredAmount;
	}
	public void setOfferedAmount(int offeredAmount) {
		this.offeredAmount = offeredAmount;
	}
	public String getOfferedWish() {
		return offeredWish;
	}
	public void setOfferedWish(String offeredWish) {
		this.offeredWish = offeredWish;
	}
	public String getOrganization() {
		return organization;
	}
	public void setOrganization(String organization) {
		this.organization = organization;
	}
}
 


4.编写Ibatis的sqlmap文件 
1) 配置oracle数据库对应的sqlmap文件; 
文件offered.xml 
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
 
<sqlMap namespace="Oracle">
	<typeAlias alias="Offered" type="supercms.domain.Offered"/>
	<typeAlias alias="Test" type="supercms.domain.Test"/>
 
	<insert id="insertOffered" parameterClass="Offered">
	    <selectKey resultClass="int" keyProperty="id" > 
	        SELECT SEQ_FA_ID.nextval AS id FROM DUAL 
	    </selectKey>		
		INSERT INTO offered(
		   id,contactMan,contactTel,contactEmail,
                                   organization,location,offeredAmount,offeredWish
		)VALUES(
		  #id#,#contactMan#,#contactTel#,#contactEmail#,
                                  #organization#,#location#,#offeredAmount#,#offeredWish#
		)
	</insert>
 
	<update id="updateOffered" parameterClass="Offered">
	     UPDATE offered set 
                         contactMan=#contactMan#,
                         contactTel=#contactTel#,
                         contactEmail=#contactEmail#,
                         organization=#organization#,
                         location=#location#,
                         offeredAmount=#offeredAmount#,
                         offeredWish=#offeredWish#
	     WHERE id=#id#
	</update>
 
	<delete id="deleteOffered" parameterClass="java.lang.Integer">
		delete from offered WHERE id = #id#
	</delete>
	
	<select id="QueryOneOffered" resultClass="Offered" parameterClass="java.lang.Integer">
	        SELECT id,contactMan,contactTel,contactEmail,
                             organization,location,offeredAmount,offeredWish
	         FROM offered 
	        WHERE id = #id# 
	</select>
	
 
	<select id="QueryOffered" resultClass="Offered" parameterClass="Offered">
                    SELECT id,contactMan,contactTel,contactEmail,
                          organization,location,offeredAmount,offeredWish
	    FROM offered where 1=1 
	    <isNotEmpty prepend="AND" property="contactMan">
	         contactMan = #contactMan# 
	   </isNotEmpty>			
		ORDER BY id
	</select>
	
	<select id="CountOffered" parameterClass="Offered" resultClass="int">
		SELECT count(*) as  rowsnum 
		FROM offered where 1=1 
		<isNotEmpty prepend="AND" property="contactMan">
		   contactMan = #contactMan# 
		</isNotEmpty>
	</select>		
	
	<insert id="insertTest" parameterClass="Test">
	   insert into test(name,inputtime,content) 
	   values(#name#,sysdate,#content,javaType=java.lang.String,jdbcType=CLOB#)
	</insert>
</sqlMap>
 


文件sqlmapconfig.xml 
123456789 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
 
 
<sqlMapConfig>
	<!-- SQL Map XML configuration -->
	<sqlMap resource="supercms/resource/sqlmap/ora/offered.xml"/>
</sqlMapConfig>
 


2)配置mysql数据库对应的sqlmap文件 
文件contact.xml 
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
 
<sqlMap namespace="mysql">
	<typeAlias alias="Contact" type="supercms.domain.Contact"/>
 
 
	<insert id="insertContact" parameterClass="Contact">
		INSERT INTO contact(
		   id,contactMan,contactTel,contactEmail,
           organization,location,offeredAmount,offeredWish
		)VALUES(
		  #id#,#contactMan#,#contactTel#,#contactEmail#,
          #organization#,#location#,#offeredAmount#,#offeredWish#
		)
	</insert>
 
	<update id="updateContact" parameterClass="Contact">
	    UPDATE contact set 
                         contactMan=#contactMan#,
                         contactTel=#contactTel#,
                         contactEmail=#contactEmail#,
                         organization=#organization#,
                         location=#location#,
                         offeredAmount=#offeredAmount#,
                         offeredWish=#offeredWish#
	     WHERE id=#id#
	</update>
 
	<delete id="deleteContact" parameterClass="java.lang.Integer">
		delete from contact WHERE id = #id#
	</delete>
	
	<select id="QueryOneContact" resultClass="Contact" parameterClass="java.lang.Integer">
		SELECT id,contactMan,contactTel,contactEmail,
                                organization,location,offeredAmount,offeredWish
		FROM contact 
		WHERE id = #id# 
	</select>
	
 
	<select id="QueryContacts" resultClass="Contact" parameterClass="Contact">
                   SELECT id,contactMan,contactTel,contactEmail,
                       organization,location,offeredAmount,offeredWish
	   FROM offered where 1=1 
	   <isNotEmpty prepend="AND" property="contactMan">
	      contactMan = #contactMan# 
	    </isNotEmpty>			
	    ORDER BY id
	</select>
	
	<select id="CountContacts" parameterClass="Contact" resultClass="int">
		SELECT count(*) as  rowsnum 
		FROM offered where 1=1 
		<isNotEmpty prepend="AND" property="contactMan">
		   contactMan = #contactMan# 
		</isNotEmpty>
	</select>		
	
</sqlMap>
 

 

分享到:
评论

相关推荐

    spring+ibatis事务的配置

    很好的spring+ibatis事务的配置文档.

    struts2+spring+ibatis+mysql

    "Struts2+Spring+Ibatis+MySQL" 是一个经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    struts+spring+ibatis做的一个增删改查例子

    在Struts+Spring+iBATIS的架构中,iBATIS负责与数据库交互,通过SQL映射文件(sqlmap.xml)定义SQL查询、插入、更新和删除操作。它与Spring整合后,可以在Spring的事务管理下执行数据库操作,确保数据的一致性。 在...

    maven搭建SpringMVC+spring+ibatis

    在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"Maven搭建SpringMVC+Spring+Ibatis"的组合则提供了一种强大的解决方案。本文将深入探讨这些技术及其集成,帮助你理解和掌握如何利用它们来构建现代化的Java ...

    struts2+spring+Ibatis框架包

    这个“struts2+spring+iBatis框架包”集成了这三个框架,使得开发者能够快速构建基于MVC(Model-View-Controller)模式的Web应用。 Struts2作为MVC框架,负责处理应用程序的控制逻辑。它通过Action类和配置文件定义...

    JSF+Spring+Ibatis示例

    JSF+Spring+Ibatis示例,对学习JAVA企业应用开发有巨大的帮助!

    spring+struts2+ibatis整合的jar包

    总的来说,Spring、Struts2和iBatis的整合为Java Web开发提供了一个强大、灵活的解决方案,让开发者能够更专注于业务逻辑,而不是框架的底层实现。通过合理的配置和使用这个jar包,开发者可以快速构建出稳定、高性能...

    spring+ibatis+oracle分页缓存源码

    在Spring+iBatis+Oracle体系中,缓存可以分为两种类型:一级缓存(本地缓存)和二级缓存。 一级缓存是iBatis默认提供的,它存在于SqlSession级别,同一SqlSession内的多次查询会共享结果,避免了重复的数据库访问。...

    webwork+spring+ibatis很适合初学者的实例

    "webwork+spring+ibatis" 的实例通常会展示如何将这三个框架集成到一个完整的Web项目中。这个实例可能包含以下部分: 1. **环境配置**:安装和配置Java开发环境,如JDK,以及相关的开发工具,如IDEA或Eclipse。 2. ...

    struts2 + spring + ibatis 实例

    struts2 + spring + ibatis 实例 struts2 + spring + ibatis 实例 struts2 + spring + ibatis 实例 struts2 + spring + ibatis 实例 struts2 + spring + ibatis 实例

    maven3+struts2+spring+ibatis

    maven3+struts2+spring+ibatis,本来是用maven3+struts2+spring+hibernate但考虑到hibernate在多表级联查询的时候执行效率不高,所以改用性能更好不过sql比较麻烦的的ibatis,本项目只有登录和插入数据,仅供参考: ...

    Struts+Spring+Ibatis环境配置(一) - zwjxf的专栏 - 博

    Struts+Spring+Ibatis环境配置(一) - zwjxf的专栏 - 博

    struts+spring+ibatis的Demo

    这个"struts+spring+ibatis的Demo"压缩包文件提供了这三个框架集成使用的示例代码,旨在帮助开发者理解和学习如何将它们有效地结合在一起。 **Struts 2框架** Struts 2是一个基于MVC设计模式的Web应用框架,它继承...

    Struts2+Spring+Ibatis整合的简单人事管理系统

    Struts2+Spring+Ibatis整合的简单人事管理系统 没分了,转载过来的,有需要的看看吧,我觉得不错~~

    struts+spring+ibatis框架

    Struts、Spring和iBatis是Java开发中常用的三大开源框架,它们各自负责应用程序的不同层面,共同构建了一个灵活且强大的企业级应用开发解决方案。这里,我们深入探讨这三个框架以及它们如何协同工作。 **Struts框架...

    Struts+Spring+Ibatis示例

    Struts、Spring 和 iBatis 是 Java Web 开发中三个非常重要的开源框架,它们共同构建了一个灵活、可扩展且易于维护的系统架构。这个"Struts+Spring+Ibatis示例"提供了一个基础的整合应用,帮助开发者理解这三者如何...

    各种系统架构图及其简介(Spring+IBatis+Struts1+Struts2+Hibernat)

    各种系统架构图及其简介(Spring+IBatis+Struts1+Struts2+Hibernat)

    spring+struts2+ibatis简单登录实例--特别适新人学习

    一个简单的spring+struts+ibatis整合的实例,实现了用户登录,用户登录成功则显示欢迎信息,失败则显示用户名或密码错误,该实例非常简单基础,特别适合新人学习,工程包含了必要的资源包,部署到服务器中及可运行,...

    Spring+Struts+ibatis讲解

    在Spring+Struts+ibatis这种经典的Java Web开发框架组合中,主要涉及到三层架构:表现层(Action)、业务逻辑层(Service)和数据访问层(DAO)。这些组件协同工作,实现了应用程序的功能。以下是对各部分的详细解释...

Global site tag (gtag.js) - Google Analytics