Springboot和MyBatis整合(自定义数据源,可多数据源)

本文介绍了如何在Springboot项目中整合MyBatis并实现自定义数据源,支持多数据源切换。重点讲解了配置数据源bean、mapper类与xml文件的设置,以及在yaml文件中配置数据库连接池的细节。通过这种方式,可以在运行时根据条件选择不同的数据源进行操作。

Springboot和MyBatis整合(自定义数据源,可多数据源)

​ 由于我们项目中会用到根据条件不同操作不同的数据源,之前用的Springboot和JDBC整合的时候可以在JDBC里轻松选择数据源,写这个贴子则是记录在使用MyBatis时的选择和一些注意点。

pom.xml

整合主要用到的关键依赖

    <!-- mybatis整合springboot的jar包 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.0</version>
    </dependency>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- Hikari链接池依赖 -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java7</artifactId>
        <version>2.4.11</version>
    </dependency>
springboot配置,习惯使用yaml文件
  • application.yml数据库链接池用的Hikari
spring:
  datasource:
    ALI:
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: 'XXX'
      hikari:
        maxLifetime: 1765000 #一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
        maximumPoolSize: 9 #连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
  profiles:
    active: dev
  • application-dev.yml
server:
  port: 8080
  tomcat:
    uri-encoding: utf-8
    #session超时事件,单位(秒)
  session:
    timeout: 30
logging:
  level:
    root: info
#数据库url,多数据源可在这里配置多个,如注释里
#注意:地址前名字是jdbc-url,如果是单数据源纯ymal里读取则是url
spring:
  datasource:
    ALI:
      jdbc-url: jdbc:mysql://XXX.XXX.XXX.XX:3306/cook
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: 'XXX'
      hikari:
        maxLifetime: 1765000 #一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
        maximumPoolSize: 9 #连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)


#   ALI2:
#     jdbc-url: jdbc:mysql://XXX.XXX.XXX.XXX:3306/food
#     driver-class-name: com.mysql.jdbc.Driver
#     username: root
#     password: 'XXX'
#      hikari:
#       maxLifetime: 1765000
#       maximumPoolSize: 9 


#pagehelper分页插件
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
配置数据源bean,多数据源的话,有几个在这个类里配几个bean
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 数据源连接
 *
 * @author renhuan
 * @create 2018-09-13 20:10
 */
@Configuration
public class DatasourceConfig {
  @Bean(name = "datasourceALI")
  @Primary
  @ConfigurationProperties(prefix = "spring.datasource.ALI")
  public DataSource dataSourceALI() {
    return DataSourceBuilder.create().type(HikariDataSource.class).build();
  }
}
把数据源bean配置进mabatis里去,如果多数据源可以配N个这样的类,但要注意以下
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

/**
 * 配置mybatis的SqlSessionFactory分别使用不同的数据源
 *
 * @author renhuan
 * @create 2018-09-15 19:23
 */
@Configuration
@MapperScan(basePackages = {"com.XXX.dao"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisDBConfig {

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

  @Bean
  @Primary
  @ConditionalOnMissingBean  //当容器里没有指定的bean的情况下创建bean
  public SqlSessionFactoryBean sqlSessionFactoryBean1() throws Exception {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    //指定数据源
    factoryBean.setDataSource(datasourceALI); // 使用ALI数据源, 连接ALI库
    //设置mybatis的主配置文件
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    Resource mybatisConfigXml = resolver.getResource("classpath:mapping/config/mybatis-config.xml");
    Resource[] mapperConfigXmls = resolver.getResources("classpath:mapping/*Mapper.xml");
    factoryBean.setTypeAliasesPackage("com.XXX.model");
    factoryBean.setConfigLocation(mybatisConfigXml);
    factoryBean.setMapperLocations(mapperConfigXmls);
    return factoryBean;
  }


  @Bean
  @Primary
  public SqlSessionFactory sqlSessionFactory1() throws Exception {
    return sqlSessionFactoryBean1().getObject();
  }

  @Bean
  @Primary
  public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
    SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
    return template;
  }
}

注意:

1. 主用的一套要加`@Primary`,表示同一个类的多个对象注入,优先选择有注解@Primary的对象;
2. `sqlSessionFactoryBean1()`方法里对xml文件位置的指定方式,为了更加灵活,mybatis的相关xml还是保留的。主要文件:mybatis的config的xml文件,和mapper的xml文件;
3. 扫描注释``@MapperScan(basePackages = {"com.XXX.dao"}, sqlSessionFactoryRef = "sqlSessionFactory1")``里指定了指定包里的mapper接口用哪个对应数据源的`sqlSessionFactory`。
mapper类和对应的xml

mapper类,由于已经扫描了这个类,所以可以不加注释

import com.XXX.model.Cooker;
/**
 * 厨师数据操作
 *
 * @author renhuan
 * @create 2018-09-13 19:51
 */
public interface CookerMapper {
   void saveNewCooker(Cooker cooker);
}

对应mapper.xml,放在resource下的,实体类别名映射第4步里做过了

<?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.XXX.dao.CookerMapper">
  <insert id="saveNewCooker" parameterType="Cooker">
    INSERT INTO t_COOKER (COOKER_NAME,COOKER_AGE) VALUES (#{cookerName},#{cookerAge})
  </insert>
</mapper>
mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 驼峰的自动映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer"/>
        <typeAlias alias="Long" type="java.lang.Long"/>
        <typeAlias alias="HashMap" type="java.util.HashMap"/>
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
        <typeAlias alias="ArrayList" type="java.util.ArrayList"/>
        <typeAlias alias="LinkedList" type="java.util.LinkedList"/>
    </typeAliases>
</configuration>

小结:比起单数据源常用的springboot和mybatis的整合,多数据源主要是在yml文件里配置多个数据源,这种配置是没法被mybatis直接读取的,而是通过专门config类里bean里读取,同时也不在yml里写mabatis的路径配置,而是配置在了对应数据源的sqlSessionFactoryBean里,要注意这两种整合yml里的写法格式是不同的。

转载注明:https://blog.youkuaiyun.com/renhuan28/article/details/82729239

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值