1.项目创建
创建一个Spring Boot 项目工程,并且添加Mybatis、web以及相关数据源依赖(此处只选择了Mysql依赖):
或者在现有项目中,添加相关依赖,比如:mysql依赖以及postgresql依赖:
1 | <dependency> |
然后添加数据库连接池Druid依赖,此处整合JdbcTemplate时也是要添加Druid依赖,但是要添加Spring Boot打造的Druid,不能使用传统的Druid。
1 | <dependencies> |
2.双数据源配置
设置双数据源配置,在项目中application.yml中配置数据库基本信息,然后提供两个DataSource即可。application.yml中的配置如下:
1 | spring: |
之后创建两个DataSource的提供来源:
1 | import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; |
3.MyBatis配置
对于Mybatis的配置,相对于JdbcTemplate的配置是有那么麻烦一点,因为要根据不同的数据源设置不同的SqlSessionFactory和SqlSessionTemplate这两个bean,故每个数据源都要单独配置。
3.1 配置第一个数据MyBatis配置:
1 | import org.apache.ibatis.session.SqlSessionFactory; |
在定义SqlSessionFactoryBean的时候,dataSource属性是必须指定的,它表示用于连接数据库的数据源。当然,也可以指定一些其他的属性,下面简单列举几个:
(1)mapperLocations:它表示我们的Mapper文件存放的位置,当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。
(2)configLocation:用于指定Mybatis的配置文件位置。如果指定了该属性,那么会以该配置文件的内容作为配置信息构建对应的SqlSessionFactoryBuilder,但是后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
(3)typeAliasesPackage:它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。(value的值一定要是包的全名)
(4)typeAliases:数组类型,用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名,前提是该类上没有标注@Alias注解,否则将使用该注解对应的值作为此种类型的别名。(value的值一定要是类的完全限定名)
1 | org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); |
设置驼峰式命名映射规则,在单数据源的时候,可以不用设置。SqlSessionFactoryBean会自动读取appliaction.yml配置文件中的参数(如下代码)来设置。但如果有多个数据源时,SqlSessionFactoryBean默认都会主数据源设置驼峰映射规则,而从数据源无法映射。故需要手动给从数据源设置(但建议每个数据源都设置上)。否则会导致某个数据源结果映射正常,但另一个数据源结果映射失败。
1 | mybatis: |
3.2 配置第二个数据MyBatis配置:
与第一个数据源的配置方式类似,配置第二个数据源配置,只需要修改启动的相关mapper路径与DataSource来源即可:
1 | import org.apache.ibatis.session.SqlSessionFactory; |
4.实体类创建
4.1 创建数据源1 PostgreSql的表结构与相关实体类
数据库表创建并添加值:
1 | CREATE TABLE "public"."yq_user" ( |
数据库内容:
id | name | account | password |
---|---|---|---|
1 | 游强 | yq | admin |
相关实体类User,service,mapper等自行创建。
4.2 创建数据源2 MySql的表结构与相关实体类
数据库表创建并添加值:
1 | CREATE TABLE `yq_user` ( |
数据库内容:
id | name | account | password |
---|---|---|---|
2 | 秦音 | qy | admin |
相关实体类User,service,mapper等自行创建。
两个数据相关配置创建成功后,结构如下图:
本项目只是一个demo,故没有service层,且没有将两个数据源的实体类User没有区分开,都共用一个User(因为两个数据源的查询结构返回值都是一样的字段属性),用户可根据业务情况自行扩展。
当个数据源的mapper文件需要分开放置在不同的包下,因为在配置数据源时,会指定当前数据源去扫描那一个mapper,故需要将不同数据源的mapper文件放在不同的包下,但mapper对应的xml文件不受该限制。
5.测试效果
在同一个controller中引用两个不同数据源的mapper,来查询数据:
1 | 4j |
查询结果:
1 | [ |
6.遇到的问题
6.1 启动报错
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.qinyin.datasource.pgsqlMapper.getOne
即mapper中的接口方法没有找到其实现方法,即没有映射到xml文件中去。
原因:在启动的时候,Spring Boot默认把PgsqlUserMapper和MysqlUserMapper中的xml文件过滤掉了。
解决办法:
第一种:硬办法,将xml文件中的查询语句写在mapper文件中,采用@Sercelt(“”) 、@Insert(“”)等方法来操作;
第二种:让SpringBoot不过滤相关xml文件
在pom文件中build节点中添加如下配置:
1 | <build> |
同时,在数据源配置类中(比如:MybatisConfigPgSql)创建sqlSessionFactory时,添加配置:
1 | /** |
然后把项目中的target删掉,重新启动。
6.2 项目启动时,数据库连接警告
Sun Aug 05 21:18:18 CST 2018 WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
警告显示:不建议在没有服务器身份验证的情况下建立SSL连接,需要通过设置useSSL=false显式禁用SSL
解决办法:在application.yml文件的数据源url中添加useSSL=false
1 | mysqldatasource: |
出现下面的错误,在后面加上“?serverTimezone=GMT%2B8”(在数据库的连接url上设置),设置下时区即可。
参考链接:
Druid 多数据源支持.md