SpringBoot—JPA和Mybatis多数据源配置和使用

news2024/11/25 2:41:54

JPA多数据源配置

  1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.9</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.liwang</groupId>
    <artifactId>jpamulti</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>jpamulti</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  1. application.properties
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.jdbcUrl=jdbc:mysql:///test

spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.jdbcUrl=jdbc:mysql:///test2

# 使用的数据库类型
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
# 显示sql
spring.jpa.show-sql=true
# 当在java实体类中新增了一个字段,在应用重新运行时,会将字段添加到数据库表中的新列,但不会移除先前存在的列或约束
spring.jpa.hibernate.ddl-auto=update
# 配置数据库方言,默认创建数据库表使用的是myisam引擎,指定方言是为了使用innodb引擎
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
  1. 配置数据源DataSourceConfig,主要标识dsOne 为**@Primary**
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.one")
    @Primary
    DataSource dsOne() {
        return new HikariDataSource();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.two")
    DataSource dsTwo() {
        return new HikariDataSource();
    }
}
  1. 配置JpaConfigOne,主要配置好entityManagerFactoryRef 和transactionManagerRef
@Configuration
@EnableJpaRepositories(basePackages = "com.liwang.jpamulti.dao1", entityManagerFactoryRef = "localContainerEntityManagerFactoryBean1",
                        transactionManagerRef = "platformTransactionManager1")
public class JpaConfigOne {

    @Autowired
    @Qualifier("dsOne")
    DataSource ds;

    @Autowired
    JpaProperties jpaProperties;

    @Bean
    @Primary
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean1(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(ds)
                .packages("com.liwang.jpamulti.model")
                .properties(jpaProperties.getProperties())
                .persistenceUnit("pu1")
                .build();
    }

    @Bean
    PlatformTransactionManager platformTransactionManager1(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(localContainerEntityManagerFactoryBean1(builder).getObject());
    }
}
  1. 配置JpaConfigTwo
@Configuration
@EnableJpaRepositories(basePackages = "com.liwang.jpamulti.dao2", entityManagerFactoryRef = "localContainerEntityManagerFactoryBean2",
                        transactionManagerRef = "platformTransactionManager2")
public class JpaConfigTwo {

    @Autowired
    @Qualifier("dsTwo")
    DataSource ds;

    @Autowired
    JpaProperties jpaProperties;

    @Bean
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean2(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(ds)
                .packages("com.liwang.jpamulti.model")
                .properties(jpaProperties.getProperties())
                .persistenceUnit("pu2")
                .build();
    }

    @Bean
    PlatformTransactionManager platformTransactionManager2(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(localContainerEntityManagerFactoryBean2(builder).getObject());
    }
}
  1. 新建实体类User
