




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring宠物店非常典型的展现了Spring和IBatis的整合,下文将围绕宠物店展开介绍。首先来看宠物店中的一个领域对象(它是一个标准的JavaBean)和它的映射文件,如代码10.1310.14所示。代码10.13 Product.javapublic class Product implements Serializable private String productId; private String categoryId; private String name; private String description; 省略getter/setter.代码10.14 Product.xml . . select productid, name, descn, category from product where productid = #value# select productid, name, descn, category from product where category = #value# .10.3.2 衔接IBatis配置和DAO实现接着给出IBatis的基本配置文件,如代码10.15所示。代码10.15 sql-map-config.xml . .在宠物店中,该文件仅包含了所有领域对象的映射文件,而挪走了关于IBatis的事务和数据源配置(即IBatis配置文件中的transactionManager元素和它的子元素dataSource)。注意:在稍后将要给出的Spring配置文件中接手了这些配置,这是一个整合点。在宠物店中,持久和数据访问都是通过DAO来实现的。对于Product,存在一个与其对应的SqlMapProductDao,如代码10.16所示。代码10.16 SqlMapProductDao.javapackage org.springframework.samples.jpetstore.dao.ibatis;import java.util.ArrayList;import java.util.List;import java.util.StringTokenizer;import org.springframework.dao.DataAccessException;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;import org.springframework.samples.jpetstore.dao.ProductDao;import org.springframework.samples.jpetstore.domain.Product;public class SqlMapProductDao extends SqlMapClientDaoSupport implements ProductDao public List getProductListByCategory(String categoryId) throws DataAccessException return getSqlMapClientTemplate().queryForList(getProductListByCategory,categoryId); public Product getProduct(String productId) throws DataAccessException return (Product) getSqlMapClientTemplate().queryForObject(getProduct, productId); .上述代码中出现了Spring提供的IBatis DAO支持类和获取SqlMapClientTemplate的父类模板方法,这和JdbcDaoSupport及JdbcTemplate的使用具有一致的概念。并且,这些操作都统一的抛出Spring的通用数据访问异常DataAccessException。注意:在早期的IBatis1.3.x版本中Dao支持类和模板类分别被命名为SqlMapDaoSupport和SqlMapTemplate,在使用时不要混淆。10.3.3 关键整合点:Spring配置文件有了以上的DAO组件后,来看一下Spring的配置,这是一个关键的整合点,如代码10.17所示。代码10.17 dataAccessContext-local.xml . .可以发现,Spring在上述文件中分别配置了数据源和事务管理的策略,其中挪去了原先在IBatis文件中的配置。说明:这样做的好处是可以通过Spring IoC容器统一的管理资源,在稍后还可以看到,Spring提供的声明性事务管理就是借助于统一的数据源和事务管理配置。SqlMapClientFactoryBean又是一个工厂bean,它暴露了两个关键属性用于注射IBatis配置文件和相关的数据源。在工厂内部,通过读取IBatis配置文件,Spring会创建出IBatis的核心组件SqlMapClient,并向相关的DAO进行注射。SqlMapProductDao继承了SqlMapClientDaoSupport,后者暴露出一个sqlMapClient属性,用于接受Spring的注射。SqlMapClientDaoSupport会对其中封装的SqlMapClientTemplate做相应的设置,所以DAO子类便可在取用SqlMapClientTemplate时正常地工作了。10.3.4 添加声明式事务管理以上的IBatis DAO可以很自方便地被注射到相应的业务对象,并参与到Spring提供的声明性事务中,配置如代码10.18所示。代码10.18 applicationContext.xml . WEB-INF/perties . PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly . . 至此就基本完成了Spring IoC和IBatis的整合了,当然也可以通过编程的方式来使用Spring所提供的模板和支持类。本文将以一个实际例子来讲解整合iBATIS和Spring在WEB开发中的应用。在例子中,将应用DAO,FACADE这些常用的设计模式。 1、需求说明假定我们要实现一个用户注册和登录的需求。注册时将用户信息保存到数据库,登录时使用注册的信息进行校验。2、数据库设计我们建2个表,一个存放基本的用户信息(T_USERS),一个放附加的信息(T_USER_INFO)。这2个表是1对1的关系,其实可以只建一个表,但在实际的开发中,我们常常会把它们拆分,把常用的信息放到主表中,不常用的放到辅表中,这样可以提升性能。本文使用的数据库是ORACLE,表结构如下:T_USERS 用户信息主表字段名字段说明字段类型userid用户在系统中的流水号,为PRIMARY KEYNUMBER(6,0) NOT NULLualias用户别名,在登录时输入的名字VARCHAR2(20) NOT NULLpassword密码VARCHAR2(30) NULLrealname真实姓名VARCHAR2(20) NULLemailemailVARCHAR2(30) NOT NULLusertypeid用户类型CHAR(2) NOT NULLSQLCREATE TABLE T_USERS (userid NUMBER(6,0) NOT NULL,usertypeid CHAR(2) NOT NULL,ualias VARCHAR2(20) NOT NULL,password VARCHAR2(30) NULL,email VARCHAR2(30) NOT NULL,realname VARCHAR2(20) NULL);CREATE UNIQUE INDEX XAK1T_USERS ON T_USERS( ualias ASC );CREATE UNIQUE INDEX XAK2T_USERS ON T_USERS( email ASC );ALTER TABLE T_USERS ADD ( PRIMARY KEY (userid) ) ;T_USER_INFO 用户信息辅表字段名字段说明字段类型userid用户在系统中的流水号为KEYNUMBER(6,0) NOT NULLregdate注册日期DATE NULLlastlogdate最近一次登录日期DATE NULLlogtimes登录次数NUMBER(6) NULLSQLCREATE TABLE T_USER_INFO (userid NUMBER(6,0) NOT NULL,regdate DATE NULL,lastlogdate DATE NULL,logtimes NUMBER(6) NULL);ALTER TABLE T_USER_INFO ADD ( PRIMARY KEY (userid) ) ;ALTER TABLE T_USER_INFO ADD ( FOREIGN KEY (userid) REFERENCES T_USERS ) ;SEQUENCE Sequence_userid 用户流水号产生SQLCREATE SEQUENCE Sequence_userid INCREMENT BY 1 START WITH 1 MAXVALUE 999999MINVALUE 1NOCYCLENOORDER;3、构建源代码包目录com(1)|-wysm(2)|-netstar(3) |-domain(4) (POJO) |-persistence(4) (持久化层) |-iface(5) (DAO 接口) |-sqlmapdao(5) (iBATIS DAO实现) |-sql(6) (iBATIS sqlmap定义文件) |-service(4) (FACADE接口) |-ibatis(5) (FACADE iBATIS实现) |-test(4)(JAVA环境测试)4、iBATIS sqlmap定义star.persistence.sqlmapdao.sql/sql-map-config.xml 数据库连接属性文件 perties# Database Connectivity Properties#driver=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:localhost:1521:ORA92SERusername=netstarpassword=star.persistence.sqlmapdao.sql/Sequence.xml select sequence_userid.nextval from dual star.persistence.sqlmapdao.sql/User.xmlSELECTUSERID as userId,UALIAS as userAlias,PASSWORD as password,REALNAME as realName,EMAIL as email,USERTYPEID as userTypeIdFROM T_USERSWHERE UALIAS = #userAlias#SELECTUSERID as userId,UALIAS as userAlias,PASSWORD as password,REALNAME as realName,EMAIL as email,USERTYPEID as userTypeIdFROM T_USERSWHERE UALIAS = #userAlias# ANDPASSWORD = #password#SELECTUSERID as userId,UALIAS as userAlias,PASSWORD as password,REALNAME as realName,EMAIL as email,USERTYPEID as userTypeIdFROM T_USERSWHERE EMAIL=#email#UPDATE T_USERS SETUALIAS= #userAlias#,PASSWORD=#password#,REALNAME=#realName#,EMAIL = #email#,USERTYPEID = #userTypeId#WHERE USERID = #userId#INSERT INTO T_USERS(USERID,UALIAS,PASSWORD,REALNAME,EMAIL,USERTYPEID)VALUES(#userId#, #userAlias#,#password#,#realName#, #email#, #userTypeId#)DELETE FROM T_USERSWHERE USERID=#userId#select count(*) FROM T_USERSWHERE USERID=#userId#star.persistence.sqlmapdao.sql/UserInfo.xmlSELECTUSERID,REGDATE,LASTLOGDATE,LOGTIMESFROM T_USER_INFOWHERE USERID = #userId#UPDATE T_USER_INFO SETREGDATE= #regDate#,LASTLOGDATE=#lastLogDate#,LOGTIMES=#logTimes#WHERE USERID = #userId#INSERT INTO T_USER_INFO(USERID,REGDATE,LASTLOGDATE,LOGTIMES)VALUES(#userId#, #regDate#,#lastLogDate#,#logTimes#)DELETE FROM T_USER_INFOWHERE USERID=#userId#5、POJO定义 star.domain.User.javapackage star.domain; import java.io.*; public class User implements Serializable private Integer userId; private String userAlias; private String password; private String realName; private String email; private String userTypeId; public User() public User(Integer userId) this.userId=userId; public User(String userAlias) this.userAlias=userAlias; public User(String userAlias,String password) this.userAlias=userAlias; this.password=password; public void setUserId(Integer userId) this.userId = userId; public void setUserAlias(String userAlias) this.userAlias = userAlias; public void setPassword(String password) this.password = password; public void setUserTypeId(String userTypeId) this.userTypeId = userTypeId; public void setRealName(String realName) this.realName = realName; public void setEmail(String email) this.email = email; public Integer getUserId() return userId; public String getUserAlias() return userAlias; public String getPassword() return password; public String getUserTypeId() return userTypeId; public String getRealName() return realName; public String getEmail() return email; star.domain.UserInfo.javapackage star.domain; import java.util.*; import java.io.Serializable; public class UserInfo implements Serializable private Integer userId; private Date regDate; private Date lastLogDate; private Integer logTimes; public UserInfo() public void setUserId(Integer userId) this.userId = userId; public void setRegDate(Date regDate) this.regDate = regDate; public void setLastLogDate(Date lastLogDate) this.lastLogDate = lastLogDate; public void setLogTimes(Integer logTimes) this.logTimes = logTimes; public Integer getUserId() return userId; public Date getRegDate() return regDate; public Date getLastLogDate() return lastLogDate; public Integer getLogTimes() return logTimes; 6、DAO接口定义star.persistence.iface.BaseDao.javapackage star.persistence.iface;public interface BaseDao star.persistence.iface.SequenceDao.javapackage star.persistence.iface;public interface SequenceDao extends BaseDao Integer getSequenceUserId();star.persistence.iface.UserDao.javapackage star.persistence.iface; import star.domain.User; import java.util.List; public interface UserDao extends BaseDao public abstract List getUser(String userAlias); public abstract List getUserByEmail(String email); public abstract List getUser(String userAlias,String password); public abstract void insertUser(User user); public abstract void updateUser(User user); public abstract boolean existUserId(Integer userid); star.persistence.iface.UserInfoDao.javapackage star.persistence.iface; import star.domain.UserInfo; public interface UserInfoDao extends BaseDao public abstract UserInfo getUserInfo(Integer userId); public abstract void insertUserInfo(UserInfo userInfo); public abstract void updateUserInfo(UserInfo userInfo); 7、DAO iBATIS实现star.persistence.sqlmapdao.BaseSqlMapDao.javapackage star.persistence.sqlmapdao; import com.ibatis.dao.client.DaoManager; import com.ibatis.dao.client.template.SqlMapDaoTemplate; public class BaseSqlMapDao extends SqlMapDaoTemplate protected static final int PAGE_SIZE = 4; public BaseSqlMapDao(DaoManager daoManager) super(daoManager); star.persistence.sqlmapdao.SequenceSqlMapDao.javapackage star.persistence.sqlmapdao; import com.ibatis.dao.client.DaoManager; import star.persistence.iface.SequenceDao; public class SequenceSqlMapDao extends BaseSqlMapDao implements SequenceDao public SequenceSqlMapDao(DaoManager daoManager) super(daoManager); public Integer getSequenceUserId() return (Integer)queryForObject(getSequenceUserId,new Object(); star.persistence.sqlmapdao.UserSqlMapDao.javapackage star.persistence.sqlmapdao; import com.ibatis.dao.client.DaoManager; import star.domain.User; import star.persistence.iface.UserDao; import java.util.List; import org.apache.log4j.Logger; public class UserSqlMapDao extends BaseSqlMapDao implements UserDao static Logger logger=Logger.getLogger(UserSqlMapDao.class); public UserSqlMapDao(DaoManager daoManager) super(daoManager); logger.debug(In UserSqlMapDao daoManager null=+(daoManager=null); public List getUser(String userAlias) return queryForList(getUserByUserAlias,userAlias); public List getUser(String userAlias,String password) User user=new User(userAlias,password); return queryForList(getUserByUserAliasAndPassword,user); public void insertUser(User user) update(insertUser, user); public void updateUser(User user) update(updateUser, user); public List getUserByEmail(String email) return queryForList(getUserByEmail,email); public boolean existUserId(Integer userid) Integer cnt=(Integer)this.queryForObject(existUserId,userid); return Value()0; star.persistenc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 厂区标语施工方案模板
- 旋挖机施工方案模板
- 教师招聘之《小学教师招聘》模拟题库讲解含答案详解(培优)
- 农旅结合活动策划方案
- 中式建筑社区建设方案设计
- 活动策划方案封面图片手绘
- 数字医疗2025年医生资源高效配置与行业竞争力提升报告
- 测量队安全生产培训记录课件
- 电焊岗前安全培训内容课件
- 电焊安全员培训课件
- 外宾接待礼仪课件
- DB31T 808-2019 地下空间安全使用检查规范
- 劳动课整理与收纳教案
- 戴晓琳《课余生活我安排》-课件
- 日周月安全检查记录表
- 防高处坠落-物体打击专项施工方案
- 道路交通事故现场图绘制PPT讲解(104页)
- 数据文化与我国时空大数据的发展
- 现代生物技术教学课件
- 国标法兰尺寸对照表
- 广州初中数学知识点总结(共40页)
评论
0/150
提交评论