国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發(fā) > Java > 正文

MyBatis多數(shù)據(jù)源的兩種配置方式

2024-07-14 08:43:07
字體:
供稿:網(wǎng)友

前言

同一個(gè)項(xiàng)目有時(shí)會涉及到多個(gè)數(shù)據(jù)庫,也就是多數(shù)據(jù)源。多數(shù)據(jù)源又可以分為兩種情況:

1)兩個(gè)或多個(gè)數(shù)據(jù)庫沒有相關(guān)性,各自獨(dú)立,其實(shí)這種可以作為兩個(gè)項(xiàng)目來開發(fā)。比如在游戲開發(fā)中一個(gè)數(shù)據(jù)庫是平臺數(shù)據(jù)庫,其它還有平臺下的游戲?qū)?yīng)的數(shù)據(jù)庫;

2)兩個(gè)或多個(gè)數(shù)據(jù)庫是master-slave的關(guān)系,比如有mysql搭建一個(gè) master-master,其后又帶有多個(gè)slave;或者采用MHA搭建的master-slave復(fù)制;

MyBatis多數(shù)據(jù)源的配置主要有兩種方式:

  • 通過@MapperScan注解,對不同包下的Mapper使用不同的sqlSessionFactory
  • 通過@MapperScan注解加自定義注解,對使用不同注解的Mapper使用不同的sqlSessionFactory

第二種配置相對靈活,示例如下:

package bj;import ch.qos.logback.classic.Level;import ch.qos.logback.classic.Logger;import com.zaxxer.hikari.HikariDataSource;import io.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.WebApplicationType;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.event.ApplicationReadyEvent;import org.springframework.context.ApplicationListener;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.jdbc.core.JdbcTemplate;import javax.annotation.Resource;import javax.sql.DataSource;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.util.List;import java.util.Map;/** * Created by BaiJiFeiLong@gmail.com at 2018/12/6 下午9:29 * <p> * MyBatis多數(shù)據(jù)源演示 */@SpringBootApplication(exclude = {SpringBootConfiguration.class})@Configuration@MapperScan(annotationClass = Mapper.class, basePackageClasses = MyBatisApp.class,  sqlSessionFactoryRef = "sqlSessionFactory")public class MyBatisApp implements ApplicationListener<ApplicationReadyEvent> { /**  * SecondaryMapper配置  * /@MapperScan 注解一次只能添加一個(gè),所以需要單獨(dú)再加一個(gè)配置類  * 自定義@MapperScan會替換MyBatis自動添加的默認(rèn)@MapperScan。所以主@MapperScan也必須顯式添加  */ @Configuration @MapperScan(annotationClass = SecondaryMapper.class, basePackageClasses = MyBatisApp.class,   sqlSessionFactoryRef = "sqlSessionFactorySecond") static class SecondaryMapperConfiguration { } public static void main(String[] args) {  new SpringApplication(MyBatisApp.class) {{   setWebApplicationType(WebApplicationType.NONE);  }}.run(args); } @Resource private DataSource dataSource; @Resource private DataSource dataSourceSecond; @Resource private JdbcTemplate jdbcTemplate; @Resource private UserMapper userMapper; @Resource private SecondaryUserMapper secondaryUserMapper; private void initLogger() {  ((Logger) LoggerFactory.getLogger(MyBatisApp.class)).setLevel(Level.DEBUG);  ((Logger) LoggerFactory.getLogger(JdbcTemplate.class)).setLevel(Level.DEBUG); } private void initDatabase() {  String oldDatabase = jdbcTemplate.queryForObject("SELECT DATABASE()", String.class);  jdbcTemplate.execute("DROP SCHEMA IF EXISTS one");  jdbcTemplate.execute("CREATE SCHEMA one");  jdbcTemplate.execute("USE one");  jdbcTemplate.execute("CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) CHARSET 'utf8')");  jdbcTemplate.execute("INSERT INTO user(name) VALUES ('人民的兒子')");  jdbcTemplate.execute("INSERT INTO user(name) VALUES ('人民的孫子')");  jdbcTemplate.execute("INSERT INTO user(name) VALUES ('人民的曾孫子')");  jdbcTemplate.execute("DROP SCHEMA IF EXISTS two");  jdbcTemplate.execute("CREATE SCHEMA two");  jdbcTemplate.execute("USE two");  jdbcTemplate.execute("CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) CHARSET 'utf8')");  jdbcTemplate.execute("INSERT INTO user(name) VALUES ('人民的爹')");  jdbcTemplate.execute("INSERT INTO user(name) VALUES ('人民的爺')");  jdbcTemplate.execute("INSERT INTO user(name) VALUES ('人民的太爺')");  jdbcTemplate.execute("INSERT INTO user(name) VALUES ('人民的老太爺')");  jdbcTemplate.execute("USE " + oldDatabase); } @Override public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {  initLogger();  initDatabase();  System.out.println("Users:");  userMapper.selectAll().forEach(System.out::println);  System.out.println("Secondary users:");  secondaryUserMapper.selectAll().forEach(System.out::println); } /**  * 主數(shù)據(jù)源  * <p>  * 如果不添加@Primary注解, MyBatis可以工作,但是JdbcTemplate無法注入  *  * @return .  */ @Primary @Bean public DataSource dataSource() {  return new HikariDataSource() {{   setJdbcUrl("jdbc:mysql://localhost/one?useUnicode=true&characterEncoding=utf8");   setUsername("root");   setPassword("root");  }}; } /**  * 副數(shù)據(jù)源  *  * @return .  */ @Bean public DataSource dataSourceSecond() {  return new HikariDataSource() {{   setJdbcUrl("jdbc:mysql://localhost/two?useUnicode=true&characterEncoding=utf8");   setUsername("root");   setPassword("root");  }}; } /**  * 主SqlSessionFactory。使用主數(shù)據(jù)源。自定義SqlSessionFactory后,MyBatis就不自動添加SqlSessionFactory了,所以必須有  *  * @return .  * @throws Exception .  */ @Bean public SqlSessionFactory sqlSessionFactory() throws Exception {  return new SqlSessionFactoryBean() {{   setDataSource(dataSource);  }}.getObject(); } /**  * 副SqlSessionFactory。使用副數(shù)據(jù)源  *  * @return .  * @throws Exception .  */ @Bean public SqlSessionFactory sqlSessionFactorySecond() throws Exception {  return new SqlSessionFactoryBean() {{   setDataSource(dataSourceSecond);  }}.getObject(); } @Mapper interface UserMapper {  @Select("SELECT * FROM user")  List<Map<String, Object>> selectAll(); } @SecondaryMapper interface SecondaryUserMapper {  @Select("SELECT * FROM user")  List<Map<String, Object>> selectAll(); } /**  * 自定義Mapper注解,用于標(biāo)識使用的數(shù)據(jù)源  */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface SecondaryMapper { }}

