项目结构
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";
}
}