springboot 中整合mybatis多数据源不使用JPA

网友投稿 802 2022-12-14

springboot 中整合mybatis多数据源不使用JPA

springboot 中整合mybatis多数据源不使用JPA

目录前言:创建一个springboot项目项目创建成功了,那么开始说下整合mybatis上面的配置可以直接使用如果上面的配置都完成的话那么我们来自动生成一下在下图两个数据源完全生成好后的目录结构

前言:

小伙伴说能不能用springboot整合一下mybatis多数据源不使用JPA进行数据库连接操作。那么说干就干

创建一个springboot项目

流程就不介绍了,按图操作即可

创建项目后可能会发现,这个项目展示的有些不对劲啊,java类前面还有个小J号,这是由于maven包还没有-成功,你只需

要去maven projects中重新加载一下就可以了。?maven project在哪。。看下图

项目创建成功了,那么开始说下整合mybatis

首先在我们的resources目录下存在一个application.properties文件,这是一个全局配置文件,先将两个数据源配置添加到这个文件中(如果你分环境了可以将数据源配置放在不同的目录下)

//数据源1

spring.datasource.druid.crmtest.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.druid.crmtest.url=jdbc:mysql://xxxxx:3306/crm

spring.datasource.druid.crmtest.username=xxx

spring.datasource.druid.crmtest.password=xxx

spring.datasource.druid.crmtest.initial-size=2

spring.datasource.druid.crmtest.max-active=10

spring.datasource.druid.crmtest.min-idle=2

spring.datasource.druid.crmtest.max-wait=30000

spring.datasource.druid.crmtest.validation-query=SELECT 1

spring.datasource.druid.crmtest.validation-query-timeout=30000

spring.datasource.druid.crmtest.min-evictable-idle-time-millis=300000

spring.datasource.druid.crmtest.pool-prepared-statements=true

spring.datasource.druid.crmtest.max-pool-prepared-statement-per-connection-size=20

spring.datasource.druid.crmtest.test-on-borrow=false

spring.datasource.druid.crmtest.test-on-return=false

spring.datasource.druid.crmtest.test-while-idle=true

spring.datasource.druid.crmtest.time-between-eviction-runs-millis=60000

spring.datasource.druid.crmtest.filters=stat,wall

spring.datasource.druid.crmtest.connection-properties=druid.stat.slowSqlMillis=5000

spring.datasource.druid.crmtest.connection-init-sqls=set names utf8mb4;

#数据源2

spring.datasource.druid.paytest.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.druid.paytest.url=jdbc:mysql://xxxxxxx:3306/pay

spring.datasource.druid.paytest.username=xxxx

spring.datasource.druid.paytest.password=xxxxxx

spring.datasource.druid.paytest.initial-size=2

spring.datasource.druid.paytest.max-active=10

spring.datasource.druid.paytest.min-idle=2

spring.datasource.druid.paytest.max-wait=30000

spring.datasource.druid.paytest.validation-query=SELECT EbeUyl1

spring.datasource.druid.paytest.validation-query-timeout=30000

spring.datasource.druid.paytest.min-evictable-idle-time-millis=300000

spring.datasource.druid.paytest.pool-prepared-statements=true

spring.datasource.druid.paytest.max-pool-prepared-statement-per-connection-size=20

spring.datasource.druid.paytest.test-on-borrow=false

spring.datasource.druid.paytest.test-on-return=false

spring.datasource.druid.paytest.test-while-idle=true

spring.datasource.druid.paytest.time-between-eviction-runs-millis=60000

spring.datasource.druid.paytest.filters=stat,wall

spring.datasource.druid.paytest.connection-properties=druid.stat.slowSqlMillis=5000

spring.datasource.druid.paytest.connection-init-sqls=set names utf8mb4;

创建DataSourceConfig

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

import com.github.pagehelper.PageInterceptor;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.*;

import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

import java.util.Properties;

/**

* @Auther: lqf

* @Date: 2018/5/22

* @Description:

*/

@Configuration

@EnableTransactionManagement

public class DevDataSourceConfig {

//数据源1 在springboot中做多中配置的时候需要 @Primary否则会报错,springboot需要知道主配置是什么

@Primary

@Bean("crmds")

@ConfigurationProperties("spring.datasource.druid.crmtest")

public DataSource crmDataSource() {

return DruidDataSourceBuilder.create().build();

}

//数据源2 @ConfigurationProperties("spring.datasource.druid.paytest")这个配置会自动引入你在配置文件中的配置

@Bean("payds")

@ConfigurationProperties("spring.datasource.druid.paytest")

public DataSource payDataSource() {

return DruidDataSourceBuilder.create().build();

}

}

上面是一个总的配置将不同的数据源都配置在了这一个configuration中。下面我们来建立单独的数据源配置(这里需要注意一点我们看上面引用的是druid,那么我们需要在pom文件中导入alibaba.druid包,在文章的最后面我会给大家展示一下pom文件)

数据源1

package com.mysql.test.demo.config;

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import oEbeUylrg.mybatis.spring.SqlSessionTemplate;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.io.Resource;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**

* @Auther: lqf

* @Date: 2018/5/23

* @Description:

*/

@Configuration

@MapperScan(basePackages = {"com.mysql.test.demo.dao.crm"}, sqlSessionTemplateRef = "crmSqlSessionTemplate")

public class CrmMysqlConfig implements ApplicationContextAware {

private ApplicationContext ctx;

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.ctx = applicationContext;

}

