搭建基于springmvc,ibatis的工程实现读写分离,配置分离
实现读写分离:
<?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>
<?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>
package com.zzcm.ad.common.dao;
public interface IbatisBaseDao extends IbatisDaoReader,IbatisDaoWriter{
}
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);
}
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; }
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);
}
}
}
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);
}
}
}
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);
}
}
#数据库连接的方式,请根据你的项目中现有的情况配置
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
搭建基于springmvc,ibatis的工程实现读写分离,配置分离的更多相关文章
- IDEA搭建基于maven的springboot工程
---恢复内容开始--- 基础环境:IntelliJ IDEA 2018.1.6 x64.JDK1.8 一.创建maven 填写包名.项目名 选择对应的本地maven 默认过来的project nam ...
- CentOS 7 搭建基于携程Apollo(阿波罗)配置中心单机模式
Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性.服务端基于Spring Boot ...
- Ubuntu 16.04下搭建基于携程Apollo(阿波罗)配置中心单机模式
官网:https://github.com/ctripcorp/apollo Wiki:https://github.com/ctripcorp/apollo/wiki(一切的集成方式和使用方法都在这 ...
- Spring boot dubbo+zookeeper 搭建------基于gradle项目的消费端与服务端分离实战
1. Dubbo简介 Dubbo是Alibaba开源的分布式框架,是RPC模式的一种成熟的框架,优点是可以与Spring无缝集成,应用到我们的后台程序中.具体介绍可以查看Dubbo官网. 2. Why ...
- springMVC用法 以及一个简单的基于springMVC hibernate spring的配置
替代struts 1 web.xml中配置springmvc中央控制器 <?xml version="1.0" encoding="UTF-8"?> ...
- 十六、.net core(.NET 6)搭建基于Redis的Hangfire定时器
搭建基于Redis的Hangfire定时器 Hangfire的定时配置信息会自动生成在指定到数据库内,包括关系型数据库或非关系型数据库内.目前为止,它在Redis.Oracle上面,可以支持最短15秒 ...
- 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...
- 搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境
搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境 最近有很多人不知道如何搭建基于SSI(struts2,spring,ibatis)的J2EE开发环境,这里给大家一个 ...
- 搭建基于MySQL的读写分离工具Amoeba
搭建基于MySQL的读写分离工具Amoeba: Amoeba工具是实现MySQL数据库读写分离的一个工具,前提是基于MySQL主从复制来实现的: 实验环境(虚拟机): 主机 角色 10.10.10.2 ...
随机推荐
- Ormlite or()的使用
如题,由于不熟悉这个框架的API,所以用的时候出错了,直接上代码 public List<Type> getAllBetweenDate(String start, String end) ...
- Linux下php+mysql+nginx编译搭建(一)
之前一直都是一键搭建的webserver,可是一键搭建的环境相对来说都是比較老的.假设要用比較新的环境,特别是正式server,就必须自己手动编译搭建了(下面搭建基于linux centos6.5 3 ...
- Linux Mysql 权限相关信息 来源于网络
查看用户权限 show grants for 你的用户 比如: show grants for root@’localhost’; mysql> use mysql; Database chan ...
- sql分页查询公式
分页查询公式: select top PageRow(每页显示的数据行数) from 表名 where 主键 not in(select top PageRow*(当前页数-1) 主键 from ...
- 如何运行代码apk安装
import java.io.File; import android.app.Activity; import android.content.Intent; import android.net. ...
- jrtplib的使用
JRTPLIB库的使用 文档: http://research.edm.uhasselt.be/jori/jrtplib/documentation/index.html 一些介绍: http://d ...
- Linux开源模块迁移概述暨交叉编译跨平台移植总结--从《嵌入式Linux驱动模板简洁和工程实践》
本文摘录<嵌入式Linux驱动模板简洁和工程实践>一本书"开发和调试技术". Linux强大的是,有那么多的开源项目可以使用.通常非常需要可以通过寻找相关的源模块被定义 ...
- AngularJS + CoffeeScript
AngularJS + CoffeeScript 前端开发环境配置详解 AngularJS 号称 '第一框架' ('The first framework') 确实是名不虚传.由其从jQuery中完全 ...
- ViewPaper实现轮播广告条
使用V4包中的viewPaper组件自己定义轮播广告条效果. 实现viewpaper的滑动切换和定时自己主动切换效果. 上效果图 布局文件 <RelativeLayout xmlns:andro ...
- Perl基础(1)chop与chomp的区别
chop是去掉字符串的最后一个字符 chomp是去掉"$/"指定的结尾符号 测试程序一: [perl] #!/bin/perl $tmp = "sincere" ...