SpringBoot整合多数据源jpa+mybatis(三)

项目结构

在这里插入图片描述
user表使用jpa,product表使用mybatis
pom中的依赖与上一篇相同

1.在mysql建两个库user和product

在这里插入图片描述

2.多数据源配置

application.properties

################
# db 整合多数据源
################
spring.datasource.user.jdbc-url=jdbc:mysql://localhost:3306/user
spring.datasource.user.username=root
spring.datasource.user.password=123456
spring.datasource.user.driver-class-name=com.mysql.jdbc.Driver

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

注意:使用jdbc-url属性代替之前配置中的url属性

2.1创建spring配置类

spring-data-jpa------>(user)
新建DataSourceConfig1.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactoryPrimary",
        transactionManagerRef="transactionManagerPrimary",
        basePackages= { "com.wd.demo.db1.dao" }) //设置Repository所在位置
public class DataSourceConfig1 {
    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.user")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

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

    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }

    @Autowired
    private JpaProperties jpaProperties;

    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(primaryDataSource)
                .packages("com.wd.demo.entity") //设置实体类所在位置
                .persistenceUnit("primaryPersistenceUnit")
                .build();
    }
    
    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }
}

spring-data-jpa------>(product)
新建DataSource2.java

@Configuration //注册到spring容器中
@MapperScan(basePackages = "com.wd.demo.db2.mapper", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DataSource2 {

    /**
     * 配置db2数据库
     * @return
     */
    @Bean(name = "db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.product")
    public DataSource dataSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * 创建SqlSessionFactory
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name = "db2SqlSessionFactory")
   // @Primary  //primary是设置优先,因为有多个数据源,在没有明确指定用哪个的情况下,会用带有primary的,这个注解必须有一个数据源要添加
    public SqlSessionFactory sqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    /**
     * 配置事务管理
     * @param dataSource
     * @return
     */
    @Bean("db2TransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("db2DataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("db2SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3.新建实体类

User.java

@Data  //自动生成get set方法
@Entity  //自动生成相应的表,表名默认与实体类名相同   (JPA)
@Table(name = "user")
//@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
public class User {

    @Id  //设置主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) //自动增长
    private Integer userId;

    // @Column 指定在表中的名字,默认与属性名相同
    private String userName;
    private String userPassword;
    private Integer userAge;
    private String userPhone;

}

Product.java

@Data
public class Product {

    private Integer productId;
    private String productName;
    private Double productPrice;

}

4.功能实现

为了区分两个数据源,在com.*.demo下新建db1包(user)和db2包(user)。

4.1user表

创建DAO
IUserDao.java

package com.wd.demo.db1.dao;

import com.wd.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

//Jpa提供了增删改查的功能
public interface IUserDao extends JpaRepository<User, Integer> {  //第一个泛型为实体类,第二个为实体类的主键类型

}

创建Service
IUserService.java

package com.wd.demo.db1.service;

import com.wd.demo.entity.User;

public interface IUserService {

    /**
     * 添加新用户
     * @param user
     */
    void saveUser(User user);
}

UserServiceImpl.java

package com.wd.demo.db1.service.impl;

import com.wd.demo.db1.dao.IUserDao;
import com.wd.demo.db1.service.IUserService;
import com.wd.demo.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao;

    @Override
    public void saveUser(User user) {
        userDao.save(user);
    }
}

4.2product表

创建mapper
ProductMapper.java

package com.wd.demo.db2.mapper;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Qualifier;

@Qualifier("db2SqlSessionFactory")
public interface ProductMapper {

    @Insert("insert into product(productName, productPrice) values(#{productName}, #{productPrice})")
    void addProduct(@Param("productName") String name, @Param("productPrice") Double price);
}

创建Service
IProductService.java

package com.wd.demo.db2.service;

import com.wd.demo.entity.Product;

public interface IProductService {

    void saveProduct(Product product);
}

ProductServiceImpl.java

package com.wd.demo.db2.service.impl;

import com.wd.demo.db2.mapper.ProductMapper;
import com.wd.demo.db2.service.IProductService;
import com.wd.demo.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ProductServiceImpl implements IProductService
{
    @Autowired
    private ProductMapper productMapper;

    @Override
   // @Transactional(transactionManager = "db2TransactionManager")
    public void saveProduct(Product product) {
        productMapper.addProduct(product.getProductName(), product.getProductPrice());
    }
}

5.创建Controller

IndexController.java

package com.wd.demo.controller;

import com.wd.demo.db1.service.IUserService;
import com.wd.demo.db2.service.IProductService;
import com.wd.demo.entity.Product;
import com.wd.demo.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {

    @Autowired
    IUserService userService;

    @Autowired
    IProductService productService;

    @RequestMapping("/add")
    @ResponseBody
    public String add(){
        User user = new User();
        user.setUserName("wan");
        user.setUserPassword("111");

        userService.saveUser(user);

        Product product = new Product();
        product.setProductName("123");
        product.setProductPrice(12.2);

        productService.saveProduct(product);

        return "ok";
    }
}

6.源代码

项目源代码地址
https://github.com/Qreply/springbootMultiDB.git

发布了49 篇原创文章 · 获赞 3 · 访问量 2334

猜你喜欢

转载自blog.csdn.net/xiao_count/article/details/102233824