首页 > 代码库 > 搭建基于springmvc,ibatis的工程实现读写分离,配置分离
搭建基于springmvc,ibatis的工程实现读写分离,配置分离
实现读写分离:
1.spring配置如下:spring-dataResource.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 8 http://www.springframework.org/schema/tx 9 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd10 http://www.springframework.org/schema/context11 http://www.springframework.org/schema/context/spring-context-3.0.xsd12 http://www.springframework.org/schema/mvc13 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">14 <!-- 主数据源 -->15 <bean id="myDataSourceMaster" class="org.springframework.jdbc.datasource.DriverManagerDataSource">16 <property name="driverClassName" value="${jdbc.driverClassName}" />17 <property name="url" value="${jdbc.url}" />18 <property name="username" value="${jdbc.username}" />19 <property name="password" value="${jdbc.password}" />20 </bean>21 <!--从数据源-->22 <bean id="myDataSourceSlave" class="org.springframework.jdbc.datasource.DriverManagerDataSource">23 <property name="driverClassName" value="${jdbc.driverClassName}" />24 <property name="url" value="${jdbc.url}" />25 <property name="username" value="${jdbc.username}" />26 <property name="password" value="${jdbc.password}" />27 </bean>28 29 <bean id="sqlMapClientReader" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">30 <property name="configLocation" value="classpath:sql-map-config.xml" />31 <property name="dataSource" ref="myDataSourceSlave" />32 </bean>33 34 <bean id="sqlMapClientWriter" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">35 <property name="configLocation" value="classpath:sql-map-config.xml" />36 <property name="dataSource" ref="myDataSourceMaster" />37 </bean>38 39 <!-- 操作数据库的基类 -->40 <bean id="ibatisBaseDao" class="com.zzcm.ad.common.dao.impl.IbatisBaseDaoImpl">41 <property name="ibatisDaoReader">42 <bean id="ibatisDaoReader" class="com.zzcm.ad.common.dao.impl.IbatisDaoReaderImpl"></bean>43 </property>44 <property name="ibatisDaoWriter">45 <bean id="ibatisDaoWriter" class="com.zzcm.ad.common.dao.impl.IbatisDaoWriterImpl"/>46 </property>47 </bean>48 </beans>
2.将此配置文件加载到主配置文件 spring-applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xmlns:mvc="http://www.springframework.org/schema/mvc" 8 xmlns:util="http://www.springframework.org/schema/util" 9 xsi:schemaLocation="http://www.springframework.org/schema/beans10 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd11 http://www.springframework.org/schema/tx12 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd13 http://www.springframework.org/schema/context14 http://www.springframework.org/schema/context/spring-context-3.0.xsd15 http://www.springframework.org/schema/util16 http://www.springframework.org/schema/util/spring-util-3.0.xsd17 http://www.springframework.org/schema/mvc18 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">19 <!-- Root Context: defines shared resources visible to all other web components -->20 <!-- 加载属性文件 -->21 <bean id="propertyConfig" class="com.zzcm.ad.util.spring.PropertyAnnotationPlaceholderConfigurer">22 <property name="locations">23 <list>24 <value>file:${global_config_path}/4gad/jdbc.properties</value>25 <value>file:${global_config_path}/4gad/support.properties</value>26 </list>27 </property>28 </bean>29 30 <import resource="spring/spring-dataResources.xml"/>31 <context:component-scan base-package="com.zzcm.ad"/>32 33 <!-- 添加注解驱动 -->34 <mvc:annotation-driven/>35 <!-- 允许对静态资源文件的访问 -->36 <mvc:default-servlet-handler/>37 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">38 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>39 <property name="prefix" value="/WEB-INF/jsp/"/>40 <property name="suffix" value=".jsp"/>41 </bean>42 </beans>
3.基本思想:
将读写数据库操作包装到一个基本操作类中,这样子对外操作就是一个基本操作类
因此如下:
基本操作接口:IbatisBaseDao
1 package com.zzcm.ad.common.dao;2 public interface IbatisBaseDao extends IbatisDaoReader,IbatisDaoWriter{3 }
读操作接口:IbatisDaoReader
1 package com.zzcm.ad.common.dao; 2 import java.util.List; 3 import java.util.Map; 4 public interface IbatisDaoReader{ 5 /** 6 * 根据statementName查询,返回对象 7 * @param statementName 8 * @return 9 */10 public abstract <T> T queryForObject(String statementName);11 /**12 * 根据statementName,参数obj查询,返回对象13 * @param statementName14 * @param obj15 * @return16 */17 public abstract <T> T queryForObject(String statementName, Object obj);18 /**19 * 根据statementName查询,返回对象集合List20 * @param statementName21 * @return22 */23 public abstract <T> List<T> queryForList(String statementName);24 /**25 * 根据statementName,参数obj查询,返回对象集合List26 * @param statementName27 * @param obj28 * @return29 */30 public abstract <T> List<T> queryForList(String statementName, Object obj);31 /**32 * 根据statementName,参数obj,返回Map key值查询,返回Map33 * @param statementName34 * @param obj35 * @param keyProperty36 * @return37 */38 public abstract <T> Map queryForMap(String statementName,Object obj, String keyProperty);39 /**40 * 根据statementName、参数obj、返回Map key值、返回map value查询,返回Map41 * @param statementName42 * @param obj43 * @param keyProperty44 * @param valueProperty45 * @return46 */47 public abstract <T> Map queryForMap(String statementName,Object obj, String keyProperty,String valueProperty);48 }
写操作接口:IbatisDaoWriter
1 package com.zzcm.ad.common.dao; 2 import com.zzcm.ad.common.exception.JdbcException; 3 public interface IbatisDaoWriter{ 4 /** 5 * 保存一个实体对象 6 * @param statementName 7 * @param entity 8 * @return 9 * @throws JdbcException10 */11 public abstract Integer save(String statementName,Object obj) throws JdbcException;12 /**13 * 保存14 * @param statementName15 * @return16 * @throws JdbcException17 */18 public abstract Integer save(String statementName) throws JdbcException;19 /**20 * 更新一个实体对象21 * @param statementName22 * @param entity23 * @return24 * @throws JdbcException25 */26 public abstract int update(String statementName,Object obj) throws JdbcException;27 /**28 * 更新29 * @param statementName30 * @param entity31 * @return32 * @throws JdbcException33 */34 public abstract int update(String statementName) throws JdbcException;35 /**36 * 按照条件删除记录37 * @param statementName38 * @param paramObj39 * @return40 * @throws JdbcException41 */42 public abstract int delete(String statementName,Object obj) throws JdbcException;43 /**44 * 按照条件删除记录45 * @param statementName46 * @return47 * @throws JdbcException48 */49 public abstract int delete(String statementName) throws JdbcException;50 51 }
读操作实现类:IbatisDaoReaderImpl
1 package com.zzcm.ad.common.dao.impl; 2 import java.util.List; 3 import java.util.Map; 4 import javax.annotation.PostConstruct; 5 import javax.annotation.Resource; 6 import org.slf4j.Logger; 7 import org.slf4j.LoggerFactory; 8 import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; 9 import org.springframework.util.Assert; 10 import com.ibatis.sqlmap.client.SqlMapClient; 11 import com.zzcm.ad.common.dao.IbatisDaoReader; 12 import com.zzcm.ad.common.exception.JdbcException; 13 /** 14 * 对数据库读操作的实现类 15 * @author shunyang 16 * 17 */ 18 public final class IbatisDaoReaderImpl extends SqlMapClientDaoSupport implements IbatisDaoReader { 19 private static final Logger logger = LoggerFactory.getLogger(IbatisDaoReaderImpl.class); 20 @Resource(name="sqlMapClientReader") 21 private SqlMapClient sqlMapClientReader; 22 @PostConstruct 23 public void initSqlMapClient(){ 24 super.setSqlMapClient(sqlMapClientReader); 25 } 26 27 @SuppressWarnings("unchecked") 28 @Override 29 public <T> T queryForObject(String statementName) throws JdbcException{ 30 Assert.notNull(statementName); 31 try { 32 return (T) this.getSqlMapClientTemplate().queryForObject(statementName); 33 } catch (Exception e) { 34 logger.error("Something‘s wrong when query :"); 35 logger.error("statementName:"+statementName); 36 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); 37 } 38 } 39 @Override 40 public <T> T queryForObject(String statementName, Object obj) { 41 Assert.notNull(statementName); 42 Assert.notNull(obj); 43 try { 44 return (T) this.getSqlMapClientTemplate().queryForObject(statementName,obj); 45 } catch (Exception e) { 46 logger.error("Something‘s wrong when query :"); 47 logger.error("param:"+obj.getClass().getName()); 48 logger.error("statementName:"+statementName); 49 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); 50 } 51 } 52 @Override 53 public <T> List<T> queryForList(String statementName) { 54 Assert.notNull(statementName); 55 try { 56 return (List<T>) this.getSqlMapClientTemplate().queryForList(statementName); 57 } catch (Exception e) { 58 logger.error("Something‘s wrong when query :"); 59 logger.error("statementName:"+statementName); 60 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); 61 } 62 } 63 @Override 64 public <T> List<T> queryForList(String statementName, Object obj) { 65 Assert.notNull(statementName); 66 Assert.notNull(obj); 67 try { 68 return (List<T>) this.getSqlMapClientTemplate().queryForList(statementName,obj); 69 } catch (Exception e) { 70 logger.error("Something‘s wrong when query :"); 71 logger.error("statementName:"+statementName); 72 logger.error("param:"+obj.getClass().getName()); 73 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); 74 } 75 } 76 @Override 77 public <T> Map queryForMap(String statementName, Object obj,String keyProperty) { 78 Assert.notNull(statementName); 79 Assert.notNull(obj); 80 try { 81 return this.getSqlMapClientTemplate().queryForMap(statementName, obj, keyProperty); 82 } catch (Exception e) { 83 logger.error("Something‘s wrong when query :"); 84 logger.error("statementName:"+statementName); 85 logger.error("param:"+obj.getClass().getName()+"--->keyProperty:"+keyProperty); 86 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); 87 } 88 } 89 @Override 90 public <T> Map queryForMap(String statementName, Object obj,String keyProperty, String valueProperty) { 91 Assert.notNull(statementName); 92 Assert.notNull(obj); 93 try { 94 return this.getSqlMapClientTemplate().queryForMap(statementName, obj, keyProperty, valueProperty); 95 } catch (Exception e) { 96 logger.error("Something‘s wrong when query :"); 97 logger.error("statementName:"+statementName); 98 logger.error("param:"+obj.getClass().getName()+"--->keyProperty:"+keyProperty+"-->valueProperty:"+valueProperty); 99 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e);100 }101 }102 }
写操作实现类:IbatisDaoWriterImpl
1 package com.zzcm.ad.common.dao.impl; 2 import javax.annotation.PostConstruct; 3 import javax.annotation.Resource; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; 7 import org.springframework.util.Assert; 8 import com.ibatis.sqlmap.client.SqlMapClient; 9 import com.zzcm.ad.common.dao.IbatisDaoWriter;10 import com.zzcm.ad.common.exception.JdbcException;11 /**12 * 对数据库写操作的实现类13 * @author shunyang14 *15 */16 public final class IbatisDaoWriterImpl extends SqlMapClientDaoSupport implements IbatisDaoWriter {17 private static final Logger logger = LoggerFactory.getLogger(IbatisDaoReaderImpl.class);18 @Resource(name = "sqlMapClientWriter")19 private SqlMapClient sqlMapClientWriter;20 @PostConstruct21 public void initSqlMapClient(){22 super.setSqlMapClient(sqlMapClientWriter);23 } 24 25 public Integer save(String statementName,Object obj) {26 Assert.notNull(statementName);27 Assert.notNull(obj);28 try {29 return (Integer) this.getSqlMapClientTemplate().insert(statementName, obj);30 } catch (Exception e) {31 logger.error("Something‘s wrong when save Object:");32 logger.error(obj.getClass().getName());33 logger.error("statementName:"+statementName);34 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e);35 }36 }37 @Override38 public Integer save(String statementName) throws JdbcException {39 Assert.notNull(statementName);40 try {41 return (Integer) this.getSqlMapClientTemplate().insert(statementName);42 } catch (Exception e) {43 logger.error("Something‘s wrong when save Object:");44 logger.error("statementName:"+statementName);45 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e);46 }47 }48 49 @Override50 public int update(String statementName, Object obj)51 throws JdbcException {52 Assert.notNull(statementName);53 Assert.notNull(obj);54 try {55 return (Integer) this.getSqlMapClientTemplate().update(statementName, obj);56 } catch (Exception e) {57 logger.error("Something‘s wrong when update Object:");58 logger.error(obj.getClass().getName());59 logger.error("statementName:"+statementName);60 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e);61 }62 }63 @Override64 public int update(String statementName) throws JdbcException {65 Assert.notNull(statementName);66 try {67 return (Integer) this.getSqlMapClientTemplate().update(statementName);68 } catch (Exception e) {69 logger.error("Something‘s wrong when update Object:");70 logger.error("statementName:"+statementName);71 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e);72 }73 }74 @Override75 public int delete(String statementName) throws JdbcException {76 Assert.notNull(statementName);77 try {78 return this.getSqlMapClientTemplate().delete(statementName);79 } catch (Exception e) {80 logger.error("Something‘s wrong when delete Object:");81 logger.error("statementName:"+statementName);82 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e);83 }84 }85 @Override86 public int delete(String statementName, Object obj)87 throws JdbcException {88 Assert.notNull(statementName);89 try {90 return this.getSqlMapClientTemplate().delete(statementName,obj);91 } catch (Exception e) {92 logger.error("Something‘s wrong when delete Object:");93 logger.error(obj.getClass().getName());94 logger.error("statementName:"+statementName);95 throw new JdbcException(this.getClass() + "->" + e.getMessage(), e);96 }97 }98 }
基本的操作实现类:IbatisBaseDaoImpl
1 package com.zzcm.ad.common.dao.impl; 2 import java.util.List; 3 import java.util.Map; 4 import com.zzcm.ad.common.dao.IbatisBaseDao; 5 import com.zzcm.ad.common.dao.IbatisDaoReader; 6 import com.zzcm.ad.common.dao.IbatisDaoWriter; 7 import com.zzcm.ad.common.exception.JdbcException; 8 /** 9 * 对数据库操作的基础类,实现了读写分离10 * @author shunyang11 *12 */13 public class IbatisBaseDaoImpl implements IbatisBaseDao {14 private IbatisDaoReader ibatisDaoReader;15 private IbatisDaoWriter ibatisDaoWriter;16 17 public IbatisDaoReader getIbatisDaoReader() {18 return ibatisDaoReader;19 }20 public void setIbatisDaoReader(IbatisDaoReader ibatisDaoReader) {21 this.ibatisDaoReader = ibatisDaoReader;22 }23 public IbatisDaoWriter getIbatisDaoWriter() {24 return ibatisDaoWriter;25 }26 public void setIbatisDaoWriter(IbatisDaoWriter ibatisDaoWriter) {27 this.ibatisDaoWriter = ibatisDaoWriter;28 }29 @Override30 public Integer save(String statementName, Object obj)throws JdbcException {31 return ibatisDaoWriter.save(statementName, obj);32 }33 @Override34 public Integer save(String statementName) throws JdbcException {35 return ibatisDaoWriter.save(statementName);36 }37 @Override38 public int update(String statementName, Object obj) throws JdbcException {39 return ibatisDaoWriter.update(statementName, obj);40 }41 @Override42 public int update(String statementName) throws JdbcException {43 return ibatisDaoWriter.update(statementName);44 }45 @Override46 public int delete(String statementName, Object obj)throws JdbcException {47 return ibatisDaoWriter.delete(statementName,obj);48 }49 @Override50 public int delete(String statementName) throws JdbcException {51 return ibatisDaoWriter.delete(statementName);52 }53 @Override54 public <T> T queryForObject(String statementName) {55 return ibatisDaoReader.queryForObject(statementName);56 }57 @Override58 public <T> T queryForObject(String statementName, Object obj) {59 return ibatisDaoReader.queryForObject(statementName, obj);60 }61 @Override62 public <T> List<T> queryForList(String statementName) {63 return ibatisDaoReader.queryForList(statementName);64 }65 @Override66 public <T> List<T> queryForList(String statementName, Object obj) {67 return ibatisDaoReader.queryForList(statementName, obj);68 }69 @Override70 public <T> Map queryForMap(String statementName, Object obj,71 String keyProperty) {72 return ibatisDaoReader.queryForMap(statementName, obj, keyProperty);73 }74 @Override75 public <T> Map queryForMap(String statementName, Object obj,76 String keyProperty, String valueProperty) {77 return ibatisDaoReader.queryForMap(statementName, obj, keyProperty, valueProperty);78 }79 }
对外提供的类就是IbatisBaseDaoImpl
配置分离的工程:
jdbc.properties
1 #数据库连接的方式,请根据你的项目中现有的情况配置 2 jdbc.driverClassName=com.mysql.jdbc.Driver 3 4 #数据连接URL,请根据你的项目中现有的情况配置 5 jdbc.url=jdbc:mysql://idctest.mysql.xxx.com:3306/zzsupport 6 7 #数据库连接的用户名,请根据你的项目中现有的情况配置 8 jdbc.username=zzmanager 9 10 #数据库连接的密码(带“.encrypt”与否都可以,但是带“.encrypt”的密码必须加密),请根据你的项目中现有的情况配置11 #jdbc.password.encrypt=2dUGTjehnpU.12 jdbc.password=iadMOB-2013@0622)
support.properties
1 #开发环境2 upload.path=D:/apache-tomcat-6.0.30/webapps/zzupload-main3 upload.url=http://192.168.0.88:8080/zzupload-main
工程源码详见github:https://github.com/shunyang/4gad
欢迎大家交流学习
搭建基于springmvc,ibatis的工程实现读写分离,配置分离
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。