1. 程式人生 > >springboot學習入門簡易版九---springboot2.0整合多數據源mybatis mysql8+(22)

springboot學習入門簡易版九---springboot2.0整合多數據源mybatis mysql8+(22)

tar att 分享 -m st2 unicode ons myba 大小

一個項目中配置多個數據源(鏈接不同庫jdbc),無限大,具體多少根據內存大小

項目中多數據源如何劃分:分包名(業務)或註解方式。分包名方式類似多個不同的jar,同業務需求放一個包中。

分包方式配置多數據源

項目目錄結構

技術分享圖片

2.14.1 pom文件

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.9.RELEASE</version>
 </parent>
 
 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>
    
 <dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <!-- mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <!-- mysql 驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!-- 提示建議引入 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true
</optional> </dependency> </dependencies>

2.14.2 創建test1包名下類

技術分享圖片

public class Employee implements Serializable{
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String lastName;
public interface EmployeeDao {

//    @Insert("insert into myemployeee(last_name) values (#{lastName})")
int insert(Employee emp); }

EmployeeMapping.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="com.springboot2.test1.dao.EmployeeDao">
  <insert id="insert" parameterType="com.springboot2.test1.bean.Employee">
    insert into myemployeee(last_name) values (#{lastName,jdbcType
=VARCHAR}) </insert> </mapper>

service類

@Service
public class EmployeeService {
    @Autowired
    EmployeeDao employeeDao;
    
    public Integer insert(Employee emp) {
        return employeeDao.insert(emp);
    }
}

2.14.3 創建test2包名下類

技術分享圖片

public class User implements Serializable{

    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private Integer age;
public interface UserDao {
//    @Insert("insert into myuser(name,age) values (#{name},#{age})")
    int insert(User user);
}

UserMapping.xml文件

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="com.springboot2.test2.dao.UserDao">
  <insert id="insert" parameterType="com.springboot2.test2.bean.User">
    insert into myuser(name,age) values (#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER})
  </insert>
</mapper>
@Service
public class UserService {

    @Autowired
    UserDao userDao;
    
    public Integer insert(User user2) {
        return userDao.insert(user2);
    }
}

2.14.4 重點:多數據源配置

2.14.4.1首先application.yml文件

#多數據源配置
spring:
  datasource:
    test1: #數據源1(自定義)
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/mytest?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true
      username: root
      password: (***)
    test2: #數據源2(自定義)
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/mytest2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true
      username: root
      password: (***)

註意:雖然為高版本,但多數據源配置時,必須為spring.datasource.test.jdbc-url而不是spring.datasource.test.url

2.14.4.2多數據源配置類

技術分享圖片

/**
 * 數據源配置
 * @author admin
 *
 */
@Configuration
@MapperScan(basePackages= "com.springboot2.test1.dao",sqlSessionFactoryRef="test1SqlSessionFactory") //註意:com.springboot2.test1.dao是dao類的包名!!
public class DatasourceConfig1 {

    /**
     * 配置test1數據庫
     * @return
     */
    @Bean(name="test1DataSource")
    @ConfigurationProperties(prefix="spring.datasource.test1")
    @Primary
    public DataSource test1DataSource() {
        return DataSourceBuilder.create().build();
    }
    
    /**
     * 創建sqlsessinfactory會話工廠
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name="test1SqlSessionFactory")
    @Primary
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        //加載mapping文件 
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath:com/springboot2/test1/mapping/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }
    
    /**
     * 事務管理
     */
    @Bean(name="test1TransactionManager")
    @Primary
    public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    
    /**
     * 創建SqlSessionTemplate
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name="test1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate test1SqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
        
    }
}
/**
 * 數據源配置
 * @author admin
 *
 */
@Configuration
@MapperScan(basePackages= {"com.springboot2.test2.dao"},sqlSessionFactoryRef="test2SqlSessionFactory")
public class DatasourceConfig2 {

    /**
     * 配置test2數據庫
     * @return
     */
    @Bean(name="test2DataSource")
    @ConfigurationProperties(prefix="spring.datasource.test2")
    public DataSource test2DataSource() {
        return DataSourceBuilder.create().build();
    }
    
    /**
     * 創建sqlsessinfactory會話工廠
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name="test2SqlSessionFactory")
    public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        //加載mapping文件 
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath:com/springboot2/test2/mapping/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }
    
    /**
     * 事務管理
     */
    @Bean(name="test2TransactionManager")
    public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    
    /**
     * 創建SqlSessionTemplate
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name="test2SqlSessionTemplate")
    public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
        
    }
}

註意:

1)分包方式下@Primary可以不寫!

2mapperscan掃描為dao類對應的包名而不是dao類,否則會導致無法註入,報錯缺少component註解。

2.14.5 controller

@RestController
public class MultiDataSourceController {
    @Autowired
    EmployeeService employeeService1;
    @Autowired
    UserService userService;
    
    @RequestMapping("/insertEmployee")
    public String insert(String lastName){
        Employee emp=new Employee();
        emp.setLastName(lastName);
        int i=employeeService1.insert(emp);
        return i+"";
    }
    
    //接收json格式請求
    @RequestMapping("/insertUser")
    public String insert(@RequestBody User user){
        User user2=new User();
        user2.setAge(user.getAge());
        user2.setName(user.getName());
        int i=userService.insert(user2);
        return i+"";
    }
    //接收普通格式多參數請求
    @RequestMapping("/insertUser2")
    public String insertUser2(@RequestParam("name") String name,@RequestParam("name") Integer age){
        User user2=new User();
        user2.setAge(age);
        user2.setName(name);
        int i=userService.insert(user2);
        return i+"";
    }

2.14.7 啟動類

@SpringBootApplication
//@MapperScan("com.springboot2.dao")//多數據源下在數據源配置中配置DatasourceConfig1和DatasourceConfig2
public class StartApplication {

    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }

}

2.14.8 測試

1 Get請求:http://localhost:8080/insertEmployee?lastName=test2222

執行成功返回1

2 Post請求(且content-typeapplication/json類型)

http://localhost:8080/insertUser

請求參數:

{

"name":"test3",

"age":11

}

返回成功1

3 get請求(content-type類型隨意)

http://localhost:8080/insertUser2?name=ttdd&age=22

返回成功1

springboot學習入門簡易版九---springboot2.0整合多數據源mybatis mysql8+(22)