SpringBoot+SpringDataJpa配置双数据源SqlServer和Mysql

本文详细介绍了在SpringBoot2.0版本中如何配置双数据源,包括使用MySQL和SQL Server作为主从数据库的步骤。从项目依赖、application.properties配置到主从数据源的主要代码实现,为开发者提供了完整的配置指南。

有时候项目中会遇到需要配置双数据源的情况,到SpringBoot2.0版本后和之前配置双数据源的方法有些区别,这里我用的SpringBoot版本是2.0.3,废话不多说,给出主要步骤:

一、项目依赖pom.xml配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/> 
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

二、application.properties配置文件配置

datasource.main.jdbc-url=jdbc:sqlserver://xxxxxxxxxx:1433;DatabaseName=xxx
datasource.main.username=sa
datasource.main.password=xxxxxxx
datasource.main.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.main.database=sql_server
spring.jpa.hibernate.main-dialect=org.hibernate.dialect.SQLServer2008Dialect
datasource.main.configuration.maximum-pool-size=30

datasource.second.jdbc-url=jdbc:mysql://localhost:3306/xxxxx?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
datasource.second.username=root
datasource.second.password=root
datasource.second.driver-class-name=com.mysql.jdbc.Driver
datasource.second.database=mysql
datasource.second.configuration.maximum-pool-size=30
mybatis.configuration.mapUnderscoreToCamelCase=true
spring.jpa.hibernate.second-dialect=org.hibernate.dialect.MySQL5Dialect

三、配置双数据源主要代码

1.创建主从数据源DataSourceConfig配置类

@Configuration
public class DataSourceConfig {


@Bean(name = "primaryDataSource")
@Primary
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "datasource.main")
public DataSource primaryDatasource() {
    return DataSourceBuilder.create().build();
}

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

}

2.主数据源的配置

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "entityManagerFactoryPrimary",//配置连接工厂 entityManagerFactory
    transactionManagerRef = "transactionManagerPrimary", //配置 事物管理器  transactionManager
    basePackages = {"com.greek.www.dao"}//设置持久层所在位置
)
public class PrimaryConfig {

@Autowired
private JpaProperties jpaProperties;

@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;// 自动注入配置好的数据源

@Value("${spring.jpa.hibernate.main-dialect}")
private String primaryDialect;// 获取对应的数据库方言


/**
 *
 * @param builder
 * @return
 */
@Bean(name = "entityManagerFactoryPrimary")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {

    return builder
            //设置数据源
            .dataSource(primaryDataSource)
            //设置数据源属性
            .properties(getVendorProperties(primaryDataSource))
            //设置实体类所在位置.扫描所有带有 @Entity 注解的类
            .packages("com.greek.www.entity")
            // Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,
            // Repository就能用它来创建 EntityManager 了,然后 EntityManager 就可以针对数据库执行操作
            .persistenceUnit("primaryPersistenceUnit")
            .build();

}

private Map<String, String> getVendorProperties(DataSource dataSource) {
    Map<String,String> map = new HashMap<>();
    map.put("hibernate.dialect",primaryDialect);// 设置对应的数据库方言
    //jpaProperties.getHibernate().getNaming().setPhysicalStrategy("org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
    jpaProperties.setProperties(map);
    return jpaProperties.getProperties();
}

/**
 * 配置事物管理器
 *
 * @param builder
 * @return
 */
@Bean(name = "transactionManagerPrimary")
@Primary
PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
    return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}

3.从数据源的配置

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef="entityManagerFactorySecondary",
    transactionManagerRef="transactionManagerSecondary",
    basePackages= { "com.greek.www.repository" })
public class SecondaryConfig {

@Autowired
private JpaProperties jpaProperties;

@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;

@Value("${spring.jpa.hibernate.second-dialect}")
private String secondaryDialect;


@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
    return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}

@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(secondaryDataSource)
            .properties(getVendorProperties(secondaryDataSource))
            .packages("com.greek.www.domain")
            .persistenceUnit("secondaryPersistenceUnit")
            .build();
}

private Map<String, String> getVendorProperties(DataSource dataSource) {
    Map<String,String> map = new HashMap<>();
    map.put("hibernate.dialect",secondaryDialect);
   // jpaProperties.getHibernate().getNaming().setPhysicalStrategy("org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
   //jpaProperties.getHibernate().getNaming().setImplicitStrategy("org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
    jpaProperties.setProperties(map);
    return jpaProperties.getProperties();
}

@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
    return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}

}

这样双数据源的配置就完成了,但是有一个问题我没有解决,就是mysql数据库有下划线的字段不能解析,必须在实体类中加上注解指定字段,比如:

