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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot可以很方便地整合JPAMyBatis整合JPA: 1. 在pom.xml中添加JPA依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据源和JPA属性: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect ``` 3. 创建实体类和Repository接口: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; // getter和setter } public interface UserRepository extends JpaRepository<User, Long> { } ``` 4. 在Service中使用Repository: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } public void saveUser(User user) { userRepository.save(user); } public void deleteUserById(Long id) { userRepository.deleteById(id); } } ``` 整合MyBatis: 1. 在pom.xml中添加MyBatis依赖: ``` <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.</version> </dependency> ``` 2. 配置数据源和MyBatis属性: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.example.demo.entity ``` 3. 创建实体类和Mapper接口: ``` public class User { private Long id; private String name; private Integer age; // getter和setter } @Mapper public interface UserMapper { User getUserById(Long id); void saveUser(User user); void deleteUserById(Long id); } ``` 4. 在Service中使用Mapper: ``` @Service public class UserService { @Autowired private UserMapper userMapper; public User getUserById(Long id) { return userMapper.getUserById(id); } public void saveUser(User user) { userMapper.saveUser(user); } public void deleteUserById(Long id) { userMapper.deleteUserById(id); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值