@Bean("crmSqlSessionFactory")

public SqlSessionFactoryBean crmSqlSessionFactory(@Qualifier("crmds") DataSource crmDataSource) throws http://Exception {

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

factoryBean.setDataSource(crmDataSource);

factoryBean.setTypeAliasesPackage("com.mysql.test.demo.entity.crm");

Resource[] resources = ctx.getResources("classpath*:/mapper/crm/*.xml");

factoryBean.setMapperLocations(resources);

return factoryBean;

}

@Bean("crmSqlSessionTemplate")

public SqlSessionTemplate crmSqlSessionTemplate(@Qualifier("crmSqlSessionFactory") SqlSessionFactory

sqlSessionFactory) {

return new SqlSessionTemplate(sqlSessionFactory);

}

@Bean("crmTxManager")

public DataSourceTransactionManager crmTxManager(@Qualifier("crmds") DataSource crmDataSource) {

return new DataSourceTransactionManager(crmDataSource);

}

}

上面的配置可以直接使用

路径需要更换成你的项目路径这里就不多说了,注重提下注解的含义吧。

@Configuration : 用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器

@MapperScan(): 指定要扫描的Mapper类的包的路径,sqlSessionTemplateRef :SqlSessionTemplate实现了SqlSession,这就是说要对MyBatis的SqlSession进行简易替换。SqlSessionTemplate通常是被用来替代默认的MyBatis实现的DefaultSqlSession,因为它不能参与到Spring的事务中也不能被注入,因为它是线程不安全的。相同应用程序中两个类之间的转换可能会引起数据一致性的问题

 @Qualifier:我的理解就是告诉指定具体引用那个bean,参考://jb51-/article/220973.htm

数据源2

package com.mysql.test.demo.config;

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.BeansException;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.io.Resource;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**

* @Auther: lqf

* @Date: 2018/5/23

* @Description:

*/

@Configuration

@MapperScan(basePackages = {"com.mysql.test.demo.dao.pay"}, sqlSessionTemplateRef = "paySqlSessionTemplate")

public class PayMysqlConfig implements ApplicationContextAware {

private ApplicationContext ctx;

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.ctx = applicationContext;

}

@Bean("paySqlSessionFactory")

public SqlSessionFactoryBean crmSqlSessionFactory(@Qualifier("payds") DataSource payDataSource) throws Exception {

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

factoryBean.setDataSource(payDataSource);

factoryBean.setTypeAliasesPackage("com.mysql.test.demo.entity.pay");

Resource[] resources = ctx.getResources("classpath*:/mapper/pay/*.xml");

factoryBean.setMapperLocations(resources);

return factoryBean;

}

@Bean("paySqlSessionTemplate")

public SqlSessionTemplate crmSqlSessionTemplate(@Qualifier("paySqlSessionFactory") SqlSessionFactory

sqlSessionFactory) {

return new SqlSessionTemplate(sqlSessionFactory);

}

@Bean("payTxManager")

public DataSourceTransactionManager crmTxManager(@Qualifier("payds") DataSource crmDataSource) {

return new DataSourceTransactionManager(crmDataSource);

}

}

在pom文件中添加generator-maven插件让我们来测试一下(文章最后展示全部pom文件)

org.springframework.boot

spring-boot-maven-plugin

org.mybatis.generator

mybatis-generator-maven-plugin

1.3.6

./src/main/resources/generatorConfig.xml

true

true

mysql

mysql-connector-java

${mysql.version}

agentapi

创建generatorConfig.properties文件放在resources目录下

//数据库连接路径

mysql.jdbc.connectionURL=jdbc:mysql://xxxxxx:3306/crm?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull

mysql.jdbc.userId=xxx

mysql.jdbc.password=xxx

//自动生成实体类路径包名

module.targetPackage=com.mysql.test.demo.entity.crm

//生成实体类路径位置

module.targetProject=src/main/java

//生成mapper.xml位置和包名

map.targetPackage=mapper

map.targetProject=src/main/resources

//生成DAO的包名和位置

client.targetPackage=com.mysql.test.demo.dao.crm

client.targetProject=src/main/java

创建generatorConfig.xml文件

PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

connectionURL="${mysql.jdbc.connectionURL}" userId="${mysql.jdbc.userId}"

password="${mysql.jdbc.password}">

connectionURL="${mysql.jdbc.connectionURL}" userId="${mysql.jdbc.userId}"

password="${mysql.jdbc.password}">

targetProject="${module.targetProject}">

targetProject="${module.targetProject}">

targetProject="${map.targetProject}">

targetProject="${map.targetProject}">

type="XMLMAPPER"

targetPackage="${client.targetPackage}" targetProject="${client.targetProject}">

type="XMLMAPPER"

targetPackage="${client.targetPackage}" targetProject="${client.targetProject}">

//你要生成的表

如果上面的配置都完成的话那么我们来自动生成一下

如上图打开maven projects如上图进行操作就可自动生成需要的mapper 实体 dao等信息。上图是生成了一个数据源的那么我们来生成第二个数据源中的表操作如上图,需要改变第二个数据源的位置信息等。(重复的事情就不做了和上面生成一样的道理,只是改些路径和对应的表名)

在下图两个数据源完全生成好后的目录结构

项目到这里就已经整合完成了,之后就可以正常的创建service,controller进行操作了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于JPA查询部分字段的相关事项
下一篇:RedisTemplate常用方法总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~