Spring+Mybatis多数据库的配置

场景:在Spring+Mybatis搭建的项目中要在配置两个数据库,如何实现?

其实也不是多难的事情,只要把配置配好了,一切问题就迎刃而解了,废话不多说,且看

如下配置……

配置一:jdbc.properties

配置两个数据库:myuser和myitem

myuser.jdbc.driver=com.mysql.jdbc.Driver
myuser.jdbc.url=jdbc:mysql://192.168.1.100:3306/myuser?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
myuser.jdbc.username=root
myuser.jdbc.password=123456

myitem.jdbc.driver=com.mysql.jdbc.Driver
myitem.jdbc.url=jdbc:mysql://192.168.1.100:3306/myitem?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
myitem.jdbc.username=root
myitem.jdbc.password=123456

配置二:applicationContext.xml

配置:

两个数据源(myUserDataSource和myItemDataSource)、

一个动态的DataSource(dynamicDataSource);

      <!-- 数据库连接池1 :myuser-->
    <bean id="myUserDataSource" class="com.jolbox.bonecp.BoneCPDataSource"
        destroy-method="close">
        <!-- 数据库驱动 -->
        <property name="driverClass" value="${myuser.jdbc.driver}" />
        <!-- 相应驱动的jdbcUrl -->
        <property name="jdbcUrl" value="${myuser.jdbc.url}" />
        <!-- 数据库的用户名 -->
        <property name="username" value="${myuser.jdbc.username}" />
        <!-- 数据库的密码 -->
        <property name="password" value="${myuser.jdbc.password}" />
        <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
        <property name="idleConnectionTestPeriod" value="60" />
        <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
        <property name="idleMaxAge" value="30" />
        <!-- 每个分区最大的连接数 -->
        <property name="maxConnectionsPerPartition" value="150" />
        <!-- 每个分区最小的连接数 -->
        <property name="minConnectionsPerPartition" value="5" />
    </bean>
    <!-- 数据库连接池2 :myitem-->
    <bean id="myItemDataSource" class="com.jolbox.bonecp.BoneCPDataSource"
        destroy-method="close">
        <!-- 数据库驱动 -->
        <property name="driverClass" value="${myitem.dbc.driver}" />
        <!-- 相应驱动的jdbcUrl -->
        <property name="jdbcUrl" value="${myitem.jdbc.url}" />
        <!-- 数据库的用户名 -->
        <property name="username" value="${myitem.jdbc.username}" />
        <!-- 数据库的密码 -->
        <property name="password" value="${myitem.jdbc.password}" />
        <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
        <property name="idleConnectionTestPeriod" value="60" />
        <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
        <property name="idleMaxAge" value="30" />
        <!-- 每个分区最大的连接数 -->
        <property name="maxConnectionsPerPartition" value="150" />
        <!-- 每个分区最小的连接数 -->
        <property name="minConnectionsPerPartition" value="5" />
    </bean>

    
    
    <!-- 数据库连接池 -->
    <bean id="dynamicDataSource" class="com.wupao.sso.dynamicdatasource.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry value-ref="myUserDataSource" key="myUserDataSource"/>
                <entry value-ref="myItemDataSource" key="myItemDataSource"/>
            </map>
        </property>
<!--          <property name="defaultTargetDataSource" ref="myUserDataSource"/>默认使用myUserDataSource的数据源 -->
    </bean>

有童鞋可能会问:DynamicDataSource这个类是怎么回事?

别急,这个类是自定义的一个类,此类必须继承:AbstractRoutingDataSource这个抽象类,并且重写

AbstractRoutingDataSource方法,动态数据源才会生效。

代码如下:

/**
 * 自定义动态数据源,继承AbstractRoutingDataSource抽象类,
 * 重写determineCurrentLookupKey方法
 * @author root
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DBContextHolder.getDBType();
    }
}

问:那事物怎么管理呢?别急,继续往下看……

配置三:applicationContext-transaction.xml

<!-- 定义事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dynamicDataSource" />
    </bean>

    <!-- 定义事务策略 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--所有以query开头的方法都是只读的 -->
            <tx:method name="query*" read-only="true" />
            <!--其他方法使用默认事务策略 -->
            <tx:method name="*" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型,
            这里星号表明匹配所有返回类型。 com.abc.dao.*.*(..)表明匹配com.simple.mybatis.service包下的所有类的所有 
            方法 -->
        <aop:pointcut id="myPointcut" expression="execution(* com.simple.sso.service.*.*(..))" />
        <!--将定义好的事务处理策略应用到上述的切入点 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
    </aop:config>

问:那么sqlSessionFactory怎么获取数据源呢?继续配置……

配置四:applicationContext-mybatis.xml

  <!-- 定义Mybatis的SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 定义数据源 -->
        <property name="dataSource" ref="dynamicDataSource" />
        <!-- 指定mybatis全局配置文件 -->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
        
        <!-- 扫描mappers目录以及子目录下的所有xml文件 -->
<!--           <property name="mapperLocations" value="classpath:mybatis/mappers/**/*.xml" /> -->
          
          <!-- 别名扫描包 -->
          <property name="typeAliasesPackage" value="com.simple.sso.pojo"/>
    </bean>

