Mybatis批量更新注解形式(Mysql和Oracle)

Oracle:

@Mapper
public interface ContactsMapper {

    /*** 
     * @Description: 参考https://www.jb51.net/article/132823.htm (利用存储过程);
     * 利用存储过程主要是因为每条更新都是一个独立的sql,用“;”分开,而Oracle只支持"一条完整的sql";如“sql1;sql2”,会报无效字符错误,而批量删除恰好是这种格式;
     * Mysql和postgreSQ则没有这种问题
     * 非null非空字符串则更新
     * @Date: 2019-10-17
     */
    @Update(
            "<script>" +
                    "<foreach collection='list' item='item'  index='index' open='begin' close=';end;' separator=';' > " +
                    " update csp_appl_tel_list set" +
                    "<if test=\"item.name!=null and item.name!= ''\">name=#{item.name},</if>" +
                    "<if test=\"item.telNo!=null and item.telNo!= ''\">tel_no=#{item.telNo},</if>" +
                    "date_updated = sysdate" +
                    " where apply_no = #{item.applyNo} and loan_type = #{item.loanType}" +
                    "</foreach> " +
                    "</script>"
    )
    public void updateDataBitchOne(@Param("list") List<Map<String, Object>> list);


    /***
     * @Description: 方法二 (不对入参做校验)
     * @Date: 2019-10-18
     */
    @UpdateProvider(type = UpdateDataBitchTwo.class, method = "updateDataBitchTwo")
    public void updateDataBitchTwo(@Param("list") List<Map<String, Object>> list);

    public class UpdateDataBitchTwo {
        public String updateDataBitchTwo(@Param("list") List<Map<String, Object>> list) {
            StringBuilder sql = new StringBuilder();
            sql.append(" begin ");
            for (int i = 0; i < list.size(); i++) {
                String val = "update csp_appl_tel_list set ";
                sql.append(val);
                MessageFormat mf = new MessageFormat(
                        " name = #'{'list[{0}].name,jdbcType=VARCHAR},tel_no = #'{'list[{0}].telNo,jdbcType=VARCHAR},date_updated = sysdate " +
                                "where apply_no = #'{'list[{0}].applyNo,jdbcType=VARCHAR} and loan_type = #'{'list[{0}].loanType,jdbcType=VARCHAR} "
                );
                sql.append(mf.format(new Object[]{i + ""}));
                sql.append(";");
            }
            sql.append(" end;");
            return sql.toString();
        }
    }


    /***
     * @Description: 方法三 (非null非空字符串则更新)
     *  结合sql构造器对入参的校验相对比较灵活
     * @Date: 2019-10-18
     */
    @UpdateProvider(type = UpdateDataBitchThree.class, method = "updateDataBitchThree")
    public void updateDataBitchThree(@Param("list") List<Map<String, Object>> list);

    public class UpdateDataBitchThree {
        public String updateDataBitchThree(@Param("list") List<Map<String, Object>> list) {
            StringBuilder sql = new StringBuilder();
            sql.append(" begin ");
            for (int i = 0; i < list.size(); i++) {
                Map map = list.get(i);
                String sqlsub = new SQL() {
                    {
                        UPDATE("csp_appl_tel_list");
                        if (StringUtils.isNotBlank((String) map.get("name"))) {
                            SET("name = #'{'list[{0}].name,jdbcType=VARCHAR}");
                        }
                        if (StringUtils.isNotBlank((String) map.get("telNo"))) {
                            SET("tel_no = #'{'list[{0}].telNo,jdbcType=VARCHAR}");
                        }
                        SET("date_updated = sysdate ");
                        WHERE("apply_no = #'{'list[{0}].applyNo,jdbcType=VARCHAR} ");
                        WHERE("loan_type = #'{'list[{0}].loanType,jdbcType=VARCHAR} ");
                    }
                }.toString();
                MessageFormat mf = new MessageFormat(sqlsub);
                sql.append(mf.format(new Object[]{i + ""}));
                sql.append(";");
            }
            sql.append(" end ; ");
            return sql.toString();
        }
    }

    /***
     * @Description: 方法四:批量修改的内容一致,条件不同
     * 前三种方法的场景都是修改内容和条件都不相同
     * @Date: 2019-10-18
     */
    @Update(
            "<script>" +
                    "update csp_appl_tel_list b " +
                    "set b.loan_type = #{loanType},  date_updated = sysdate " +
                    "where b.apply_no in " +
                    "<foreach item = 'item' index = 'index' collection = 'list' open = '(' separator = ',' close = ')'>" +
                    "#{item}" +
                    "</foreach>" +
                    "</script>")
    int updateDataBitchFour(@Param("loanType") String loan_type, @Param("list") List<String> list);


}

 

MyBatis Plus是基于MyBatis的一个增强工具,通过提供更简洁、更方便的API,简化了对数据库的操作。相比于原生的MyBatisMyBatis Plus提供了更丰富的功能和更高效的性能。而OracleMySQL都是常见的关系型数据库,它们在底层实现原理和语法特性上有一些不同。 对于双数据源的配置,可以通过MyBatis Plus的多数据源配置来实现。首先,需要在配置文件中定义两个不同的数据源,分别对应OracleMySQL。可以使用不同的dataSource和transactionManager配置来指定每个数据源的连接和事务管理。 然后,在代码中使用@DS注解来指定具体是使用哪个数据源。@DS注解可以标记在类级别和方法级别,用来指定使用的数据源。例如,@DS("oracle")标记在类级别上,表示该类中的所有方法都使用Oracle数据源,而@DS("mysql")标记在方法级别上,表示该方法使用MySQL数据源。 通过这样的配置,就可以实现在同一个应用中同时使用OracleMySQL双数据源。在使用的过程中,可以根据业务需求灵活选择具体使用的数据库。同时,MyBatis Plus还提供了很多便捷的方法和功能,可以更方便地进行数据库操作。 总之,通过MyBatis Plus的多数据源配置,可以很方便地实现OracleMySQL双数据源的使用。这样的配置对于一些需要同时操作多个数据库的应用来说非常有用,可以满足不同业务需求的多样性。使用MyBatis Plus可以提高开发效率和代码质量,使数据库操作变得更简单和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值