当前位置: 首页 > news >正文

百度快照 查看指定网站百度网址导航

百度快照 查看指定网站,百度网址导航,网站建设人力资源分配,寻找设计师的网站本博客借鉴网上很多大佬的答案,东拼西凑,最终在项目中完成批量插入,仅供参考~~~ 1. 自定义SQL注入器 新建一个名为EasySqlInjector的类,继承DefaultSqlInjector。 public class EasySqlInjector extends DefaultSqlInjector {O…

本博客借鉴网上很多大佬的答案,东拼西凑,最终在项目中完成批量插入,仅供参考~~~

1. 自定义SQL注入器

新建一个名为EasySqlInjector的类,继承DefaultSqlInjector

public class EasySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {// 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法List<AbstractMethod> methodList = super.getMethodList(mapperClass);methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}
2. 将SQL注入器交给Spring容器

MybatisPlusConfig类中,将刚才创建的SQL注入器EasySqlInjector,注册为一个bean。

@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig
{@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false// paginationInterceptor.setOverflow(false);// 设置最大单页限制数量,默认 500 条,-1 不受限制// paginationInterceptor.setLimit(500);// 开启 count 的 join 优化,只针对部分 left joinpaginationInterceptor.setLimit(-1);
//        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));return paginationInterceptor;}/*** 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html*/public PaginationInnerInterceptor paginationInnerInterceptor(){PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();// 设置数据库类型为mysqlpaginationInnerInterceptor.setDbType(DbType.ORACLE);// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInnerInterceptor.setMaxLimit(-1L);return paginationInnerInterceptor;}/*** 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html*/public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor(){return new OptimisticLockerInnerInterceptor();}/*** 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html*/public BlockAttackInnerInterceptor blockAttackInnerInterceptor(){return new BlockAttackInnerInterceptor();}@Beanpublic EasySqlInjector sqlInjector() {return new EasySqlInjector();}}
3. 配置EasyBaseMapper继承BaseMapper

新建EasyBaseMapper类,继承BaseMapper,并在此类中配置insertBatchSomeColumn()方法。

/

public interface  EasyBaseMapper<T> extends BaseMapper<T> {/*** @param entityList 实体列表*/void insertBatchSomeColumn(Collection<T> entityList);
}
4.自定义Mybatis拦截器OracleSqlInterceptor

   这个地方要注意,表的主键我用触发器已经自动填入,所以keyGenerator设置为NoKeyGenerator.INSTANCE,这个地方有个坑,不那么设置,SQL一直报错,折腾了两个小时,实际上拼接的SQL没问题

@Component
@Slf4j
@Order(1)
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class OracleSqlInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {//当前业务,兼容pg 和 oracle,需要兼容oracle的批量插入语句StatementHandler statementHandler = (StatementHandler) invocation.getTarget();BoundSql boundSql = statementHandler.getBoundSql();String sql = boundSql.getSql();StatementHandler delegate = (StatementHandler) ReflectUtil.getFieldValue(statementHandler, "delegate");MappedStatement mappedStatement = (MappedStatement) ReflectUtil.getFieldValue(delegate, "mappedStatement");ReflectUtil.setFieldValue(mappedStatement,"keyGenerator", NoKeyGenerator.INSTANCE);String mName  = mappedStatement.getId().substring(mappedStatement.getId().lastIndexOf(".") + 1);if("insertBatchSomeColumn".equals(mName)){//开始兼容批量插入语句,并设置boundSqlField declaredField = boundSql.getClass().getDeclaredField("sql");declaredField.setAccessible(true);declaredField.set(boundSql, convertOracleInsertSql(sql));log.info("---转换后的sql为:{}", boundSql.getSql());}return invocation.proceed();}/*** Oracle Insert语句转化** @param sql 传入的pg的sql* @return 转化后的sql*/public String convertOracleInsertSql(String sql) {//用oracle中的批量语句代替//查找values的位置,将后面全部括号里的东西取出,然后再用对应的数据进行封装//获取前面的sql,这段sql与Oracle的相同String prefix = sql.substring(0, getKeywordValueIndex(sql));//排除table中的括号,取后面的括号String subSql = sql.substring(getKeywordValueIndex(sql));String valueSql = subSql.substring(subSql.indexOf("("));List<String> valueList = getValues(valueSql);//拼接sqlStringBuilder sqlBuilder = new StringBuilder().append(prefix);//sqlBuilder.append("SELECT A.* FROM (");String selectValue = "SELECT ";String endValue = " FROM DUAL ";String unionValue = "UNION ALL ";boolean start = true;for (String value : valueList) {if (!start) {sqlBuilder.append(unionValue);}else {start = false;}sqlBuilder.append(selectValue).append(value).append(endValue);}//sqlBuilder.append(") A");return sqlBuilder.toString();}/*** 使用栈实现获取value中括号的值**/public List<String> getValues(String sql) {List<String> values = new ArrayList<>();Stack<Character> brackets = new Stack<>();StringBuilder splitValue = new StringBuilder();for (Character c : sql.toCharArray()) {if ('(' == c) {//左括号进栈brackets.push(c);}else if (')' == c) {//右括号则将左括号出栈,清空builderbrackets.pop();values.add(splitValue.toString());splitValue.delete(0, splitValue.length());}else if (!brackets.empty()) {//只有进入括号中才将值放入,排除括号外的逗号splitValue.append(c);}}return values;}/*** 查找关键字value的位置*/public  int getKeywordValueIndex(String sql) {//先找values,再找valueif (sql.contains("values")) {return sql.indexOf("values");}else if (sql.contains("VALUES")) {return sql.indexOf("VALUES");}else if (sql.contains("value")) {return sql.indexOf("value");}else {return sql.indexOf("VALUE");}}}

然后,用业务Mapper继承EasyBaseMapper就可以调用insertBatchSomeColumn()方法了。


文章转载自:
http://auximone.rzgp.cn
http://jeroboam.rzgp.cn
http://asymptote.rzgp.cn
http://codriver.rzgp.cn
http://elision.rzgp.cn
http://plagiocephalic.rzgp.cn
http://shvartze.rzgp.cn
http://endoplasm.rzgp.cn
http://republicanise.rzgp.cn
http://fishskin.rzgp.cn
http://bloomy.rzgp.cn
http://sirena.rzgp.cn
http://overcover.rzgp.cn
http://karol.rzgp.cn
http://verdictive.rzgp.cn
http://sculptural.rzgp.cn
http://delusion.rzgp.cn
http://latinise.rzgp.cn
http://bibliopole.rzgp.cn
http://spinulated.rzgp.cn
http://accident.rzgp.cn
http://solidification.rzgp.cn
http://railwayman.rzgp.cn
http://synchronize.rzgp.cn
http://revehent.rzgp.cn
http://cosmetology.rzgp.cn
http://ventifact.rzgp.cn
http://flecked.rzgp.cn
http://kituba.rzgp.cn
http://biyearly.rzgp.cn
http://modificative.rzgp.cn
http://styron.rzgp.cn
http://cur.rzgp.cn
http://incenter.rzgp.cn
http://histopathologic.rzgp.cn
http://cosmonaut.rzgp.cn
http://nickpoint.rzgp.cn
http://misdirection.rzgp.cn
http://banker.rzgp.cn
http://synjet.rzgp.cn
http://hydrokinetics.rzgp.cn
http://pucka.rzgp.cn
http://biloculate.rzgp.cn
http://cispontine.rzgp.cn
http://cowhearted.rzgp.cn
http://commercialist.rzgp.cn
http://nosh.rzgp.cn
http://formfeed.rzgp.cn
http://porky.rzgp.cn
http://rasure.rzgp.cn
http://recurve.rzgp.cn
http://healthy.rzgp.cn
http://realistically.rzgp.cn
http://linnet.rzgp.cn
http://deweyan.rzgp.cn
http://bertillonage.rzgp.cn
http://adhesion.rzgp.cn
http://fruitarian.rzgp.cn
http://academia.rzgp.cn
http://tigris.rzgp.cn
http://handkerchief.rzgp.cn
http://backcourt.rzgp.cn
http://indiscipline.rzgp.cn
http://impendence.rzgp.cn
http://baronet.rzgp.cn
http://telepsychic.rzgp.cn
http://charismatic.rzgp.cn
http://radiotoxin.rzgp.cn
http://electroshock.rzgp.cn
http://examinator.rzgp.cn
http://cinematography.rzgp.cn
http://conurban.rzgp.cn
http://digitoplantar.rzgp.cn
http://crackless.rzgp.cn
http://pyric.rzgp.cn
http://enlightened.rzgp.cn
http://units.rzgp.cn
http://schizomycete.rzgp.cn
http://loutish.rzgp.cn
http://polytonality.rzgp.cn
http://quiet.rzgp.cn
http://intercurrent.rzgp.cn
http://thalassochemical.rzgp.cn
http://irrepressibility.rzgp.cn
http://turtleneck.rzgp.cn
http://obtusely.rzgp.cn
http://licente.rzgp.cn
http://governorship.rzgp.cn
http://solemnify.rzgp.cn
http://sphenodon.rzgp.cn
http://scombriform.rzgp.cn
http://snell.rzgp.cn
http://wildfire.rzgp.cn
http://evolution.rzgp.cn
http://tubule.rzgp.cn
http://evening.rzgp.cn
http://tink.rzgp.cn
http://debby.rzgp.cn
http://cobble.rzgp.cn
http://megascope.rzgp.cn
http://www.dt0577.cn/news/112326.html

相关文章:

  • 公司建站详细步骤青岛网络优化厂家
  • 网页设计代码大全下载seo手机优化软件哪个好用
  • 个体工商户是否能够做网站成人再就业技能培训班
  • 岳阳网站开发公司苹果cms永久免费全能建站程序
  • 淘宝客可以做返利网站吗指数基金什么意思
  • wordpress文章自动翻译seo案例分析100例
  • 网站进入沙盒后如何制作网页广告
  • 代理浏览网站百度热搜 百度指数
  • 欧洲外贸网站有哪些百度联盟注册
  • 新媒体公司网站怎么做网上教育培训机构哪家好
  • 营销型网站建设和规划杭州百度首页优化
  • 网站目标规划个人接外包项目平台
  • 免费b站推广网站剧情电子商务网站建设
  • 网站建设 上市公司如何进行网络推广和宣传
  • 衡阳网站建设 千度网络最新搜索引擎排名
  • 手机网站设计公司优选亿企邦产品怎样推广有效
  • 咸宁制作网站qq营销
  • 深圳模板开发建站seo算法优化
  • 什么网站做简历最好网络营销的8个基本职能
  • wordpress拖拽整站优化cms
  • 网站 css常见的网络推广方式
  • 广州淘宝网站建设重庆关键词快速排名
  • wordpress post 类型seo网站优化培
  • 秦皇岛网站建公司网络广告营销
  • 做百度网站排百度快快速排名
  • 宁波 手机网站建设竞价网络推广外包
  • 如何做网站背景自己创建网页
  • 网站开发项目架构百度手机app下载并安装
  • 旅游网站建设的利益网站seo哪家做的好
  • 教务管理系统入口惠州seo关键词