本文在SpringBoot2.x整合MyBatis通用Mapper4 和 SpringBoot2.x + MyBatis + 多数据源 ,基础上做整合。实现 SpringBoot2.x + Mapper4 + 多数据源
https://github.com/qidasheng2012/springboot2.x_ssm/tree/branch-Mapper4-DataSources
建议先clone下本项目到本地,再结合本文章及注意事项,就能一目了然了
mapper-spring-boot-starter
中包含MyBatis的相关包,所以不需要再引入MyBatis的相关包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.0.RELEASEversion>
<relativePath/>
parent>
<groupId>com.springbootgroupId>
<artifactId>springboot2.x_ssmartifactId>
<version>1.0.0version>
<description>Spring Boot2.x 搭建 SSM 项目description>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapper-spring-boot-starterartifactId>
<version>2.1.5version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
#服务器配置
server:
port: 80
spring:
#数据源
datasource:
# 系统数据源
system:
url: jdbc:mysql://localhost:3306/system?serverTimezone=Asia/Shanghai&characterEncoding=utf8
username: root
password: 123456
configuration:
maximum-pool-size: 10
# 业务数据源
server:
url: jdbc:mysql://localhost:3306/server?serverTimezone=Asia/Shanghai&characterEncoding=utf8
username: root
password: 123456
configuration:
maximum-pool-size: 10
# 日志
logging:
level:
com.springboot.ssm.mapper: debug # 显示执行sql
这里是配置多数据源的核心
注意事项:
@MapperScan
引入的是 tk.mybatis.spring.annotation.MapperScan
包下的@Primary
注解 (有且仅有一个配置类需要添加)【DB1Config】
package com.springboot.ssm.config.db;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;
import javax.sql.DataSource;
@Configuration
@MapperScan(
basePackages = {"com.springboot.ssm.mapper.system"}, // 扫描mapper层所在的包
sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DB1Config {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.system")
public DataSourceProperties db1DataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.system.configuration")
public DataSource db1DataSource() {
return db1DataSourceProperties()
.initializeDataSourceBuilder()
.type(HikariDataSource.class) // 可以显示指定连接池,也可以不显示指定;即此行代码可以注释掉
.build();
}
@Bean
@Primary
public SqlSessionFactory db1SqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(db1DataSource());
factoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/system/*.xml")); // xml 所在路径
factoryBean.setTypeAliasesPackage("com.springboot.ssm.domain"); // 设置扫描别名包路径
return factoryBean.getObject();
}
@Bean
@Primary
public DataSourceTransactionManager db1TransactionManager() {
return new DataSourceTransactionManager(db1DataSource());
}
@Bean
@Primary
public SqlSessionTemplate db1SqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(db1SqlSessionFactory());
}
}
【DB2Config】
package com.springboot.ssm.config.db;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;
import javax.sql.DataSource;
@Configuration
@MapperScan(
basePackages = {"com.springboot.ssm.mapper.server"}, // 1. 扫描mapper层所在的包
sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DB2Config {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.server")
public DataSourceProperties db2DataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.server.configuration")
public DataSource db2DataSource() {
return db2DataSourceProperties()
.initializeDataSourceBuilder()
.type(HikariDataSource.class) // 可以显示指定连接池,也可以不显示指定;即此行代码可以注释掉
.build();
}
@Bean
public SqlSessionFactory db2SqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(db2DataSource());
factoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/server/*.xml")); // xml 所在路径
factoryBean.setTypeAliasesPackage("com.springboot.ssm.domain"); // 设置扫描别名包路径
return factoryBean.getObject();
}
@Bean
public DataSourceTransactionManager db2TransactionManager() {
return new DataSourceTransactionManager(db2DataSource());
}
@Bean
public SqlSessionTemplate db2SqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(db2SqlSessionFactory());
}
}
package com.springboot.ssm.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "JDBC")
private Integer id;
private String name;
private Integer age;
}
package com.springboot.ssm.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "t_product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "JDBC")
private Integer id;
private String productName;
}
package com.springboot.ssm.common.mapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface MysqlBaseMapper<T> extends Mapper<T>, MySqlMapper<T>, IdsMapper<T> {
}
package com.springboot.ssm.mapper.system;
import com.springboot.ssm.common.mapper.MysqlBaseMapper;
import com.springboot.ssm.domain.User;
public interface UserMapper extends MysqlBaseMapper<User> {
}
package com.springboot.ssm.mapper.server;
import com.springboot.ssm.common.mapper.MysqlBaseMapper;
import com.springboot.ssm.domain.Product;
public interface ProductMapper extends MysqlBaseMapper<Product> {
}
package com.springboot.ssm.service;
import com.springboot.ssm.domain.User;
import java.util.List;
public interface UserService {
// 查询所有用户信息
List<User> getAll();
}
package com.springboot.ssm.service.impl;
import com.springboot.ssm.domain.User;
import com.springboot.ssm.mapper.system.UserMapper;
import com.springboot.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getAll() {
return userMapper.selectAll();
}
}
package com.springboot.ssm.service;
import com.springboot.ssm.domain.Product;
import java.util.List;
public interface ProductService {
/**
* 获取所有产品信息
*
* @return
*/
List<Product> getAll();
}
package com.springboot.ssm.service.impl;
import com.springboot.ssm.domain.Product;
import com.springboot.ssm.mapper.server.ProductMapper;
import com.springboot.ssm.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductMapper productMapper;
@Override
public List<Product> getAll() {
return productMapper.selectAll();
}
}
package com.springboot.ssm.controller;
import com.springboot.ssm.domain.User;
import com.springboot.ssm.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getAll")
public List<User> getAll() {
return userService.getAll();
}
}
package com.springboot.ssm.controller;
import com.springboot.ssm.domain.Product;
import com.springboot.ssm.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/getAll")
public List<Product> getAll() {
return productService.getAll();
}
}
访问:http://127.0.0.1/user/getAll
访问:http://127.0.0.1/product/getAll
OK!大功告成