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

时间: 2024-10-07 18:11:49

Spring+SpringMVC+Mybatis 多数据源整合(转)的相关文章

Spring+SpringMVC+MyBatis+Maven框架整合

本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Spring与MyBatis的整合 一.Maven需要引入的jar包 本文默认读者已经掌握Maven的使用,Maven配置片段如下 Xml代码   <!-- 引入spring-webmvc与spring-jdbc --> <dependency> <groupId>org.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.查看idea中是否安装Maven插件: 2.1:File --> Settings --> Plugins 2.2:如下图所示的步骤进行操作(注:安装完插件,idea会重新启动) 3.idea创建Maven项目的步骤 4.搭建目录结构 下图就是我搭建Maven项目之后,添加对应的目录和文件 5.p

SSM(Spring+SpringMVC+Mybatis)框架整合

1.数据准备 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `admin` -- ---------------------------- DROP TABLE IF EXISTS `admin`; CREATE TABLE `admin` ( `a_id` int(11) NOT NULL AUTO_INCREMENT, `a_name` varchar(20) NOT NULL

简单易学的SSM(Spring+SpringMVC+MyBatis)整合

SSM(Spring+SpringMVC+MyBatis)的整合: 具体执行过程:  1.用户在页面向后台发送一个请求 2.请求由DispatcherServlet 前端控制器拦截交给SpringMVC管理,SpringMVC讲这个请求传递给Controller层处理. 同时请求由Listener监听到交付给Spring,Spring建立IOC容器. 3.Controller层中会调用相应的Service层的方法处理业务逻辑.此时Service从上一步中建立好的IOC容器获取对象,然后获取 到M

SSM框架 (Spring+SpringMVC+MyBatis)

SSM框架--详细整合教程(Spring+SpringMVC+MyBatis) springspringmvcmybatis整合教程ssm整合 1.基本概念  1.1.Spring          Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.Spri

spring,springmvc,mybatis基本整合(一)--xml文件配置方式(2)

spring,springmvc,mybatis基本整合(一)–xml文件配置方式(2)之mapper接口 一,整合结构 二,所需jar包 如上图. 三,整合配置 1,web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://j

搭建Spring + SpringMVC + Mybatis框架之二(整合Spring和Mybatis)

整合Spring和Mybatis 首先给出完整的项目目录: (1)引入项目需要的jar包 使用http://maven.apache.org作为中央仓库即可. Spring核心包,mybatis核心包,json数据需要的包[经常需要用到],log4j日志管理包. 1 <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&q

SSM框架整合(IntelliJ IDEA + maven + Spring + SpringMVC + MyBatis)

原文链接: http://blog.csdn.net/gallenzhang/article/details/51932152 本篇文章主要内容是介绍如何使用IntelliJ IDEA创建spring+ SpringMVC + MyBatis项目,下面会给出项目搭建的详细步骤以及相关的配置文件. =======================================前言 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helve

Spring+SpringMVC+Mybatis+Mysql整合实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现Spring+SpringMVC+Mybatis+Mysql的一个整合,实现了SpringMVC控制访问的页面,将得到的页面参数传递给Spring中的Mybatis的bean类,然后查找Mysql数据的功能,并通过JSP显示出来.建议可以先看笔者另一文章Mybatis与Spring整合创建Web项目.笔者觉得整合过程中问题比较多的还是Spring+Mybatis的整合,Spring