搭建基于springmvc,ibatis的工程实现读写分离,配置分离
2014-10-29 14:04
561 查看
实现读写分离:
1.spring配置如下:spring-dataResource.xml
2.将此配置文件加载到主配置文件 spring-applicationContext.xml
3.基本思想:
将读写数据库操作包装到一个基本操作类中,这样子对外操作就是一个基本操作类
因此如下:
基本操作接口:IbatisBaseDao
读操作接口:IbatisDaoReader
写操作接口:IbatisDaoWriter
读操作实现类:IbatisDaoReaderImpl
写操作实现类:IbatisDaoWriterImpl
基本的操作实现类:IbatisBaseDaoImpl
对外提供的类就是IbatisBaseDaoImpl
配置分离的工程:
jdbc.properties
support.properties
工程源码详见github:https://github.com/shunyang/4gad
欢迎大家交流学习
1.spring配置如下:spring-dataResource.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 主数据源 --> <bean id="myDataSourceMaster" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!--从数据源--> <bean id="myDataSourceSlave" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sqlMapClientReader" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:sql-map-config.xml" /> <property name="dataSource" ref="myDataSourceSlave" /> </bean> <bean id="sqlMapClientWriter" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:sql-map-config.xml" /> <property name="dataSource" ref="myDataSourceMaster" /> </bean> <!-- 操作数据库的基类 --> <bean id="ibatisBaseDao" class="com.zzcm.ad.common.dao.impl.IbatisBaseDaoImpl"> <property name="ibatisDaoReader"> <bean id="ibatisDaoReader" class="com.zzcm.ad.common.dao.impl.IbatisDaoReaderImpl"></bean> </property> <property name="ibatisDaoWriter"> <bean id="ibatisDaoWriter" class="com.zzcm.ad.common.dao.impl.IbatisDaoWriterImpl"/> </property> </bean> </beans>
2.将此配置文件加载到主配置文件 spring-applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <!-- 加载属性文件 --> <bean id="propertyConfig" class="com.zzcm.ad.util.spring.PropertyAnnotationPlaceholderConfigurer"> <property name="locations"> <list> <value>file:${global_config_path}/4gad/jdbc.properties</value> <value>file:${global_config_path}/4gad/support.properties</value> </list> </property> </bean> <import resource="spring/spring-dataResources.xml"/> <context:component-scan base-package="com.zzcm.ad"/> <!-- 添加注解驱动 --> <mvc:annotation-driven/> <!-- 允许对静态资源文件的访问 --> <mvc:default-servlet-handler/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
3.基本思想:
将读写数据库操作包装到一个基本操作类中,这样子对外操作就是一个基本操作类
因此如下:
基本操作接口:IbatisBaseDao
package com.zzcm.ad.common.dao; public interface IbatisBaseDao extends IbatisDaoReader,IbatisDaoWriter{ }
读操作接口:IbatisDaoReader
package com.zzcm.ad.common.dao; import java.util.List; import java.util.Map; public interface IbatisDaoReader{ /** * 根据statementName查询,返回对象 * @param statementName * @return */ public abstract <T> T queryForObject(String statementName); /** * 根据statementName,参数obj查询,返回对象 * @param statementName * @param obj * @return */ public abstract <T> T queryForObject(String statementName, Object obj); /** * 根据statementName查询,返回对象集合List * @param statementName * @return */ public abstract <T> List<T> queryForList(String statementName); /** * 根据statementName,参数obj查询,返回对象集合List * @param statementName * @param obj * @return */ public abstract <T> List<T> queryForList(String statementName, Object obj); /** * 根据statementName,参数obj,返回Map key值查询,返回Map * @param statementName * @param obj * @param keyProperty * @return */ public abstract <T> Map queryForMap(String statementName,Object obj, String keyProperty); /** * 根据statementName、参数obj、返回Map key值、返回map value查询,返回Map * @param statementName * @param obj * @param keyProperty * @param valueProperty * @return */ public abstract <T> Map queryForMap(String statementName,Object obj, String keyProperty,String valueProperty); }
写操作接口:IbatisDaoWriter
package com.zzcm.ad.common.dao; import com.zzcm.ad.common.exception.JdbcException; public interface IbatisDaoWriter{ /** * 保存一个实体对象 * @param statementName * @param entity * @return * @throws JdbcException */ public abstract Integer save(String statementName,Object obj) throws JdbcException; /** * 保存 * @param statementName * @return * @throws JdbcException */ public abstract Integer save(String statementName) throws JdbcException; /** * 更新一个实体对象 * @param statementName * @param entity * @return * @throws JdbcException */ public abstract int update(String statementName,Object obj) throws JdbcException; /** * 更新 * @param statementName * @param entity * @return * @throws JdbcException */ public abstract int update(String statementName) throws JdbcException; /** * 按照条件删除记录 * @param statementName * @param paramObj * @return * @throws JdbcException */ public abstract int delete(String statementName,Object obj) throws JdbcException; /** * 按照条件删除记录 * @param statementName * @return * @throws JdbcException */ public abstract int delete(String statementName) throws JdbcException; }
读操作实现类:IbatisDaoReaderImpl
package com.zzcm.ad.common.dao.impl; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import org.springframework.util.Assert; import com.ibatis.sqlmap.client.SqlMapClient; import com.zzcm.ad.common.dao.IbatisDaoReader; import com.zzcm.ad.common.exception.JdbcException; /** * 对数据库读操作的实现类 * @author shunyang * */ public final class IbatisDaoReaderImpl extends SqlMapClientDaoSupport implements IbatisDaoReader { private static final Logger logger = LoggerFactory.getLogger(IbatisDaoReaderImpl.class); @Resource(name="sqlMapClientReader") private SqlMapClient sqlMapClientReader; @PostConstruct public void initSqlMapClient(){ super.setSqlMapClient(sqlMapClientReader); } @SuppressWarnings("unchecked") @Override public <T> T queryForObject(String statementName) throws JdbcException{ Assert.notNull(statementName); try { return (T) this.getSqlMapClientTemplate().queryForObject(statementName); } catch (Exception e) { logger.error("Something's wrong when query :"); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public <T> T queryForObject(String statementName, Object obj) { Assert.notNull(statementName); Assert.notNull(obj); try { return (T) this.getSqlMapClientTemplate().queryForObject(statementName,obj); } catch (Exception e) { logger.error("Something's wrong when query :"); logger.error("param:"+obj.getClass().getName()); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public <T> List<T> queryForList(String statementName) { Assert.notNull(statementName); try { return (List<T>) this.getSqlMapClientTemplate().queryForList(statementName); } catch (Exception e) { logger.error("Something's wrong when query :"); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public <T> List<T> queryForList(String statementName, Object obj) { Assert.notNull(statementName); Assert.notNull(obj); try { return (List<T>) this.getSqlMapClientTemplate().queryForList(statementName,obj); } catch (Exception e) { logger.error("Something's wrong when query :"); logger.error("statementName:"+statementName); logger.error("param:"+obj.getClass().getName()); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public <T> Map queryForMap(String statementName, Object obj,String keyProperty) { Assert.notNull(statementName); Assert.notNull(obj); try { return this.getSqlMapClientTemplate().queryForMap(statementName, obj, keyProperty); } catch (Exception e) { logger.error("Something's wrong when query :"); logger.error("statementName:"+statementName); logger.error("param:"+obj.getClass().getName()+"--->keyProperty:"+keyProperty); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public <T> Map queryForMap(String statementName, Object obj,String keyProperty, String valueProperty) { Assert.notNull(statementName); Assert.notNull(obj); try { return this.getSqlMapClientTemplate().queryForMap(statementName, obj, keyProperty, valueProperty); } catch (Exception e) { logger.error("Something's wrong when query :"); logger.error("statementName:"+statementName); logger.error("param:"+obj.getClass().getName()+"--->keyProperty:"+keyProperty+"-->valueProperty:"+valueProperty); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } }
写操作实现类:IbatisDaoWriterImpl
package com.zzcm.ad.common.dao.impl; import javax.annotation.PostConstruct; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import org.springframework.util.Assert; import com.ibatis.sqlmap.client.SqlMapClient; import com.zzcm.ad.common.dao.IbatisDaoWriter; import com.zzcm.ad.common.exception.JdbcException; /** * 对数据库写操作的实现类 * @author shunyang * */ public final class IbatisDaoWriterImpl extends SqlMapClientDaoSupport implements IbatisDaoWriter { private static final Logger logger = LoggerFactory.getLogger(IbatisDaoReaderImpl.class); @Resource(name = "sqlMapClientWriter") private SqlMapClient sqlMapClientWriter; @PostConstruct public void initSqlMapClient(){ super.setSqlMapClient(sqlMapClientWriter); } public Integer save(String statementName,Object obj) { Assert.notNull(statementName); Assert.notNull(obj); try { return (Integer) this.getSqlMapClientTemplate().insert(statementName, obj); } catch (Exception e) { logger.error("Something's wrong when save Object:"); logger.error(obj.getClass().getName()); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public Integer save(String statementName) throws JdbcException { Assert.notNull(statementName); try { return (Integer) this.getSqlMapClientTemplate().insert(statementName); } catch (Exception e) { logger.error("Something's wrong when save Object:"); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public int update(String statementName, Object obj) throws JdbcException { Assert.notNull(statementName); Assert.notNull(obj); try { return (Integer) this.getSqlMapClientTemplate().update(statementName, obj); } catch (Exception e) { logger.error("Something's wrong when update Object:"); logger.error(obj.getClass().getName()); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public int update(String statementName) throws JdbcException { Assert.notNull(statementName); try { return (Integer) this.getSqlMapClientTemplate().update(statementName); } catch (Exception e) { logger.error("Something's wrong when update Object:"); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public int delete(String statementName) throws JdbcException { Assert.notNull(statementName); try { return this.getSqlMapClientTemplate().delete(statementName); } catch (Exception e) { logger.error("Something's wrong when delete Object:"); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } @Override public int delete(String statementName, Object obj) throws JdbcException { Assert.notNull(statementName); try { return this.getSqlMapClientTemplate().delete(statementName,obj); } catch (Exception e) { logger.error("Something's wrong when delete Object:"); logger.error(obj.getClass().getName()); logger.error("statementName:"+statementName); throw new JdbcException(this.getClass() + "->" + e.getMessage(), e); } } }
基本的操作实现类:IbatisBaseDaoImpl
package com.zzcm.ad.common.dao.impl; import java.util.List; import java.util.Map; import com.zzcm.ad.common.dao.IbatisBaseDao; import com.zzcm.ad.common.dao.IbatisDaoReader; import com.zzcm.ad.common.dao.IbatisDaoWriter; import com.zzcm.ad.common.exception.JdbcException; /** * 对数据库操作的基础类,实现了读写分离 * @author shunyang * */ public class IbatisBaseDaoImpl implements IbatisBaseDao { private IbatisDaoReader ibatisDaoReader; private IbatisDaoWriter ibatisDaoWriter; public IbatisDaoReader getIbatisDaoReader() { return ibatisDaoReader; } public void setIbatisDaoReader(IbatisDaoReader ibatisDaoReader) { this.ibatisDaoReader = ibatisDaoReader; } public IbatisDaoWriter getIbatisDaoWriter() { return ibatisDaoWriter; } public void setIbatisDaoWriter(IbatisDaoWriter ibatisDaoWriter) { this.ibatisDaoWriter = ibatisDaoWriter; } @Override public Integer save(String statementName, Object obj)throws JdbcException { return ibatisDaoWriter.save(statementName, obj); } @Override public Integer save(String statementName) throws JdbcException { return ibatisDaoWriter.save(statementName); } @Override public int update(String statementName, Object obj) throws JdbcException { return ibatisDaoWriter.update(statementName, obj); } @Override public int update(String statementName) throws JdbcException { return ibatisDaoWriter.update(statementName); } @Override public int delete(String statementName, Object obj)throws JdbcException { return ibatisDaoWriter.delete(statementName,obj); } @Override public int delete(String statementName) throws JdbcException { return ibatisDaoWriter.delete(statementName); } @Override public <T> T queryForObject(String statementName) { return ibatisDaoReader.queryForObject(statementName); } @Override public <T> T queryForObject(String statementName, Object obj) { return ibatisDaoReader.queryForObject(statementName, obj); } @Override public <T> List<T> queryForList(String statementName) { return ibatisDaoReader.queryForList(statementName); } @Override public <T> List<T> queryForList(String statementName, Object obj) { return ibatisDaoReader.queryForList(statementName, obj); } @Override public <T> Map queryForMap(String statementName, Object obj, String keyProperty) { return ibatisDaoReader.queryForMap(statementName, obj, keyProperty); } @Override public <T> Map queryForMap(String statementName, Object obj, String keyProperty, String valueProperty) { return ibatisDaoReader.queryForMap(statementName, obj, keyProperty, valueProperty); } }
对外提供的类就是IbatisBaseDaoImpl
配置分离的工程:
jdbc.properties
#数据库连接的方式,请根据你的项目中现有的情况配置 jdbc.driverClassName=com.mysql.jdbc.Driver #数据连接URL,请根据你的项目中现有的情况配置 jdbc.url=jdbc:mysql://idctest.mysql.xxx.com:3306/zzsupport #数据库连接的用户名,请根据你的项目中现有的情况配置 jdbc.username=zzmanager #数据库连接的密码(带“.encrypt”与否都可以,但是带“.encrypt”的密码必须加密),请根据你的项目中现有的情况配置 #jdbc.password.encrypt=2dUGTjehnpU. jdbc.password=iadMOB-2013@0622)
support.properties
#开发环境 upload.path=D:/apache-tomcat-6.0.30/webapps/zzupload-main upload.url=http://192.168.0.88:8080/zzupload-main
工程源码详见github:https://github.com/shunyang/4gad
欢迎大家交流学习
相关文章推荐
- 搭建基于springmvc,ibatis的工程实现读写分离,配置分离
- springmvc配置mysql数据库读写分离(基于注解aop)加上(搭建mysql主从同步)
- 基于springmvc mybatis junit搭建分工程,分模块的web工程框架(一)
- 基于springmvc mybatis junit搭建分工程,分模块的web工程框架(二)
- Springmvc基础框架搭建流程(1)-基于xml配置文件
- mysql主从配置以及基于amoeba实现读写分离
- SpringMVC02---基于配置文件的Springmvc框架搭建
- 搭建springmvc环境的步骤(基于配置文件)
- 基于浏览器首选语言的springmvc和freemarker国际化配置的实现
- springMVC基于注解方式实现配置流程
- [置顶] 手把手搭建一个SpringMVC+ibatis 工程
- 手把手带你实现Spring、SpringMVC与Mybatis整合工程的搭建
- 【spring in action 学习--springMVC搭建】在不使用web.xml的情况下,配置Srping MVC工程
- 基于浏览器首选语言的springmvc和freemarker国际化配置的实现
- springmvc+ibatis框架搭建(xml配置)
- 【SpringMVC】Intellij Idea搭建一个完整的 spring mvc项目 (附带ibatis的配置与使用)
- SpringMVC4+MyBatis+SQL Server2014 基于SqlSession实现读写分离(也可以实现主从分离)
- 基于spring的aop实现读写分离与事务配置
- 基于springmvc mybatis junit搭建分工程,分模块的web工程框架(三)
- 基于注解的SpringMVC搭建和freemark配置