@Entity(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  1. 新建UserDao1和UserDao2
public interface UserDao1 extends JpaRepository<User, Integer> {

}

public interface UserDao2 extends JpaRepository<User, Integer> {

}
  1. 测试
@SpringBootTest
class JpamultiApplicationTests {

    @Test
    void contextLoads() {
    }

    @Autowired
    UserDao1 userDao1;

    @Autowired
    UserDao2 userDao2;

    @Test
    void test01() {
        System.out.println("userDao1.findAll() = " + userDao1.findAll());
        System.out.println("userDao2.findAll() = " + userDao2.findAll());
    }

}

在这里插入图片描述

Mybatis多数据源配置

  1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.liwang</groupId>
    <artifactId>mybatismulti</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatismulti</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


  1. application.properties
spring.datasource.one.jdbcUrl=jdbc:mysql:///test?serverTimeZone=Asia/shanghai&userUnicode=true&character=UTF-8
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.two.jdbcUrl=jdbc:mysql:///test2?serverTimeZone=Asia/shanghai&userUnicode=true&character=UTF-8
spring.datasource.two.username=root
spring.datasource.two.password=root


  1. 配置数据源DataSourceConfig
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DataSource dsOne() {
        return new HikariDataSource();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo() {
        return new HikariDataSource();
    }
}
  1. 配置MybatisConfigOne
@Configuration
@MapperScan(basePackages = "com.liwang.mybatismulti.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1",
        sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MybatisConfigOne {

    @Autowired
    @Qualifier(value = "dsOne")
    DataSource ds;

    @Bean
    SqlSessionFactory sqlSessionFactory1() {
        SqlSessionFactory sqlSessionFactory = null;
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);
        try {
            sqlSessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSessionFactory;
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate1() {
        return new SqlSessionTemplate(sqlSessionFactory1());
    }
}
  1. 配置MybatisConfigTwo
@Configuration
@MapperScan(basePackages = "com.liwang.mybatismulti.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2",
        sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MybatisConfigTwo {

    @Autowired
    @Qualifier(value = "dsTwo")
    DataSource ds;

    @Bean
    SqlSessionFactory sqlSessionFactory2() {
        SqlSessionFactory sqlSessionFactory = null;
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);
        try {
            sqlSessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSessionFactory;
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate2() {
        return new SqlSessionTemplate(sqlSessionFactory2());
    }
}
  1. 新建实体类User
public class User {
    private Integer id;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  1. 新建UserMapper1 和 UserMapper1.xml
@Mapper
public interface UserMapper1 {
    List<User> getAllUser();
}
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.liwang.mybatismulti.mapper1.UserMapper1">

    <select id="getAllUser" resultType="com.liwang.mybatismulti.model.User">
        select * from user
    </select>


</mapper>

  1. 新建UserMapper2 和 UserMapper2.xml
@Mapper
public interface UserMapper2 {
    List<User> getAllUser();
}
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.liwang.mybatismulti.mapper2.UserMapper2">

    <select id="getAllUser" resultType="com.liwang.mybatismulti.model.User">
        select * from user
    </select>


</mapper>

  1. 测试
@SpringBootTest
class MybatismultiApplicationTests {

    @Autowired
    UserMapper1 userMapper1;

    @Autowired
    UserMapper2 userMapper2;

    @Test
    void contextLoads() {
        System.out.println(userMapper1.getAllUser());
        System.out.println(userMapper2.getAllUser());
    }

}

在这里插入图片描述

可以看看我的个人博客:
网站:https://www.fuzm.wang / https://liwangc.gitee.io
—————————————————————————

作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VM 增加硬盘

1、使用“fdisk -l”的命令查看当前系统的分区&#xff08;如果刚才设置VMware--“设置”的时候运行了系统&#xff0c;则会出现下图情况&#xff1a;没有识别到新的磁盘即sdb&#xff09;&#xff0c;解决办法&#xff0c;重启虚拟机&#xff1a;shutdown -r now 2、 输入 # …

【Python_Selenium学习笔记(八)】基于Selenium模块实现滑块验证码破解

基于Selenium模块实现滑块验证码破解 前言 有些网站页面会在 访问时进行滑块验证&#xff0c;针对此问题&#xff0c;此篇文章中会介绍如何基于 Selenium 模块实现滑块验证码的破解 &#xff0c;并以模拟登录豆瓣网&#xff0c;破解其滑块验证码 为例进行讲解。 正文 1、滑…

需要买apple pencil吗?ipad第三方电容笔了解下

第一款ipad早在诞生于十年前&#xff0c;并被作为一款平板电脑使用&#xff0c;其性能十分出色。随着IPAD的不断更新换代&#xff0c;IPAD已经被越来越多的人接受了。其中&#xff0c;iPad的附属配件起到了很大的作用&#xff0c;就像今天要介绍的电容笔&#xff0c;它是我们进…

Python接外包养无敌可爱的她,每天都随便花~

人生苦短&#xff0c;我用python 女友好不容易放假&#xff0c;她带着我花花花的样子真的很迷人~ python 安装包资料:点击此处跳转文末名片获取 不为什么 我的女友我来宠&#xff01; 作为一个程序员&#xff0c;要有会用自己的技术创造价值的自觉~ 今天来给大家展示一下用py…

第七章 法律行为与法律意识

目录 第一节 法律行为 一、 法律行为的含义与特征二、 法律行为的结构 &#xff08;一&#xff09;法律行为的内在方面 动机目的认知能力 &#xff08;二&#xff09;法律行为的外在方面 行动&#xff08;行为&#xff09;手段结果 三、法律行为的分类 第二节 法律意识 一、法…

【WebRTC技术专题】大势所趋,迈向认识 WebRTC 的第一步(2)

每日一句 人生的挑战&#xff0c;无处不在&#xff0c;满怀信心&#xff0c;轻装上路&#xff0c;明天永远是充满希望的战场。 承接上文 承接上文的内容介绍完相关WebRTC技术的概念和发展历程后&#xff0c;开始初步摸索一下相关WebRTC技术的功能和原理。&#x1f33a;【WebRTC…

【科普】一篇搞定发paper基本概念:SCI、EI、会议/期刊、分区、CCF、DOI、IF、h-index、及cs/ee常见会议:CVPR、GlobeCOM等

文章目录基础概念SCI、EI、CPCI&#xff08;ISTP&#xff09;论文类型&#xff1a;Journal、magazine、transaction、letter、 proceedingsDOI&#xff08;数字对象标识Digital Object Identifier&#xff09;IF 期刊影响因子(Impact Factor&#xff0c;IF)H指数 (h-index/h-fa…

时间序列 | MATLAB实现CNN-LSTM-Attention时间序列预测

时间序列 | MATLAB实现CNN-LSTM-Attention时间序列预测 目录时间序列 | MATLAB实现CNN-LSTM-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现CNN-LSTM-Attention时间序列预测&#xff0c;CNN-LSTM结合注意力机制时间序列预测。 模…

使用wait监听tomcat服务启动

文章的wait脚本素材会放在末尾 执行docker-compose.yml文件之后就有mysql的主服务器&#xff0c;还有从服务器&#xff0c;还有tomcat服务&#xff0c;在tomcat中部署一个crm项目&#xff0c;tomcat服务中我们添加了启动顺序&#xff0c; # 启动顺序 depends_on: - mysql…

低压接地系统:TN-C 、TN-S、TN-C-S、TT、IT

电力系统的接地直接关系到用户的人身和财产安全,以及电气设备和电子设备的正常运行。如何针对实际情况选择合适的接地系统,确保配电系统及电气设备的安全使用,是电气设计人员面临的首要问题。 根据 国际电工委员会(IEC)规定的各种保护接地方式的术语概念,低压配电系统按…

如何利用开源思想开发一个SEO友好型网站

当你对一个网站进行 SEO 优化的时候&#xff0c;不要期望你的努力能立即得到回报。耐心等待并更正内容营销策略&#xff0c;最终会发现你的网站很受用户欢迎。下面就教你如何利用开源思维开发一个SEO友好型网站&#xff01; 首先&#xff0c;你应该知道&#xff1a;93% 的网站…

修复开源VS Code 插件Trino Driver的三个小问题

前言 最近产品中使用到一款SQLTools的VS Code插件。该插件可以在VS Code中实现数据库管理&#xff0c;而且支持非常多的数据源类型&#xff0c; 官方的数据源类型有CockroachDB&#xff0c;MariaDB&#xff0c;MySQL&#xff0c;PostgreSQL&#xff0c;SQLite&#xff0c;Micr…

电脑录屏按哪个键?您可以这样操作!

案例&#xff1a;电脑按哪3个键&#xff0c;可以录屏&#xff1f; 【我平常喜欢使用快捷键在电脑上快速完成一些操作。最近接触到了电脑录屏&#xff0c;感觉使用它一系列的操作比较麻烦。想在这里问问小伙伴们&#xff0c;有没有使用快捷键成功操作过的朋友&#xff01;】 电…

【Linux】页表的深入分析

上一篇文章介绍了线程的基本概念 而本篇文章我们来深入理解一下, CPU再调度我们以往理解的进程和如今的线程都会涉及到的一个内容: 页表 文章目录深入理解页表 *页表的实际组成*什么是page&#xff1f;深入理解页表 * 在介绍进程时, 博主没有深入介绍过页表. 只是简单说了 页…

DAY 40 firewalld 防火墙

firewalld防火墙是centos7系统默认的防火墙管理工具&#xff0c;取代了之前的iptables防火墙&#xff0c;也是工作在网络层&#xff0c;属于包过滤防火墙。 支持IPv4、IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式&#xff1a;临时模…

【快乐手撕LeetCode题解系列】—— 环形链表 II

【快乐手撕LeetCode题解系列】—— 环形链表 II&#x1f60e;前言&#x1f64c;环形链表 II&#x1f64c;画图分析&#xff1a;&#x1f60d;思路分析&#xff1a;&#x1f60d;源代码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客…

了解oauth2.0

1 什么是 OAuth2.0 开发授权&#xff08;OAuth&#xff09;是一个开放标准&#xff0c;允许用户让第三方应用访问该用户在某一网站上存储的私密的资源&#xff08;如照片、视频、联系人列表等&#xff09;&#xff0c;而无需将用户名和密码提供给第三方应用。 OAuth 允许用户…

我的软件测试故事:成长、迷茫、奋斗

前言 测试工作6年&#xff0c;经历过不同产品、共事过不同专业背景、能力的同事&#xff0c;踩过测试各种坑、遇到过各种bug。测试职场生涯积极努力上进业务和技术能力快速进步过、也有努力付出却一无所得过、有对测试生涯前景充满希望认为一片朝气蓬勃过、也有对中年危机思考不…

OpenAI Embedding:快速实现聊天机器人(二)

theme: orange 本文正在参加「金石计划」 接上文OpenAI Embedding&#xff1a;快速实现聊天机器人(一)有讲到聊天机器人的一些概念&#xff0c;这篇开始讲讲这个聊天机器人的架构和流程。 总架构图 这里我参照一个现成的架构图来讲如何实现&#xff0c;其是基于Azure多个相关云…

香港进出口报关指南

由于香港优越的地理位置和政策支持&#xff0c;大部分外贸货物通过香港出口到世界各地。与内地海关相比&#xff0c;香港报关更简单快捷。司机可根据内地舱单填写一份香港进/出口舱单(俗称司机纸)进出香港海关&#xff0c;并在货物抵港后14天内申报。 香港进出口报关需要提供哪…