首页 > 其他分享 >spring boot(学习笔记第九课)

spring boot(学习笔记第九课)

时间:2024-06-22 21:27:45浏览次数:9  
标签:return dsOne spring boot datasource 第九课 com public

spring boot(学习笔记第九课)

  • MyBatis多数据库配置,Spring Data JPA多数据库配置

学习内容:

  1. MyBatis多数据库配置
  2. Spring Data JPA多数据库配置

1. MyBatis多数据库配置

  1. 准备多个数据库,配置数据库连接信息。

    #database
    spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/springboot
    spring.datasource.one.username=finlay
    spring.datasource.one.password=123456
    
    spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.two.url=jdbc:postgresql://127.0.0.1:5432/springboot
    spring.datasource.two.username=finlay
    spring.datasource.two.password=123456
    
  2. 因为使用一个Entity类,所以在两个库里面加一个表book
    在这里插入图片描述

  3. 需要将MyBatisxml文件加载,所以加入resources

     <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>
    
  4. 加入必要的依赖。

    • mybatis的依赖。
    • druild的连接池依赖。
    • postgreSQL的依赖。
    • mysql的依赖。
      	 <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid</artifactId>
              <version>1.1.9</version>
          </dependency>
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid-spring-boot-starter</artifactId>
              <version>1.2.9</version>
          </dependency>
          <dependency>
              <groupId>org.postgresql</groupId>
              <artifactId>postgresql</artifactId>
              <scope>runtime</scope>
          </dependency>
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>8.0.28</version>
              <scope>runtime</scope>
          </dependency>
      
  5. 定义DataSourceConfig@Configuration的配置类,将application.properties中定义的接续信息加载成bean

    @Configuration
    public class DataSourceConfig {
        @Bean(value = "dsOne")
        @ConfigurationProperties(value = "spring.datasource.one")
        DataSource dsOne() {
            return DruidDataSourceBuilder.create().build();
        }
    
        @Bean(value = "dsTwo")
        @ConfigurationProperties(value = "spring.datasource.two")
        DataSource dsTwo() {
            return DruidDataSourceBuilder.create().build();
        }
    }
    
  6. 分别定义两个repository下面的包,分别是datasource1datasource2。因为需要将不同的数据库指定给不同的包。
    在这里插入图片描述

  7. datasource1分别定义BookMapper1BookMapper1.xml。同样定义BookMapper2BookMapper2.xmldatasource2中,和MyBatis单数据库相同。

    • BookMapper1.java
    	@Mapper
    	public interface BookMapper1 {
    	   public List<Book> getAllBooks();
    	}
    
    • BookMapper1.xml
    	<?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.example.demo.repository.datasource1.BookMapper1">
    	    <select id="getAllBooks" resultType="com.example.demo.entity.Book">
    	        select * from book;
    	    </select>
    	</mapper>
    
    • BookMapper2.java
    * @Mapper
    public interface BookMapper2{
       public List<Book> getAllBooks();
    }
    
    • BookMapper2.xml
    <?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.example.demo.repository.datasource2.BookMapper2">
        <select id="getAllBooks" resultType="com.example.demo.entity.Book">
            select * from book;
        </select>
    </mapper>
    
  8. BookMapper1.java进行配置,让其指向datasource1

    @Configuration
    @MapperScan(value = "com.example.demo.repository.datasource1",
            sqlSessionFactoryRef = "sqlSessionFactoryBean1")
    public class MyBatisConfigOne {
        @Autowired
        @Qualifier("dsOne")
        DataSource dsOne;
    
        @Bean
        public SqlSessionFactory sqlSessionFactoryBean1() throws Exception {
            SqlSessionFactoryBean sqlSessionFactoryBean =
                    new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dsOne);
            return sqlSessionFactoryBean.getObject();
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
            return new SqlSessionTemplate(sqlSessionFactoryBean1());
        }
    }
    
  9. BookMapper2.java进行配置,让其指向datasource2

    @Configuration
    @MapperScan(value = "com.example.demo.repository.datasource2",
            sqlSessionFactoryRef = "sqlSessionFactoryBean2")
    public class MyBatisConfigTwo {
        @Autowired
        @Qualifier("dsTwo")
        DataSource dsTwo;
    
        @Bean
        public SqlSessionFactory sqlSessionFactoryBean2() throws Exception {
            SqlSessionFactoryBean sqlSessionFactoryBean =
                    new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dsTwo);
            return sqlSessionFactoryBean.getObject();
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
            return new SqlSessionTemplate(sqlSessionFactoryBean2());
        }
    }
    
  10. 定义controller,使用BookMapper1BookMapper2分别从两个数据库读出数据

      @GetMapping("/multidb")
        @ResponseBody
        public String multidb() {
            List<Book> book1 = bookMapper1.getAllBooks();
            List<Book> book2 = bookMapper2.getAllBooks();
            return book1.toString() + book2.toString();
        }
    

