mybatis执行原生sql,并防止注入,并支持数据源动态切换(基于springboot)

需求1:使用mybatis执行一个任意的sql语句,参数注入。

比如这条sql语句可能是动态生成的,并且我们并不知道他返回的类型。我们可以用一个List>类型去接收:
我们写一个Mapper,


image.png

然后再写一个xml:


image.png

这样,就可以执行我们动态传递的sql语句了,并且每一行数据会自动装配成一个Map,查询出多少行数据就有多少个Map,Map键对应数据列名。

但这样有一个问题,就是参数不能防止注入了。
解决参数注入的方案:
我们改写Mapper方法定义:


image.png

xml内容不变。
不知道你看了注释是否有看明白,也就是说,参数也放入到Map这个对象中,需要防注入替换的地方直接用#{xxx}即可,Mybatis会动态替换。

需求2、不仅仅要实现原生sql的执行,还有支持切换数据源
(1)引入动态数据源相关依赖:

com.baomidou
dynamic-datasource-spring-boot-starter
2.5.1


com.alibaba
druid-spring-boot-starter
1.1.14
true

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

需求3、sql由模板配置动态传参进来,并且要支持动态标签的sql

@SelectProvider(type = SqlProvider.class, method = "buildSql")
List query(@Param("sql") String sql, @Param("param") Map fieldMap);

class SqlProvider {
    public String buildSql(Map map) {
        return "";
    }
}

希望对你有帮助

你可能感兴趣的:(mybatis执行原生sql,并防止注入,并支持数据源动态切换(基于springboot))