到这里,其实该配置的都已经配置完了。

问:那么在代码中该如何使用呢?比如说要插入的数据时该往哪个数据库中插入呢?我怎么保证数据就是我要插入的数据库呢?

我们都知道要插入数据首先是要生成实体类和表对应起来,把数据封装到实体类,通过映射关系和注解标识把数据插入到表中,所以亮点就在这里了,上面的问题也就不言而喻了。

在实体类上注解上添加注解:

如:myuser数据库中有user表,指定:数据库名.表名(重点!!!)

@Table(name = "myuser.user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;// 用户id
    @Length(min = 2, max = 20, message = "账户名为2-20位,由汉字、字母(不分大小写)、数字或下划线组成!")
    private String loginname;// 用户名

这样指定之后,当在代码中要往myuser.user表中插入数据时,封装完的User对象作为参数传递到saveUser(User user)方法中,自动就会插入到myuser库中的user表中。

问:如果myitem表中也有user表怎么办?我要往myitem的user表中插入数据怎么实现?

答案:同上!

@Table(name = "myitem.user")
public class ItemUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;// 用户id
    @Length(min = 2, max = 20, message = "账户名为2-20位,由汉字、字母(不分大小写)、数字或下划线组成!")
    private String loginname;// 用户名

看到这里,我相信大家已经有所了解了,祝你配置成功!

时间: 2024-10-20 11:58:09

Spring+Mybatis多数据库的配置的相关文章

Spring+MyBatis双数据库配置

Spring+MyBatis双数据库配置 近期项目中遇到要调用其它数据库的情况.本来仅仅使用一个MySQL数据库.但随着项目内容越来越多,逻辑越来越复杂. 原来一个数据库已经不够用了,须要分库分表.所以决定扩充数据库,正好Spring能够灵活的扩充数据库.以下简单写一篇博文,记录下多数据库配置的过程. 1.项目结构例如以下图: 当中mkhl和ulab分别相应两个数据库模块.同一时候也相应两个不同的功能模块. 2.整个Maven项目的配置文件:pom.xml <project xmlns="

Spring+MyBatis实现数据库读写分离方案

方案1通过MyBatis配置文件创建读写分离两个DataSource,每个SqlSessionFactoryBean对象的mapperLocations属性制定两个读写数据源的配置文件.将所有读的操作配置在读文件中,所有写的操作配置在写文件中. 优点:实现简单缺点:维护麻烦,需要对原有的xml文件进行重新修改,不支持多读,不易扩展实现方式 <bean id="abstractDataSource" abstract="true" class="com

Spring 访问各种数据库的配置

一.配置数据库 1.Sql server sqlserver.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver sqlserver.url=jdbc:sqlserver://localhost:1433;database=test;integratedSecurity=false sqlserver.username=sa sqlserver.password=123456 注释:database=test,表示访问的数据库

spring+mybatis 多数据库配置

这几天需要在ssm项目中配置多一个数据库,就去网上找多数据源的例子,发现都没有成功就自己试了下自己写的 原理: 创建两个数据源,两个seesionFactory,两个事务管理器,然后两个事务管理器分别配置aop,扫描不同的package(网上看到的都是使用注解方式,这里使用aop方式) 1.环境: Mybatis + springmvc +spring + druid + log4j 如果没使用druid  的话将将数据源的bean 修改回org.apache.commons.dbcp.Basi

【转】Spring, MyBatis 多数据源的配置和管理

同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其它还有平台下的游戏对应的数据库: 2)两个或多个数据库是master-slave的关系,比如有mysql搭建一个 master-master,其后又带有多个slave:或者采用MHA搭建的master-slave复制: 目前我所知道的 Spring 多数据源的搭建大概有两种方式,可以根据多数据源的情况进

Spring, MyBatis 多数据源的配置和管理

同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其它还有平台下的游戏对应的数据库: 2)两个或多个数据库是master-slave的关系,比如有mysql搭建一个 master-master,其后又带有多个slave:或者采用MHA搭建的master-slave复制: 目前我所知道的 Spring 多数据源的搭建大概有两种方式,可以根据多数据源的情况进

springMVC+spring+MyBatis(SSM)的简单配置

SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中: Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. SpringMVC分离了模型对象(Model).视图(View).控制器(Controller),这种分离让它们更容易进行定制. MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. 今天,就带领大家见证基础,进行

使用Eclipse,Maven简单搭建Spring+MyBatis

1.新建一个Maven Project 使用Eclipse自带的Maven插件,自动创建一个基于Maven的Web工程:(前提是开发环境一定要配置好Maven) 选择archetype为maven-archetype-webapp: 设置: GroupId:com.study(正式项目为公司网址倒写) ArtifactId:SMPro(项目名称,[模块名称]) 2.修复jsp页面报错 jsp页面报错,因为在构建路径中没有javax.servlet.http.HttpServlet,在pom.xm

Spring Boot的数据库之旅(一)

使用mybatis操作数据库 1.配置mybatis依赖和mysql依赖 <!-- MyBatis依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency&g