美文网首页技术方案SSMSpring cloud
mybatis执行原生sql,并防止注入,并支持数据源动态切换(

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

作者: 蒹葭残辉 | 来源:发表于2019-03-10 16:03 被阅读302次

    需求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

    希望对你有帮助

    相关文章

      网友评论

        本文标题:mybatis执行原生sql,并防止注入,并支持数据源动态切换(

        本文链接:https://www.haomeiwen.com/subject/dzoupqtx.html