亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

MyBatis多數據源的兩種配置方式

2024-07-14 08:43:07
字體:
來源:轉載
供稿:網友

前言

同一個項目有時會涉及到多個數據庫,也就是多數據源。多數據源又可以分為兩種情況:

1)兩個或多個數據庫沒有相關性,各自獨立,其實這種可以作為兩個項目來開發。比如在游戲開發中一個數據庫是平臺數據庫,其它還有平臺下的游戲對應的數據庫;

2)兩個或多個數據庫是master-slave的關系,比如有mysql搭建一個 master-master,其后又帶有多個slave;或者采用MHA搭建的master-slave復制;

MyBatis多數據源的配置主要有兩種方式:

  • 通過@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多數據源演示 */@SpringBootApplication(exclude = {SpringBootConfiguration.class})@Configuration@MapperScan(annotationClass = Mapper.class, basePackageClasses = MyBatisApp.class,  sqlSessionFactoryRef = "sqlSessionFactory")public class MyBatisApp implements ApplicationListener<ApplicationReadyEvent> { /**  * SecondaryMapper配置  * /@MapperScan 注解一次只能添加一個,所以需要單獨再加一個配置類  * 自定義@MapperScan會替換MyBatis自動添加的默認@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); } /**  * 主數據源  * <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");  }}; } /**  * 副數據源  *  * @return .  */ @Bean public DataSource dataSourceSecond() {  return new HikariDataSource() {{   setJdbcUrl("jdbc:mysql://localhost/two?useUnicode=true&characterEncoding=utf8");   setUsername("root");   setPassword("root");  }}; } /**  * 主SqlSessionFactory。使用主數據源。自定義SqlSessionFactory后,MyBatis就不自動添加SqlSessionFactory了,所以必須有  *  * @return .  * @throws Exception .  */ @Bean public SqlSessionFactory sqlSessionFactory() throws Exception {  return new SqlSessionFactoryBean() {{   setDataSource(dataSource);  }}.getObject(); } /**  * 副SqlSessionFactory。使用副數據源  *  * @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注解,用于標識使用的數據源  */ @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}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成人国产在线观看| 亚洲日韩欧美视频一区| 国产精品视频中文字幕91| 久久人人97超碰精品888| 欧美国产中文字幕| 国产精品www网站| 成人性生交xxxxx网站| 17婷婷久久www| 91极品女神在线| 38少妇精品导航| 国产专区精品视频| 久久国产精品影视| 国产在线一区二区三区| 国产v综合ⅴ日韩v欧美大片| 国产精品一区av| 久久久久久亚洲精品中文字幕| 久久精品国产欧美亚洲人人爽| 精品视频在线播放色网色视频| 一区二区三区国产在线观看| 精品久久国产精品| 中国china体内裑精亚洲片| 亚洲自拍另类欧美丝袜| 97成人在线视频| 国产亚洲成av人片在线观看桃| 国产欧美日韩最新| 欧美电影免费观看高清| 欧美精品18videosex性欧美| 国产va免费精品高清在线| 国产亚洲欧洲在线| 青青草精品毛片| 国产精品久久久久久中文字| 久久夜色精品国产| 91精品91久久久久久| 亚洲国产精品99久久| 亚洲国产精品va| 91精品视频观看| 国产精品自拍网| 欧美日韩国产丝袜美女| 欧美精品中文字幕一区| 九九热精品视频在线播放| 国产69精品久久久久久| 欧美成aaa人片在线观看蜜臀| 伊是香蕉大人久久| 热99精品只有里视频精品| 欧美在线日韩在线| 国产a级全部精品| 久久精品视频网站| 欧美激情视频在线免费观看 欧美视频免费一| 欧美成人午夜免费视在线看片| 成人欧美一区二区三区在线湿哒哒| 日韩精品极品毛片系列视频| 热久久免费视频精品| 国产精品av在线播放| 中文字幕av一区二区| 欧美视频中文字幕在线| 91精品国产乱码久久久久久蜜臀| 成人动漫网站在线观看| 亚洲色无码播放| 国内精品久久久久影院优| 精品国产91乱高清在线观看| 日韩精品一区二区三区第95| 成人免费看片视频| 国产精品啪视频| 色妞一区二区三区| 97久久超碰福利国产精品…| 国产亚洲精品久久久久久| 日韩欧美在线观看视频| 欧美日韩福利在线观看| 国产精品爱啪在线线免费观看| 成人夜晚看av| 91精品啪aⅴ在线观看国产| 国产精品第七十二页| 欧美高清理论片| 久久男人的天堂| 欧美第一黄网免费网站| 亚洲福利视频专区| 欧美老女人性视频| 国产视频精品在线| 精品久久久久久久久国产字幕| 亚洲精品久久视频| 波霸ol色综合久久| 国产精品久久久久久久久粉嫩av| 91香蕉电影院| 北条麻妃99精品青青久久| 国产主播喷水一区二区| www.久久撸.com| 91av在线播放视频| 成人黄色在线免费| 亚洲国语精品自产拍在线观看| 亚洲色无码播放| 久久久久久久一| 色综合天天狠天天透天天伊人| 国产91在线播放精品91| 国产精品一区二区在线| 国产精品美女999| 美女啪啪无遮挡免费久久网站| 久久精品青青大伊人av| 亚洲精选一区二区| 欧美在线视频观看免费网站| 国产精品视频永久免费播放| 91视频88av| 亚洲japanese制服美女| 欧美成人激情图片网| 国产精品欧美日韩| 中文字幕欧美在线| 久久久久久久999精品视频| 日韩免费高清在线观看| 国产亚洲欧洲高清一区| 亚洲另类欧美自拍| 亚洲男人天堂网站| 欧美大片在线看免费观看| 久久精品国产99国产精品澳门| 欧美黑人国产人伦爽爽爽| 中文字幕欧美精品在线| 国产精品久久久久久久app| 国产精品美女久久久免费| 国模私拍视频一区| 亚洲国产美女久久久久| 久久伊人免费视频| 97超碰色婷婷| 久久影视电视剧凤归四时歌| 成人中文字幕+乱码+中文字幕| 久久人人爽人人爽人人片av高清| 久久国产加勒比精品无码| 亚洲国产精品成人va在线观看| 一区二区三区回区在观看免费视频| 北条麻妃在线一区二区| 日本国产一区二区三区| 久久综合五月天| 久久影视电视剧免费网站| 亚洲а∨天堂久久精品喷水| 国模gogo一区二区大胆私拍| 日韩在线国产精品| 热99在线视频| 久久精视频免费在线久久完整在线看| 日本精品在线视频| 91欧美精品午夜性色福利在线| 91在线观看免费高清完整版在线观看| 欧美一级电影久久| 国产视频久久久久久久| 亚洲欧美日韩第一区| 日韩毛片在线看| 91精品久久久久久久| 国产精品视频成人| 色婷婷综合成人av| 欧美成人三级视频网站| 亚洲一区二区三区乱码aⅴ| 成人激情视频在线播放| 亚洲自拍在线观看| 91久热免费在线视频| 美女福利精品视频| 国产一区二区在线免费视频| 久久激情视频久久| 欧美国产日韩一区| 国语自产在线不卡| 午夜精品久久久久久99热软件| 久久久这里只有精品视频| 尤物yw午夜国产精品视频| 国产精品18久久久久久麻辣| 中日韩美女免费视频网址在线观看| 欧美性受xxx| 国产美女91呻吟求| 国产精品日日做人人爱| 色悠悠久久88|