@Column(name = "rpt_time")
private Date rptTime;

双数据源的字段命名策略设置不生效,不知道为什么,如果有答案的小伙伴希望能告知。不胜感激!

访问我的达人课

访问我的博客 Wang's Blog

关注我的微信公众号获取更多资源

<think>我们正在构建一个图书管理系统,使用SpringBoot作为基础框架,同时整合MyBatis-PlusSpringDataJPA。注意,通常一个项目不会同时使用MyBatis-PlusJPA,因为它们都是持久层框架,选择其中一个即可。但这里用户同时提到了两者,我们可以设计成多数据源,或者解释如何选择其中之一。由于用户要求示例代码教程,我们将提供两种方式的简要说明代码片段,但建议在实际项目中选择一种持久层框架。项目结构:1.使用SpringBoot2.x2.数据库:MySQL3.持久层:MyBatis-Plus或SpringDataJPA我们将分别展示两种方式的核心代码。###方案一:使用MyBatis-Plus1.添加依赖(pom.xml):```xml<dependencies><!--SpringBootWeb--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--MyBatis-Plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency><!--MySQL驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>```2.配置数据源(application.yml):```ymlspring:datasource:url:jdbc:mysql://localhost:3306/book_db?useSSL=false&serverTimezone=UTCusername:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driver#MyBatis-Plus配置mybatis-plus:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl#打印SQL```3.实体类(Book.java):```java@Data@TableName("book")publicclassBook{@TableId(type=IdType.AUTO)privateLongid;privateStringtitle;privateStringauthor;privateStringisbn;privateDatepublishDate;//省略构造方法、gettersetter(使用Lombok注解)}```4.Mapper接口(BookMapper.java):```javapublicinterfaceBookMapperextendsBaseMapper<Book>{//继承BaseMapper,已经包含基本的CRUD方法}```5.Service层(BookService.java):```javapublicinterfaceBookServiceextendsIService<Book>{}@ServicepublicclassBookServiceImplextendsServiceImpl<BookMapper,Book>implementsBookService{}```6.Controller层(BookController.java):```java@RestController@RequestMapping("/books")publicclassBookController{@AutowiredprivateBookServicebookService;@GetMappingpublicList<Book>list(){returnbookService.list();}@PostMappingpublicbooleansave(@RequestBodyBookbook){returnbookService.save(book);}//其他CRUD方法}```###方案二:使用SpringDataJPA1.依赖(pom.xml):```xml<dependencies><!--SpringBootWeb--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringDataJPA--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!--MySQL驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>```2.配置数据源(application.yml):```ymlspring:datasource:url:jdbc:mysql://localhost:3306/book_db?useSSL=false&serverTimezone=UTCusername:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driverjpa:hibernate:ddl-auto:update#自动更新表结构show-sql:true#显示SQL```3.实体类(Book.java):```java@Entity@DatapublicclassBook{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;privateStringtitle;privateStringauthor;privateStringisbn;privateDatepublishDate;//省略构造方法、gettersetter(使用Lombok注解)}```4.Repository接口(BookRepository.java):```javapublicinterfaceBookRepositoryextendsJpaRepository<Book,Long>{//可以自定义查询方法}```5.Service层(BookService.java):```java@ServicepublicclassBookService{@AutowiredprivateBookRepositorybookRepository;publicList<Book>findAll(){returnbookRepository.findAll();}publicBooksave(Bookbook){returnbookRepository.save(book);}//其他方法}```6.Controller层(BookController.java):```java@RestController@RequestMapping("/books")publicclassBookController{@AutowiredprivateBookServicebookService;@GetMappingpublicList<Book>list(){returnbookService.findAll();}@PostMappingpublicBooksave(@RequestBodyBookbook){returnbookService.save(book);}//其他CRUD方法}```###注意事项-以上两种方案都是简单的CRUD示例,实际项目需要异常处理、事务管理、分页查询等。-MyBatis-Plus提供了强大的条件构造器分页插件,而JPA则提供了方法名解析查询等特性。-在同一个项目中同时使用MyBatis-PlusJPA需要配置数据源,但会增加项目复杂度,一般不建议。###教程资源推荐1.[MyBatis-Plus官方文档](https://mp.baomidou.com/)2.[SpringDataJPA官方文档](https://spring.io/projects/spring-data-jpa)3.图书管理系统完整项目示例(GitHub搜索关键词:springbootmybatis-plusbookmanagement或springbootjpabookmanagement)§§相关问题§§1.如何选择MyBatis-PlusSpringDataJPA?2.如何在SpringBoot配置数据源?3.图书管理系统的分页查询如何实现?4.如何为图书管理系统添加权限控制(例如SpringSecurity)?</think>### SSM/SpringBoot整合MyBatis-Plus/Spring Data JPA实现图书管理系统 以下是两种主流技术栈的图书管理系统实现方案,包含核心代码示例实现思路: --- #### **方案1:SpringBoot + MyBatis-Plus** **技术栈特点**:基于MyBatis的增强工具,简化CRUD操作 ##### 1. 项目结构 ``` src ├─main │ ├─java │ │ └─com │ │ └─example │ │ ├─controller (BookController.java) │ │ ├─entity (Book.java) │ │ ├─mapper (BookMapper.java) │ │ └─service (BookService.java) │ └─resources │ ├─mapper (BookMapper.xml) │ └─application.yml ``` ##### 2. 核心代码 **实体类** (`Book.java`): ```java @Data @TableName("book") // MyBatis-Plus表名映射 public class Book { @TableId(type = IdType.AUTO) private Long id; private String title; private String author; private String isbn; private LocalDate publishDate; private Integer stock; } ``` **Mapper接口** (`BookMapper.java`): ```java public interface BookMapper extends BaseMapper<Book> { // 继承BaseMapper即获得基础CRUD方法 // 自定义查询示例: @Select("SELECT * FROM book WHERE title LIKE CONCAT('%',#{keyword},'%')") List<Book> searchByKeyword(String keyword); } ``` **Service层** (`BookService.java`): ```java @Service public class BookService { @Autowired private BookMapper bookMapper; public IPage<Book> getBooksByPage(int page, int size) { return bookMapper.selectPage(new Page<>(page, size), null); } } ``` **Controller** (`BookController.java`): ```java @RestController @RequestMapping("/books") public class BookController { @Autowired private BookService bookService; @GetMapping public IPage<Book> listBooks( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) { return bookService.getBooksByPage(page, size); } } ``` **配置** (`application.yml`): ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/book_db username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志 ``` --- #### **方案2:SpringBoot + Spring Data JPA** **技术栈特点**:基于JPA规范,方法名自动生成查询 ##### 1. 项目结构 ``` src ├─main │ ├─java │ │ └─com │ │ └─example │ │ ├─controller (BookController.java) │ │ ├─model (Book.java) │ │ ├─repository (BookRepository.java) │ │ └─service (BookService.java) ``` ##### 2. 核心代码 **实体类** (`Book.java`): ```java @Entity @Data public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String title; private String author; private String isbn; private LocalDate publishDate; private Integer stock; } ``` **Repository接口** (`BookRepository.java`): ```java public interface BookRepository extends JpaRepository<Book, Long> { // 方法名自动生成查询 List<Book> findByTitleContaining(String keyword); // 自定义JPQL查询 @Query("SELECT b FROM Book b WHERE b.stock > :minStock") List<Book> findAvailableBooks(@Param("minStock") int minStock); } ``` **Service层** (`BookService.java`): ```java @Service public class BookService { @Autowired private BookRepository bookRepository; public Page<Book> getBooks(Pageable pageable) { return bookRepository.findAll(pageable); } } ``` **Controller** (`BookController.java`): ```java @RestController @RequestMapping("/books") public class BookController { @Autowired private BookService bookService; @GetMapping public Page<Book> listBooks( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size) { return bookService.getBooks(PageRequest.of(page, size)); } } ``` **配置** (`application.yml`): ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/book_db username: root password: 123456 jpa: hibernate: ddl-auto: update # 自动更新表结构 show-sql: true # 显示SQL语句 ``` --- ### 关键功能扩展建议 1. **事务管理**: ```java @Transactional public void borrowBook(Long bookId) { // 借阅逻辑 + 库存更新 } ``` 2. **动态查询**(MyBatis-Plus): ```java QueryWrapper<Book> wrapper = new QueryWrapper<>(); wrapper.like("title", keyword) .gt("stock", 0); bookMapper.selectList(wrapper); ``` 3. **JPA复杂查询**: ```java // 使用Specification动态构建查询 bookRepository.findAll((root, query, cb) -> { return cb.greaterThan(root.get("stock"), 0); }); ``` --- ### 学习资源推荐 1. [MyBatis-Plus官方文档](https://baomidou.com/)(CRUD接口详解) 2. [Spring Data JPA参考文档](https://spring.io/projects/spring-data-jpa)(查询方法设计) 3. 图书管理系统实战教程: - [SpringBoot+MyBatis-Plus实现](https://www.bilibili.com/video/BV1np4y1C7Yf) - [JPA版图书管理系统](https://github.com/spring-projects/spring-data-book) ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坏菠萝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值