需求1:使用mybatis执行一个任意的sql语句,参数注入。
比如这条sql语句可能是动态生成的,并且我们并不知道他返回的类型。我们可以用一个List<Map<String,Object>>类型去接收:
我们写一个Mapper,
image.png
然后再写一个xml:
image.png
这样,就可以执行我们动态传递的sql语句了,并且每一行数据会自动装配成一个Map,查询出多少行数据就有多少个Map,Map键对应数据列名。
但这样有一个问题,就是参数不能防止注入了。
解决参数注入的方案:
我们改写Mapper方法定义:
image.png
xml内容不变。
不知道你看了注释是否有看明白,也就是说,参数也放入到Map这个对象中,需要防注入替换的地方直接用#{xxx}即可,Mybatis会动态替换。
需求2、不仅仅要实现原生sql的执行,还有支持切换数据源
(1)引入动态数据源相关依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
<optional>true</optional>
</dependency>
springboot 配置文件修改如下:
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master,如果你主从默认下主库的名称就是master可不定义此项。
datasource:
master:
url: 你的url
# 数据库连接用户名称
username: 你的数据库帐号
# 数据库连接用户密码
password: 你的数据库密码
driver-class-name: oracle.jdbc.OracleDriver
type: com.alibaba.druid.pool.DruidDataSource
在调用查询Mapper的Service层加入注解DS,这里DS支持使用spel表达式,也就是说,他的数据源名为方法里传入的dsName,这样就达到的动态切换的效果了。
image.png
当然,仅仅有dsName还不够,你还保证在之前存在指定dsName的数据源。
数据源动态添加方法:
image.png
在需要动态注入数据源的地方注入DynamicRoutingDataSource,使用addSource方法添加数据源:
image.png
希望对你有帮助
网友评论