控制臺輸出:

  .   ____          _            __ _ _
 /// / ___'_ __ _ _(_)_ __  __ _ / / / /
( ( )/___ | '_ | '_| | '_ // _` | / / / /
 ///  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_/__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.0.RELEASE)

2018-12-07 11:49:02.596  INFO 5154 --- [           main] bj.MyBatisApp                            : Starting MyBatisApp on MacBook-Air-2.local with PID 5154 (/Users/yuchao/temp/java/hellomaven/target/classes started by yuchao in /Users/yuchao/temp/java/hellomaven)
2018-12-07 11:49:02.633  INFO 5154 --- [           main] bj.MyBatisApp                            : No active profile set, falling back to default profiles: default
2018-12-07 11:49:05.341  INFO 5154 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2018-12-07 11:49:05.499  INFO 5154 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2018-12-07 11:49:05.547  INFO 5154 --- [           main] org.quartz.impl.StdSchedulerFactory      : Using default implementation for ThreadExecutor
2018-12-07 11:49:05.569  INFO 5154 --- [           main] org.quartz.core.SchedulerSignalerImpl    : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
2018-12-07 11:49:05.569  INFO 5154 --- [           main] org.quartz.core.QuartzScheduler          : Quartz Scheduler v.2.3.0 created.
2018-12-07 11:49:05.570  INFO 5154 --- [           main] org.quartz.simpl.RAMJobStore             : RAMJobStore initialized.
2018-12-07 11:49:05.571  INFO 5154 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler meta-data: Quartz Scheduler (v2.3.0) 'quartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2018-12-07 11:49:05.571  INFO 5154 --- [           main] org.quartz.impl.StdSchedulerFactory      : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance.
2018-12-07 11:49:05.571  INFO 5154 --- [           main] org.quartz.impl.StdSchedulerFactory      : Quartz scheduler version: 2.3.0
2018-12-07 11:49:05.571  INFO 5154 --- [           main] org.quartz.core.QuartzScheduler          : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@769a58e5
2018-12-07 11:49:05.780  WARN 5154 --- [           main] reactor.netty.tcp.TcpResources           : [http] resources will use the default LoopResources: DefaultLoopResources {prefix=reactor-http, daemon=true, selectCount=4, workerCount=4}
2018-12-07 11:49:05.780  WARN 5154 --- [           main] reactor.netty.tcp.TcpResources           : [http] resources will use the default ConnectionProvider: PooledConnectionProvider {name=http, poolFactory=reactor.netty.resources.ConnectionProvider$$Lambda$284/1788545647@10667848}
2018-12-07 11:49:06.061  INFO 5154 --- [           main] o.s.s.quartz.SchedulerFactoryBean        : Starting Quartz Scheduler now
2018-12-07 11:49:06.062  INFO 5154 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler quartzScheduler_$_NON_CLUSTERED started.
2018-12-07 11:49:06.079  INFO 5154 --- [           main] bj.MyBatisApp                            : Started MyBatisApp in 4.645 seconds (JVM running for 6.354)
2018-12-07 11:49:06.084 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL query [SELECT DATABASE()]
2018-12-07 11:49:06.105 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [DROP SCHEMA IF EXISTS one]
2018-12-07 11:49:06.115 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [CREATE SCHEMA one]
2018-12-07 11:49:06.117 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [USE one]
2018-12-07 11:49:06.119 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) CHARSET 'utf8')]
2018-12-07 11:49:06.153 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO user(name) VALUES ('人民的兒子')]
2018-12-07 11:49:06.157 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO user(name) VALUES ('人民的孫子')]
2018-12-07 11:49:06.161 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO user(name) VALUES ('人民的曾孫子')]
2018-12-07 11:49:06.164 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [DROP SCHEMA IF EXISTS two]
2018-12-07 11:49:06.174 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [CREATE SCHEMA two]
2018-12-07 11:49:06.176 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [USE two]
2018-12-07 11:49:06.178 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) CHARSET 'utf8')]
2018-12-07 11:49:06.226 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO user(name) VALUES ('人民的爹')]
2018-12-07 11:49:06.231 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO user(name) VALUES ('人民的爺')]
2018-12-07 11:49:06.235 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO user(name) VALUES ('人民的太爺')]
2018-12-07 11:49:06.243 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO user(name) VALUES ('人民的老太爺')]
2018-12-07 11:49:06.246 DEBUG 5154 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [USE one]
Users:
2018-12-07 11:49:06.271 DEBUG 5154 --- [           main] bj.MyBatisApp$UserMapper.selectAll       : ==>  Preparing: SELECT * FROM user
2018-12-07 11:49:06.297 DEBUG 5154 --- [           main] bj.MyBatisApp$UserMapper.selectAll       : ==> Parameters:
2018-12-07 11:49:06.314 DEBUG 5154 --- [           main] bj.MyBatisApp$UserMapper.selectAll       : <==      Total: 3
{name=人民的兒子, id=1}
{name=人民的孫子, id=2}
{name=人民的曾孫子, id=3}
Secondary users:
2018-12-07 11:49:06.318  INFO 5154 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Starting...
2018-12-07 11:49:06.324  INFO 5154 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Start completed.
2018-12-07 11:49:06.325 DEBUG 5154 --- [           main] b.M.selectAll                            : ==>  Preparing: SELECT * FROM user
2018-12-07 11:49:06.325 DEBUG 5154 --- [           main] b.M.selectAll                            : ==> Parameters:
2018-12-07 11:49:06.328 DEBUG 5154 --- [           main] b.M.selectAll                            : <==      Total: 4
{name=人民的爹, id=1}
{name=人民的爺, id=2}
{name=人民的太爺, id=3}
{name=人民的老太爺, id=4}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
奇米影视狠狠狠| 国产精品白浆流出视频| 在线色视频网| 在线观看视频污| 青青艹在线视频| 福利资源在线久| 中文字幕在线影视资源| 国产精美视频| 亚洲精品在线播放视频| 可以免费看污视频的网站| **三级三级97片毛片| 91在线视频免费看| 成人超碰在线| 国产日韩欧美第一页| 亚洲国产成人综合| 最好2018中文免费视频| www.操操操| 91精选福利| 日本最新在线视频| 免费a在线观看| 伊人网在线免费观看| 国产卡一卡二卡三| 欧美专区日韩| 三级小说一区| 99re热视频在线| 免费看的av| √8天堂资源地址中文在线| 欧美日韩国产亚洲沙发| 99re6在线视频精品免费| 黄色国产在线| 免费高清av| a级片国产精品自在拍在线播放| 九九热在线视频观看| 亚洲激情丁香| 亚洲夜夜综合| 亚洲va国产日韩欧美精品色婷婷| 中文字幕有码在线视频| 国产原创av在线| 久久香蕉av| 国产在线高清理伦片a| 久久国产精品久久久久久小说| 在线视频三级| 精品福利视频导航大全| 国产精品扒开做爽爽爽的视频| 国产九色视频| 国产偷窥老熟盗摄视频| 国产精品自产拍在线网站| 久久香蕉av| 午夜av在线免费观看| 中文字幕在线观看av| 国产经典av| 精品一区二区三区在线成人| 在线色视频网| 成av人免费青青久| 中文字幕在线免费| 91麻豆福利| www.毛片| √天堂中文在线| 国产欧美在线观看视频| 在线三级av| 国产在线播放av| 国产福利在线观看| 日本欧洲一区| 国产污污在线观看| 阿v免费在线观看| 国产无套粉嫩白浆在线2022年| 国产三区视频在线观看| 在线免费日韩| 1区2区3区在线| 一级黄色av| 国产乱子视频| 亚洲综合在线不卡| 国产一二三四| 国产黄色免费网站| 激情网站在线| gogo高清在线播放免费| 国产一卡2卡3卡4卡网站免费 | 伊人av免费在线观看| 超碰免费在线| 亚洲字幕成人中文在线观看| 国产一区二区三区美女秒播 | 亚洲精品影院在线| 国产免费麻豆视频| 伊人影院蕉久影院在线播放| 最新中文字幕av专区| 四虎中文字幕| 精品国产免费第一区二区| 午夜视频在线观看网站午夜视频在线 | 人人澡人人爽| 2019中文字幕视频| 18加网站在线| 国产精品自产拍在线观看2019 | 国产日韩欧美精品一区二区三区| 日本国产在线| a级片国产精品自在拍在线播放| 2019中文字幕在线电影免费| 国产一区精品| 国产网友自拍视频导航网站在线观看| 久久精品视频观看| 成年人在线观看| 久艹在线视频| 国产精品天堂| 国产天堂在线| 国产传媒在线播放| av高清在线| www.色婷婷| 国产在线视频网站| 麻豆网站在线| 国产农村一级特黄α**毛片| 国产乱子伦三级在线播放| 国产尤物一区二区三区| 国产另类图片| 国产对白在线| 日本亚洲精品| 国产免费a∨片在线观看不卡| 日韩国产成人| 成人福利视频导航| 国产h色视频在线观看| 亚洲精品天堂在线观看| 老司机精品视频一区二区| 91xxx在线观看| 精品一区二区三区在线成人| av免费在线观看网站| 免费看成年人视频在线观看| 国产一级片网站| 日本在线视频www鲁啊鲁| 国产久草在线| av首页在线| 国产丝袜精品丝袜| av资源网站在线观看| 国产一级在线| 日本免费不卡| 精品推荐蜜桃传媒| 国产真实伦在线观看| 99热免费观看| 二人午夜免费观看在线视频| 国产高清在线| 就爱干草视频| 在线国产一级| 国产私人影院| 国产在线高潮| 超碰在线人人| 波多野结衣久久高清免费| 国产成人福利| 国产日本在线| 狠狠操狠狠色| 激情综合网五月激情| av在线1区2区| av亚洲男人天堂| 在线色视频网| 在线免费观看你懂的| 国产精品福利视频一区二区三区| 欧美性猛交p30| 午夜在线不卡| xxxxx中文字幕| www.九九热.com| 天天插天天干| www.成人.com| 久久av少妇| 国产另类图片| 午夜国产在线| 国产黄大片在线观看画质优化| 国产小视频在线高清播放| 国产亚洲依依| 97国产视频| 亚洲综合在线不卡| 青青青手机在线视频观看| 中文字幕2020第一页| 国产成在线观看免费视频| 国产黄色av免费看| 亚洲最新永久在线观看| 日本高清不卡中文字幕| 久久香蕉一区| 国产视频福利| 制服丝袜中文字幕在线观看| 亚洲夜夜综合| 成人无遮挡免费网站视频在线观看| 丁香在线视频| 国产91在线视频蝌蚪| 亚洲欧美综合乱码精品成人网| 欧美亚洲天堂| 国产系列电影在线播放网址| 国产欧美在线观看视频| 97影院理论午夜| 老师我好爽再深一点的视频| 国产麻豆视频网站| 精品国产免费观看一区| 免费看av大片| 国产超级va在线视频| 欧美亚洲另类在线观看| 午夜伦全在线观看| 亚洲日本久久久午夜精品| 丁香在线视频| 亚洲an天堂an在线观看| 国产视频三级在线观看播放| 青青国产在线| 一本久久精品| 中文字幕在线永久在线视频| 天天插天天射| 91精品国产高久久久久久五月天|