11.访问https://localhost:8080/multidb,会显示从两个数据库的数据。在这里插入图片描述

2. Spring Data JPA多数据库配置

  1. 加入必要的Spring Data JPA依赖
     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
     </dependency>
    
  2. application.properties中加入Spring Data JAP的配置。
    #database
    spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/springboot
    spring.datasource.one.username=finlay
    spring.datasource.one.password=123456
    
    spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.two.url=jdbc:postgresql://127.0.0.1:5432/springboot
    spring.datasource.two.username=finlay
    spring.datasource.two.password=123456
    
    spring.jpa.properties.hibernate.hbm2ddl.auto=update
    spring.jpa.properties.show-sql=true
    
    hbm2ddl.auto=updatehbm2ddl.auto表示没有表的场合,会建立表,但是如果表已经存在,数据不会清空。
  3. 创建dataSource的配置bean
    *注意,务必在一个dataSource*上增加@primary注解。
    @Configuration
    public class DataSourceConfig {
        @Bean(value = "dsOne")
        @ConfigurationProperties(value = "spring.datasource.one")
        @Primary
        DataSource dsOne() {
            return DruidDataSourceBuilder.create().build();
        }
    
        @Bean(value = "dsTwo")
        @ConfigurationProperties(value = "spring.datasource.two")
        DataSource dsTwo() {
            return DruidDataSourceBuilder.create().build();
        }
    }
    
  4. package com.example.demo.repository.jpa.datasource1;中增加@Configration,设定该package下面的repository都使用该dsOne的数据库配置。
    注意,entityManagerFactoryBeanOne的上面增加@primary注解。
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(basePackages = "com.example.demo.repository.jpa.datasource1",
            entityManagerFactoryRef = "entityManagerFactoryBeanOne",
            transactionManagerRef = "platformTransactionManagerOne")
    public class JpaConfigOne {
        @Resource(name = "dsOne")
        public DataSource dsOne;
        @Autowired
        JpaProperties jpaProperties;
    
        @Bean
        @Primary
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanOne(
                EntityManagerFactoryBuilder builder
        ) {
            return builder.dataSource(dsOne).properties(
                            jpaProperties.getProperties())
                    .packages("com.example.demo.entity")
                    .persistenceUnit("pu2")
                    .build();
        }
    
        @Bean
        PlatformTransactionManager platformTransactionManagerOne(
                EntityManagerFactoryBuilder builder
        ) {
            LocalContainerEntityManagerFactoryBean factoryBeanOne
                    = entityManagerFactoryBeanOne(builder);
            return new JpaTransactionManager(Objects.requireNonNull(factoryBeanOne.getObject()));
        }
    }
    
  5. package com.example.demo.repository.jpa.datasource1里面,定义UserDaoOne
    public interface UserDaoTwo extends JpaRepository<UserMaster,Integer> {
    }
    
  6. package com.example.demo.repository.jpa.datasource1;中增加@Configration,设定该package下面的repository都使用该dsOne的数据库配置。
    注意,entityManagerFactoryBeanOne的上面增加@primary注解。
    	@Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(basePackages = "com.example.demo.repository.jpa.datasource2",
    entityManagerFactoryRef = "entityManagerFactoryBeanTwo",
    transactionManagerRef = "platformTransactionManagerTwo")
    public class JpaConfigTwo {
        @Resource(name = "dsTwo")
        public DataSource dsTwo;
        @Autowired
        JpaProperties jpaProperties;
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanTwo(
                EntityManagerFactoryBuilder builder
        ){
           return builder.dataSource(dsTwo).properties(
                   jpaProperties.getProperties())
                   .packages("com.example.demo.entity")
                   .persistenceUnit("pu2")
                   .build();
        }
        @Bean
        PlatformTransactionManager platformTransactionManagerTwo(
                EntityManagerFactoryBuilder builder
        ){
           LocalContainerEntityManagerFactoryBean factoryBeanTwo
                   = entityManagerFactoryBeanTwo(builder);
           return new JpaTransactionManager(Objects.requireNonNull(factoryBeanTwo.getObject()));
        }
    }
    
  7. package com.example.demo.repository.jpa.datasource2里面,定义UserDaoTwo
    public interface UserDaoTwo extends JpaRepository<UserMaster,Integer> {
    }
    
  8. 定义@Entity类。
    @Entity(name = "user_master")
    @Data
    public class UserMaster {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
    
        private Integer age;
        private String name;
        
        private String gender;
    }
    
  9. controller中定义DAO,进行测试。
        @Autowired
        UserDaoOne userDaoOne;
    
        @Autowired
        UserDaoTwo userDaoTwo;
    
        @GetMapping("/multidb_jpa")
        @ResponseBody
        public void multiDBJpa(){
            UserMaster user = new UserMaster();
            user.setAge(10);
            user.setGender("boy");
            user.setName("allen");
            userDaoOne.save(user);
    
            user.setName("finlay");
            userDaoTwo.save(user);
        }
    
  10. 执行完https://localhost:8080/multidb_jpa之后两个数据库都会建立user_master的表,数据会增加一条。在这里插入图片描述

