您的位置:首页 > 编程语言 > Java开发

搭建基于springmvc,ibatis的工程实现读写分离,配置分离

2017-04-06 10:30 615 查看
实现读写分离:

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.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context-3.0.xsd 12 http://www.springframework.org/schema/mvc 13 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/beans
10 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 11 http://www.springframework.org/schema/tx 12 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 13 http://www.springframework.org/schema/context 14 http://www.springframework.org/schema/context/spring-context-3.0.xsd 15 http://www.springframework.org/schema/util 16 http://www.springframework.org/schema/util/spring-util-3.0.xsd 17 http://www.springframework.org/schema/mvc 18 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 statementName
14 * @param obj
15 * @return
16 */
17 public abstract <T> T queryForObject(String statementName, Object obj);
18 /**
19 * 根据statementName查询,返回对象集合List
20 * @param statementName
21 * @return
22 */
23 public abstract <T> List<T> queryForList(String statementName);
24 /**
25 * 根据statementName,参数obj查询,返回对象集合List
26 * @param statementName
27 * @param obj
28 * @return
29 */
30 public abstract <T> List<T> queryForList(String statementName, Object obj);
31 /**
32 * 根据statementName,参数obj,返回Map key值查询,返回Map
33 * @param statementName
34 * @param obj
35 * @param keyProperty
36 * @return
37 */
38 public abstract <T> Map queryForMap(String statementName,Object obj, String keyProperty);
39 /**
40 * 根据statementName、参数obj、返回Map key值、返回map value查询,返回Map
41 * @param statementName
42 * @param obj
43 * @param keyProperty
44 * @param valueProperty
45 * @return
46 */
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 JdbcException
10 */
11 public abstract Integer save(String statementName,Object obj) throws JdbcException;
12 /**
13 * 保存
14 * @param statementName
15 * @return
16 * @throws JdbcException
17 */
18 public abstract Integer save(String statementName) throws JdbcException;
19 /**
20 * 更新一个实体对象
21 * @param statementName
22 * @param entity
23 * @return
24 * @throws JdbcException
25 */
26 public abstract int update(String statementName,Object obj) throws JdbcException;
27 /**
28 * 更新
29 * @param statementName
30 * @param entity
31 * @return
32 * @throws JdbcException
33 */
34 public abstract int update(String statementName) throws JdbcException;
35 /**
36 * 按照条件删除记录
37 * @param statementName
38 * @param paramObj
39 * @return
40 * @throws JdbcException
41 */
42 public abstract int delete(String statementName,Object obj) throws JdbcException;
43 /**
44 * 按照条件删除记录
45 * @param statementName
46 * @return
47 * @throws JdbcException
48 */
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 shunyang
14  *
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     @PostConstruct
21     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     @Override
38     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     @Override
50     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     @Override
64     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     @Override
75     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     @Override
86     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 shunyang
11  *
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     @Override
30     public Integer save(String statementName, Object obj)throws JdbcException {
31         return ibatisDaoWriter.save(statementName, obj);
32     }
33     @Override
34     public Integer save(String statementName) throws JdbcException {
35         return ibatisDaoWriter.save(statementName);
36     }
37     @Override
38     public int update(String statementName, Object obj) throws JdbcException {
39         return ibatisDaoWriter.update(statementName, obj);
40     }
41     @Override
42     public int update(String statementName) throws JdbcException {
43         return ibatisDaoWriter.update(statementName);
44     }
45     @Override
46     public int delete(String statementName, Object obj)throws JdbcException {
47         return ibatisDaoWriter.delete(statementName,obj);
48     }
49     @Override
50     public int delete(String statementName) throws JdbcException {
51         return ibatisDaoWriter.delete(statementName);
52     }
53     @Override
54     public <T> T queryForObject(String statementName) {
55         return ibatisDaoReader.queryForObject(statementName);
56     }
57     @Override
58     public <T> T queryForObject(String statementName, Object obj) {
59         return ibatisDaoReader.queryForObject(statementName, obj);
60     }
61     @Override
62     public <T> List<T> queryForList(String statementName) {
63         return ibatisDaoReader.queryForList(statementName);
64     }
65     @Override
66     public <T> List<T> queryForList(String statementName, Object obj) {
67         return ibatisDaoReader.queryForList(statementName, obj);
68     }
69     @Override
70     public <T> Map queryForMap(String statementName, Object obj,
71             String keyProperty) {
72         return ibatisDaoReader.queryForMap(statementName, obj, keyProperty);
73     }
74     @Override
75     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-main
3 upload.url=http://192.168.0.88:8080/zzupload-main


工程源码详见github:https://github.com/shunyang/4gad
欢迎大家交流学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: