宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

MyBatis的多數(shù)據(jù)源配置

管理 管理 編輯 刪除

前兩期,我們介紹了關于JdbcTemplate的多數(shù)據(jù)源配置以及Spring Data JPA的多數(shù)據(jù)源配置,接下來具體說說使用MyBatis時候的多數(shù)據(jù)源場景該如何配置。

添加多數(shù)據(jù)源的配置

先在Spring Boot的配置文件application.properties中設置兩個你要鏈接的數(shù)據(jù)庫配置,比如這樣:

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

說明與注意

  1. 多數(shù)據(jù)源配置的時候,與單數(shù)據(jù)源不同點在于spring.datasource之后多設置一個數(shù)據(jù)源名稱primary和secondary來區(qū)分不同的數(shù)據(jù)源配置,這個前綴將在后續(xù)初始化數(shù)據(jù)源的時候用到。
  2. 數(shù)據(jù)源連接配置2.x和1.x的配置項是有區(qū)別的:2.x使用spring.datasource.secondary.jdbc-url,而1.x版本使用spring.datasource.secondary.url。如果你在配置的時候發(fā)生了這個報錯java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.,那么就是這個配置項的問題。
  3. 可以看到,不論使用哪一種數(shù)據(jù)訪問框架,對于數(shù)據(jù)源的配置都是一樣的。

初始化數(shù)據(jù)源與MyBatis配置

完成多數(shù)據(jù)源的配置信息之后,就來創(chuàng)建個配置類來加載這些配置信息,初始化數(shù)據(jù)源,以及初始化每個數(shù)據(jù)源要用的MyBatis配置。

這里我們繼續(xù)將數(shù)據(jù)源與框架配置做拆分處理:

  1. 單獨建一個多數(shù)據(jù)源的配置類,比如下面這樣:
@Configuration
public class DataSourceConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

}

可以看到內容跟JdbcTemplate、Spring Data JPA的時候是一模一樣的。通過@ConfigurationProperties可以知道這兩個數(shù)據(jù)源分別加載了spring.datasource.primary.*spring.datasource.secondary.*的配置。@Primary注解指定了主數(shù)據(jù)源,就是當我們不特別指定哪個數(shù)據(jù)源的時候,就會使用這個Bean真正差異部分在下面的JPA配置上。

2. 分別創(chuàng)建兩個數(shù)據(jù)源的MyBatis配置。

Primary數(shù)據(jù)源的JPA配置:

@Configuration
@MapperScan(
        basePackages = "com.didispace.chapter39.p",
        sqlSessionFactoryRef = "sqlSessionFactoryPrimary",
        sqlSessionTemplateRef = "sqlSessionTemplatePrimary")
public class PrimaryConfig {

    private DataSource primaryDataSource;

    public PrimaryConfig(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
        this.primaryDataSource = primaryDataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(primaryDataSource);
        return bean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplatePrimary() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryPrimary());
    }

}

Secondary數(shù)據(jù)源的JPA配置:

@Configuration
@MapperScan(
        basePackages = "com.didispace.chapter39.s",
        sqlSessionFactoryRef = "sqlSessionFactorySecondary",
        sqlSessionTemplateRef = "sqlSessionTemplateSecondary")
public class SecondaryConfig {

    private DataSource secondaryDataSource;

    public SecondaryConfig(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        this.secondaryDataSource = secondaryDataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactorySecondary() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(secondaryDataSource);
        return bean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateSecondary() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactorySecondary());
    }

}

說明與注意

  1. 配置類上使用@MapperScan注解來指定當前數(shù)據(jù)源下定義的Entity和Mapper的包路徑;另外需要指定sqlSessionFactory和sqlSessionTemplate,這兩個具體實現(xiàn)在該配置類中類中初始化。
  2. 配置類的構造函數(shù)中,通過@Qualifier注解來指定具體要用哪個數(shù)據(jù)源,其名字對應在DataSourceConfiguration配置類中的數(shù)據(jù)源定義的函數(shù)名。
  3. 配置類中定義SqlSessionFactory和SqlSessionTemplate的實現(xiàn),注意具體使用的數(shù)據(jù)源正確(如果使用這里的演示代碼,只要第二步?jīng)]問題就不需要修改)。

根據(jù)上面Primary數(shù)據(jù)源的定義,在com.didispace.chapter39.p包下,定義Primary數(shù)據(jù)源要用的實體和數(shù)據(jù)訪問對象,比如下面這樣:

@Data
@NoArgsConstructor
public class UserPrimary {

    private Long id;

    private String name;
    private Integer age;

    public UserPrimary(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

public interface UserMapperPrimary {

    @Select("SELECT * FROM USER WHERE NAME = #{name}")
    UserPrimary findByName(@Param("name") String name);

    @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
    int insert(@Param("name") String name, @Param("age") Integer age);

    @Delete("DELETE FROM USER")
    int deleteAll();

}

根據(jù)上面Secondary數(shù)據(jù)源的定義,在com.didispace.chapter39.s包下,定義Secondary數(shù)據(jù)源要用的實體和數(shù)據(jù)訪問對象,比如下面這樣:

@Data
@NoArgsConstructor
public class UserSecondary {

    private Long id;

    private String name;
    private Integer age;

    public UserSecondary(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

public interface UserMapperSecondary {

    @Select("SELECT * FROM USER WHERE NAME = #{name}")
    UserSecondary findByName(@Param("name") String name);

    @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
    int insert(@Param("name") String name, @Param("age") Integer age);

    @Delete("DELETE FROM USER")
    int deleteAll();
}

測試驗證

完成了上面之后,我們就可以寫個測試類來嘗試一下上面的多數(shù)據(jù)源配置是否正確了,先來設計一下驗證思路:

  1. 往Primary數(shù)據(jù)源插入一條數(shù)據(jù)
  2. 從Primary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確就可以查詢到
  3. 從Secondary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確應該是查詢不到的
  4. 往Secondary數(shù)據(jù)源插入一條數(shù)據(jù)
  5. 從Primary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確應該是查詢不到的
  6. 從Secondary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確就可以查詢到

具體實現(xiàn)如下:

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class Chapter39ApplicationTests {

    @Autowired
    private UserMapperPrimary userMapperPrimary;
    @Autowired
    private UserMapperSecondary userMapperSecondary;

    @Before
    public void setUp() {
        // 清空測試表,保證每次結果一樣
        userMapperPrimary.deleteAll();
        userMapperSecondary.deleteAll();
    }

    @Test
    public void test() throws Exception {
        // 往Primary數(shù)據(jù)源插入一條數(shù)據(jù)
        userMapperPrimary.insert("AAA", 20);

        // 從Primary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確就可以查詢到
        UserPrimary userPrimary = userMapperPrimary.findByName("AAA");
        Assert.assertEquals(20, userPrimary.getAge().intValue());

        // 從Secondary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確應該是查詢不到的
        UserSecondary userSecondary = userMapperSecondary.findByName("AAA");
        Assert.assertNull(userSecondary);

        // 往Secondary數(shù)據(jù)源插入一條數(shù)據(jù)
        userMapperSecondary.insert("BBB", 20);

        // 從Primary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確應該是查詢不到的
        userPrimary = userMapperPrimary.findByName("BBB");
        Assert.assertNull(userPrimary);

        // 從Secondary數(shù)據(jù)源查詢剛才插入的數(shù)據(jù),配置正確就可以查詢到
        userSecondary = userMapperSecondary.findByName("BBB");
        Assert.assertEquals(20, userSecondary.getAge().intValue());
    }

}

注:本文轉載自“程序猿DD”,如有侵權,請聯(lián)系刪除!

請登錄后查看

哈哈哈醬 最后編輯于2024-12-23 17:18:58

快捷回復
回復
回復
回復({{post_count}}) {{!is_user ? '我的回復' :'全部回復'}}
排序 默認正序 回復倒序 點贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復' : '回復'}}
刪除
回復
回復

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復' : '回復'}}
刪除
回復
回復
查看更多
打賞
已打賞¥{{reward_price}}
1110
{{like_count}}
{{collect_count}}
添加回復 ({{post_count}})

相關推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復
回復
問題:
問題自動獲取的帖子內容,不準確時需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內的數(shù)值
打賞成功
¥{{price}}
完成 確認打賞

微信登錄/注冊

切換手機號登錄

{{ bind_phone ? '綁定手機' : '手機登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服