标签:return,dsOne,spring,boot,datasource,第九课,com,public
From: https://blog.csdn.net/sealaugh1980/article/details/139785321

相关文章

  • 初识 SpringMVC,运行配置第一个Spring MVC 程序
    1.初识SpringMVC,运行配置第一个SpringMVC程序@目录1.初识SpringMVC,运行配置第一个SpringMVC程序1.1什么是MVC2.SpringMVC概述2.1SpringMVC的作用:3.运行配置第一个SpringMVC程序3.1第一步:创建Maven模块3.2第二步:添加web支持3.3第三步:配置web.xml文件3.......
  • 在IntelliJ IDEA中使用Spring Boot:快速配置
    使用IntelliJIDEA开发SpringBoot应用程序可以极大地提高开发效率,因为IDEA提供了许多便捷的功能,比如自动补全、代码分析、热部署等。以下是一篇可能的CSDN博客文章草稿,介绍如何在IntelliJIDEA中使用SpringBoot:在IntelliJIDEA中使用SpringBoot:开发指南引言IntelliJ......
  • springboot+vue前后端分离项目-vue项目搭建2
    1.创建springboot项目,进入https://start.spring.io生成 2.新建模块,创建Maven模块 springbootdemo模块下src和pom都删除,导入第一步新建的springboot项目 直接将src和pom都复制到springbootdemo下即可手动刷新Maven,下载依赖  3. 项目结构优化,vue和java区分,新建文件......
  • testng + mockito + spring boot test 基本操作
    代码地址https://gitee.com/bzrj/thresh-boot如何使用在thresh-dependencies目录执行mvncleaninstall在跟目录执行make效果jacocoallure关键配置thresh-test此模块包含了测试需要的依赖定义了两个testng监听thresh-report此模块专门用于聚合jacoco......
  • SpringBoot 过滤器更改 Request body ,并实现数据解密
    客户端、服务端网络通信,为了安全,会对报文数据进行加解密操作。在SpringBoot项目中,最好使用参考AOP思想,加解密与Controller业务逻辑解耦,互不影响。以解密为例:需要在request请求到达Controller之前进行拦截,获取请求body中的密文并对其进行解密,然后把解密后的明文重新设置到request......
  • JAVA学习笔记DAY10——SpringBoot基础
    文章目录SpringBoot3介绍SpringBoot快速入门@SpringBootApplicationSpringBoot配置文件统一配置管理Yaml配置优势tipsSpringBoot整合SpringMVC静态资源拦截器interceptorSpringBoot整合DruidSpringBoot整合MybatisSpringBoot整合txaopSpringBoot打包......
  • 基于springboot实现知识管理系统项目【项目源码+论文说明】计算机毕业设计
    摘要随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求,创建了一个计算机管理知识管理系统的方案。文章介绍了知识管理系统的系统分析......
  • 基于springboot实现酒店客房管理系统项目【项目源码+论文说明】计算机毕业设计
    摘 要随着人们的物质水平的提高,旅游业和酒店业发展的速度越来越快。近年来,市面上酒店的数量和规模都在不断增加,如何提高酒店的管理效率和服务质量成为了一个重要的问题。伴随着信息技术的发展,基于互联网的酒店客房管理系统已经成为了酒店管理过程中的一个重要的手段。这......
  • JeecgBoot-queryFieldBySql-远程命令执行-RCE漏洞
    影响范围:3.0.0<=jeecg-boot<=3.5.32.4.x<=jeecg-boot<=2.4.6POC:POST/jeecg-boot/jmreport/queryFieldBySqlHTTP/1.1Host:ipPragma:no-cacheCache-Control:no-cacheSec-Ch-Ua:"GoogleChrome";v="125","Chromium&q......
  • SpringBoot 3.x 结合 Swagger3 (Knife4j )踩坑实录
    SpringBoot3.x+Swagger3踩坑实录我的是springboot版本是:3.2.2<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.2</version>......