前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring配置多数据源——mybatis

spring配置多数据源——mybatis

作者头像
陈灬大灬海
发布2022-11-23 09:03:51
2390
发布2022-11-23 09:03:51
举报

这篇文章是配置mybatis多数据源文章,如果是hibernate的话也是没什么影响,配置都是差不多的。

在这家公司上班差不多一星期了,不小心点开配置文件一看这项目配置了两个数据源,蒙了。

之后上网查了下,自己写了个demo,恍然大悟

还是那句话,当你理解了才知道是怎么回事,动手写一遍才能体会到。

先说说配置吧。

这是配置单个数据源配置文件

代码语言:javascript
复制
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="123"></property>
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <!-- 配置跟Mybatis整合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

这是配置多个数据源配置文件

代码语言:javascript
复制
<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="123"></property>
        <property name="jdbcUrl"
            value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="123"></property>
        <property name="jdbcUrl"
            value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <bean id="multipleDataSource" class="com.bscc.datasource.MultipleDataSource">
        <property name="defaultTargetDataSource" ref="dataSource1" />
        <property name="targetDataSources">
            <map>
                <entry key="dataSource1" value-ref="dataSource1" />
                <entry key="dataSource2" value-ref="dataSource2" />
            </map>
        </property>
    </bean>
    <!-- 配置跟Mybatis整合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="multipleDataSource"></property>
    </bean>

其实一眼都可以看出来,就是多了个数据源,理解为备用,

代码语言:javascript
复制
defaultTargetDataSource表示默认的数据源。
代码语言:javascript
复制
targetDataSources是一个map集合,返回类型为DataSource,虽然没看,也没必要看。
代码语言:javascript
复制
MultipleDataSource是自己定义的一个类,实现方式请看下面代码
代码语言:javascript
复制
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class MultipleDataSource extends AbstractRoutingDataSource {
    private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();

    public static void setDataSourceKey(String dataSource) {
        dataSourceKey.set(dataSource);
    }

    @Override
    protected Object determineCurrentLookupKey() {
        String string = dataSourceKey.get();
        return string;
    }

}

 就是这么回事,继承abstract柔婷DataSource类即可,重写determinecurrentlookupkey抽象方法,是需要返回对应的数据源名称,也就是DataSource1,DataSource2罢了。

之所以需要定义一个threadlocal集合,是为了防止并发操作,兴许是瞎说,可以自行百度,只可意会

OK,其他操作时一模一样的,自己可以写一个测试类

代码语言:javascript
复制
@RequestMapping("listPerson")
    @ResponseBody
    public List<Person> listPerson() {
        List<Person> list = service.listPerson();
        return list;
    }
    
    @RequestMapping("listPerson2")
    @ResponseBody
    public List<Person> listPerson2() {
        MultipleDataSource.setDataSourceKey("dataSource2");
        List<Person> list = service.listPerson();
        return list;
    }

访问这两个controller,对应不同的数据库。 这么写是给写死了,不过想写成动态的话可以根据自己的业务策略来,也可以通过aop配置。 虽然写的不多,但写的都是操作方式,毕竟不难,照着操作一遍,就什么都懂了。OK

 小白一个,后面路还很长。勿忘初心

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档