Spring+SpringMVC+Mybatis 多数据源整合(转)
转载自:http://blog.csdn.net/q908555281/article/details/50316137
目录(?)[-]
拷贝所需jar
拷贝jar文件需要的jar文件入下图所示因为我的项目中用到了json解析所以导入了json相关的包
写一个数据库切换的工具类DataSourceContextHolder用来切换数据库
写一个DynamicDataSource类来继承AbstractRoutingDataSource并重写determineCurrentLookupKey方法来达到动态切换数据库
在beansxml文件中配置数据源我这里配置的三个数据源不过在配置数据源之前先配置一下注解扫描器然后我接着配置了三个数据源然后配置动态数据源
在beansxml文件中创建sqlSessionFactory实例
在beansxml文件中配置事物事物的传播性
在beansxml文件中配置AOP注意这里expression 后面一定要是自己程序所在包名复制的时候一定要改掉
创建一个User对象配置Userxml文件写一个UserMapper接口用来操作User对象的接口 User类属性有点长请忽略这些属性
将User类的路径以及Userxml文件的路径在mybatis-configxml文件中配置
写一个UserService接口接口里面的方法和UserMapper接口里面的方法一致返回值和参数可不同方法名最好一致并写UserServiceImpl来实现UserService接口
demo下载地址httpdownloadcsdnnetdetailq9085552819357757
此篇文章是基于Spring3.0和mybatis3.2的
总体大概流程:
1. 拷贝所需jar
2.写一个数据库切换的工具类:DataSourceContextHolder,用来切换数据库
3.写一个DynamicDataSource类来继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法,来达到动态切换数据库
4. 创建springmvc-servlet.xml文件,然后创建spring配置文件(beans.xml)
5. 在beans.xml文件中配置数据源。我这里配置的三个数据源
6. 在beans.xml文件中创建sqlSessionFactory实例
7. 在beans.xml文件中配置事物、事物的传播性
8. 在beans.xml文件中配置AOP
9. 创建一个User对象,配置User.xml文件。写一个UserMapper接口,用来操作User对象的接口
10. 将User类的路径以及User.xml文件的路径在mybatis-config.xml文件中配置
11. 写一个UserService接口(接口里面的方法和UserMapper接口里面的方法一致,返回值和参数可不同,方法名最好一致),并写UserServiceImpl来实现UserService接口
12.写Controller类,并在其中写相对应的方法,给外部调用
下面看一下我的工程的目录:
common包存放的是一些公用类
controller包下放的是提供给外部访问的接口的(.do)类
datasource包下是用来配置数据库
entity:实体类
mapper:.....存放XXMapper以及实体类的对应表的关系的xml文件
下面一步步的来讲解:
1、拷贝jar文件。需要的jar文件入下图所示,因为我的项目中用到了json解析,所以导入了json相关的包
2.写一个数据库切换的工具类:DataSourceContextHolder,用来切换数据库
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDbType(String dbType) {
contextHolder.set(dbType);
} public static String getDbType() {
return ((String) contextHolder.get());
} public static void clearDbType() {
contextHolder.remove();
}
}
3.写一个DynamicDataSource类来继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法,来达到动态切换数据库
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
} @Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder. getDbType();
} }
4. 创建springmvc-servlet.xml文件,然后创建spring配置文件(beans.xml),看一下我的springmvc-servlet.xml文件。
这里配置了一个注解扫描器,一般填自己的主包名就可以了,他会自动扫描我的com.baimi.routerweb包下面所有的带注解的类或者方法,常变量等。
还配置了一个视图解析器(如果需要用到jsp文件,就需要配置此解析器)
最后引入我的spring的配置文件:beans.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:context= "http://www.springframework.org/schema/context"
xmlns:mvc= "http://www.springframework.org/schema/mvc"
xsi:schemaLocation= "http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 注解扫描器 -->
<context:component-scan base-package ="com.baimi.routerweb"/> <!-- 配置试图解析器 -->
<bean class= "org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name ="prefix" value="/"></ property>
<property name ="suffix" value=".jsp"></ property>
</bean > <import resource ="classpath:beans.xml"/> </beans>
5. 在beans.xml文件中配置数据源。我这里配置的三个数据源,不过在配置数据源之前,先配置一下注解扫描器。然后我接着配置了三个数据源,然后配置动态数据源
<context:component-scan base-package ="com" /> <!-- 多数据源配置 -->
<bean id ="ds_admin" class= "org.apache.commons.dbcp.BasicDataSource" >
<property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >
<property name ="url" value= "jdbc:mysql://192.168.19.72:3307/100msh_admin" ></property >
<property name ="username" value="root"></ property>
<property name ="password" value="root"></ property>
</bean >
<bean id ="ds_partner" class= "org.apache.commons.dbcp.BasicDataSource" >
<property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >
<property name ="url"
value= "jdbc:mysql://192.168.19.72:3308/100msh_partner" ></property >
<property name ="username" value="root"></ property>
<property name ="password" value="root"></ property>
</bean >
<bean id ="ds_mop" class="org.apache.commons.dbcp.BasicDataSource">
<property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >
<property name ="url" value= "jdbc:mysql://192.168.19.72:3309/100msh_mop" ></property >
<property name ="username" value="root"></ property>
<property name ="password" value="root"></ property>
</bean > <!-- 动态配置数据源 -->
<bean id ="dataSource" class= "com.baimi.routerweb.datasource.DynamicDataSource" >
<property name ="targetDataSources">
<map key-type ="java.lang.String">
<entry value-ref ="ds_admin" key= "ds_admin"></entry >
<entry value-ref ="ds_partner" key= "ds_partner"></entry >
<entry value-ref ="ds_mop" key="ds_mop"></ entry>
</map >
</property >
<property name ="defaultTargetDataSource" ref= "ds_mop"></property > <!-- 默认使用ds1的数据源 -->
</bean >
<context:component-scan base-package ="com" /> <!-- 多数据源配置 -->
<bean id ="ds_admin" class= "org.apache.commons.dbcp.BasicDataSource" >
<property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >
<property name ="url" value= "jdbc:mysql://192.168.19.72:3307/100msh_admin" ></property >
<property name ="username" value="root"></ property>
<property name ="password" value="root"></ property>
</bean >
<bean id ="ds_partner" class= "org.apache.commons.dbcp.BasicDataSource" >
<property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >
<property name ="url"
value= "jdbc:mysql://192.168.19.72:3308/100msh_partner" ></property >
<property name ="username" value="root"></ property>
<property name ="password" value="root"></ property>
</bean >
<bean id ="ds_mop" class="org.apache.commons.dbcp.BasicDataSource">
<property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >
<property name ="url" value= "jdbc:mysql://192.168.19.72:3309/100msh_mop" ></property >
<property name ="username" value="root"></ property>
<property name ="password" value="root"></ property>
</bean > <!-- 动态配置数据源 -->
<bean id ="dataSource" class= "com.baimi.routerweb.datasource.DynamicDataSource" >
<property name ="targetDataSources">
<map key-type ="java.lang.String">
<entry value-ref ="ds_admin" key= "ds_admin"></entry >
<entry value-ref ="ds_partner" key= "ds_partner"></entry >
<entry value-ref ="ds_mop" key="ds_mop"></ entry>
</map >
</property >
<property name ="defaultTargetDataSource" ref= "ds_mop"></property > <!-- 默认使用ds1的数据源 -->
</bean >
6. 在beans.xml文件中创建sqlSessionFactory实例
<!-- 创建SqlSessionFactory -->
<bean id ="sqlSessionFactoryBean" class= "org.mybatis.spring.SqlSessionFactoryBean" >
<!-- 指定数据源 -->
<property name ="dataSource" ref="dataSource" />
<!-- 指定mybatis 的配置文件 -->
<property name ="configLocation" value= "classpath:mybatis-config.xml" />
</bean >
7. 在beans.xml文件中配置事物、事物的传播性
<!-- 配置事务 -->
<bean id ="transactionManager"
class= "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name ="dataSource" ref="dataSource"></ property>
</bean > <!-- 映射接口 -->
<bean class ="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name ="basePackage" value= "com.baimi.routerweb.mapper"></property >
</bean > <!-- 配置事务的传播特性 -->
<tx:advice id ="txAdvice" transaction-manager="transactionManager">
<tx:attributes >
<tx:method name ="find*" read-only="true" />
<tx:method name ="get*" read-only="true" />
<tx:method name ="query*" read-only="true" />
<tx:method name ="add*" propagation="REQUIRED" />
<tx:method name ="update*" propagation="REQUIRED" />
<tx:method name ="del*" propagation="REQUIRED" />
</tx:attributes >
</tx:advice >
8. 在beans.xml文件中配置AOP,注意这里,expression 后面一定要是自己程序所在包名,复制的时候一定要改掉
<!-- 配置AOP -->
<aop:config >
<!-- 切点 -->
<aop:pointcut expression ="execution(* com.baimi.routerweb.service..*.*(..))"
id= "pointcut" />
<aop:advisor advice-ref ="txAdvice" pointcut-ref="pointcut" />
</aop:config >
9. 创建一个User对象,配置User.xml文件。写一个UserMapper接口,用来操作User对象的接口。
User类属性有点长,请忽略这些属性
public class User {
private int userId;
private int compId;
private String euserName;
private String euserPhone;
private int euserStatus;
private String eAddTime;
private String eLeaveTime;
private String eUserNameCn;
private int cUserId;
private String scDown;
private String userDesc; public int getUserId() {
return userId;
} public void setUserId( int userId) {
this. userId = userId;
} public int getCompId() {
return compId;
} public void setCompId( int compId) {
this. compId = compId;
} public String getEuserName() {
return euserName;
} public void setEuserName(String euserName) {
this. euserName = euserName;
} public String getEuserPhone() {
return euserPhone;
} public void setEuserPhone(String euserPhone) {
this. euserPhone = euserPhone;
} public int getEuserStatus() {
return euserStatus;
} public void setEuserStatus( int euserStatus) {
this. euserStatus = euserStatus;
} public String geteAddTime() {
return eAddTime;
} public void seteAddTime(String eAddTime) {
this. eAddTime = eAddTime;
} public String geteLeaveTime() {
return eLeaveTime;
} public void seteLeaveTime(String eLeaveTime) {
this. eLeaveTime = eLeaveTime;
} public String geteUserNameCn() {
return eUserNameCn;
} public void seteUserNameCn(String eUserNameCn) {
this. eUserNameCn = eUserNameCn;
} public int getcUserId() {
return cUserId;
} public void setcUserId( int cUserId) {
this. cUserId = cUserId;
} public String getScDown() {
return scDown;
} public void setScDown(String scDown) {
this. scDown = scDown;
} public String getUserDesc() {
return userDesc;
} public void setUserDesc(String userDesc) {
this. userDesc = userDesc;
}
}
编写UserMapper接口,这里面的方法是用来操作User对象的,我这里只是一个简单的根据手机号码,得到这个User对象
public interface UserMapper {
public User getUser(String euserPhone);
}
编写User.xml文件,该文件里面配置User类里面的属性和表中的那些字段进行对应,以及在UserMapper中定义的查询的方法,在User.xml中写上对应的查询语句,我这里是查的t_expand_user 表
<?xml version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace= "com.baimi.routerweb.mapper.UserMapper" >
<resultMap type ="User" id="usermap">
<result property ="userId" column="euser_id" />
<result property ="compId" column="comp_id" />
<result property ="euserName" column="euser_name" />
<result property ="euserPhone" column="euser_phone" />
<result property ="euserStatus" column="euser_status" />
<result property ="eAddTime" column="e_add_time" />
<result property ="eLeaveTime" column="e_leave_time" />
<result property ="eUserNameCn" column="euser_name_cn" />
<result property ="cUserId" column="user_id" />
<result property ="scDown" column="sc_own" />
<result property ="userDesc" column="euser_desc" />
</resultMap > <!-- 查询一条记录 -->
<select id ="getUser" parameterType="java.lang.String" resultMap= "usermap">
select * from t_expand_user where euser_phone=#{euserPhone}
</select > </mapper>
10. 将User类的路径以及User.xml文件的路径在mybatis-config.xml文件中配置
<?xml version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration> <!-- 别名 -->
<typeAliases >
<typeAlias type ="com.baimi.routerweb.entity.User" alias= "User" />
</typeAliases >
<mappers >
<mapper resource ="com/baimi/routerweb/mapper/User.xml" />
</mappers >
</configuration>
11. 写一个UserService接口(接口里面的方法和UserMapper接口里面的方法一致,返回值和参数可不同,方法名最好一致),并写UserServiceImpl来实现UserService接口
public interface UserService {
public User getUser(String euserPhone);
}
UserServiceImpl里面要做的就是调用UserMapper中的方法
import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.baimi.routerweb.datasource.DataSourceContextHolder;
import com.baimi.routerweb.datasource.DataSourceType;
import com.baimi.routerweb.entity.User;
import com.baimi.routerweb.mapper.UserMapper;
import com.baimi.routerweb.service.UserService; @Service
public class UserServiceImpl implements UserService { @Resource(name = "userMapper")
private UserMapper userMapper; @Override
public User getUser(String euserPhone) {
DataSourceContextHolder. setDbType(DataSourceType.SOURCE_MOP);
return userMapper.getUser(euserPhone);
} }
12.写Controller类,并在其中写相对应的方法,给外部调用,这里主要就是两行代码:注意每次要和数据库打交道之前,切换到相对应的数据库,我的DataSourceType. SOURCE_MOP="ds_mop"; 这里的名字一定要和beans.xml里面配置的数据源的名称一样
//切换数据库
DataSourceContextHolder. setDbType(DataSourceType. SOURCE_MOP);
//从数据库中得到该用户的数据
User user= userService.getUser(userId);
整个Controller类的代码
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.baimi.routerweb.common.Constant;
import com.baimi.routerweb.common.ErrorHandle;
import com.baimi.routerweb.datasource.DataSourceContextHolder;
import com.baimi.routerweb.datasource.DataSourceType;
import com.baimi.routerweb.entity.User;
import com.baimi.routerweb.service.UserService;
import com.baimi.routerweb.util.HttpUtil; @Controller
public class MainController { @Resource(name = "userServiceImpl")
private UserService userService; @RequestMapping("/login.do")
public String login(HttpServletRequest request, HttpServletResponse response) {
// 获取客户端传过来的code的值
String code = request.getParameter( "code");
if (code == null || "".equals(code)) {
return ErrorHandle.getError(ErrorHandle.INVALID_TOKEN, "invalid token");
}
// 从微信得到token的值
JSONObject objToken = HttpUtil.httpRequest(Constant.URL_WEIXIN_TOKEN, "GET", null);
if (objToken == null || "".equals(objToken)) {
return ErrorHandle.getError(ErrorHandle.SERVICE_UNRESPONSE, "service unresponse");
}
if (!objToken.has( "access_token")) {
return ErrorHandle.getError(ErrorHandle.INVALID_TOKEN, "invalid token");
}
//根据token和code得到UserId
JSONObject objUser = HttpUtil.httpRequest(Constant.URL_GET_USERID,
"POST", "access_token=" + objToken.getString("access_token" )+ "&code=" + code + "&agentid=1");
if(objUser== null|| "".equals(objUser)){
return ErrorHandle.getError(ErrorHandle.SERVICE_UNRESPONSE, "service unresponse");
}
if(!objUser.has( "UserId")){
return ErrorHandle.getError(ErrorHandle.INVALID_TOKEN, "invalid token");
}
String userId=objUser.getString( "UserId");
//切换数据库
DataSourceContextHolder. setDbType(DataSourceType.SOURCE_MOP);
//从数据库中得到该用户的数据
User user= userService.getUser(userId);
if(user!= null){
JSONObject rtObj = new JSONObject();
rtObj.put( "userId", String.valueOf(user.getUserId()));
return rtObj.toString();
}
return ErrorHandle.getError(ErrorHandle.INVALID_USER,"invalid user");
}
}
访问路径:locahost:8080/RouterWeb/login.do
demo下载地址:http://download.csdn.net/detail/q908555281/9357757
Spring+SpringMVC+Mybatis 多数据源整合(转)的更多相关文章
- Spring+SpringMVC+MyBatis+Maven框架整合
本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...
- idea spring+springmvc+mybatis环境配置整合详解
idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...
- ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查
三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...
- [置顶]
Java Web学习总结(24)——SSM(Spring+SpringMVC+MyBatis)框架快速整合入门教程
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- SSM(Spring+SpringMVC+Mybatis)框架整合
1.数据准备 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `admin` -- - ...
- spring springmvc mybatis maven 项目整合示例-导航页面
spring原理 实践解析-简单的helloworld spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包 spring原理案例-基本项目 ...
- 简单易学的SSM(Spring+SpringMVC+MyBatis)整合
SSM(Spring+SpringMVC+MyBatis)的整合: 具体执行过程:1.用户在页面向后台发送一个请求 2.请求由DispatcherServlet 前端控制器拦截交给SpringMVC管 ...
- Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版
Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...
- Spring+springmvc+Mybatis整合案例 xml配置版(myeclipse)详细版
Spring+springmvc+Mybatis整合案例 Version:xml版(myeclipse) 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version ...
随机推荐
- 一个漂亮的php验证码类(分享)
直接上代码: 复制代码 代码如下: //验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRS ...
- 【CISP笔记】安全漏洞与恶意代码(2)
恶意代码自我保护 进程保护 进程守护 超级权限 检测对抗 反动态调试 反静态调试 恶意代码检测技术 特征码扫描 沙箱技术 行为检测 恶意代码分析技术 静态分析 需要实际执行恶意代码,它通过对其二进制文 ...
- 预处理prepareStatement是怎么防止sql注入漏洞的?
序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞. 一.prepareStat ...
- web网页颜色色谱
snow 255 250 250 #fffafa ghostwhite 248 248 255 #f8f8ff whitesmoke 245 245 245 #f5f5f5 gainsboro 220 ...
- Excel 单元格自定义格式技巧总结
第一部分 Excel 中的单元格格式是一个最基本但是又很高级的技能,说它基本是因为我们几乎天天都会用到它,会用它来设置一些简单的格式,比如日期,文本等等:高级是因为利用 Excel 单元格的自定义格式 ...
- 可编辑select
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- Marsedit 破解版下载(3.5.6)
Marsedit 破解版下载(3.5.6) 最近在 Mac 端写文章经常遇到棘手的问题,最近发现了 marsedit 现在分享给大家 marsedit downloads
- Ubuntu 14 修改默认打开方式
通过研究,有三种修改方式. 方式一: 修改路径:右上角“系统设置” -> 详细信息 -> 默认应用程序 但是,有个缺陷,可修改的项比较少. 方式二: 例如,修改pdf的打开方式,只要查看任 ...
- java web 相对路径中已/开头和不已/开头的区别
通俗的讲,有/会从跟目录开始算,没有会从当前目录开始算 1.前台页面 页面中向服务器页面请求静态资源且没有指定<base href="<%=basePath%>" ...
- Java File 常用操作回顾
最近项目中要用到File这个类,温故而知新,回过头来回顾下这个File类,File类主要是对磁盘目录,文件进行操作的Api,具体其实查JDK api 的File全能获取到. 下面写一些文件目录的基本操 ...