iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >@InsertProvider执行的原理是什么
  • 624
分享到

@InsertProvider执行的原理是什么

2023-07-02 15:07:40 624人浏览 八月长安
摘要

本篇内容介绍了“@InsertProvider执行的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!@InsertProvider执

本篇内容介绍了“@InsertProvider执行的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

@InsertProvider执行原理

1.首先要拼接处insert语句

其中包含入参,与数据库表字段的映射字段。

在执行Provider类里面的动态插入sql的时候,程序会调用 AbstractSQL这个抽象类,执行里面的两个拼接字符串的方法

    public T INSERT_INTO(String tableName) {        this.sql().statementType = AbstractSQL.SQLStatement.StatementType.INSERT;        this.sql().tables.add(tableName);        return this.getSelf();    }     public T VALUES(String columns, String values) {        this.sql().columns.add(columns);        this.sql().values.add(values);        return this.getSelf();    }

这个抽象class里面有一个私有的静态类SQLStatement和私有静态SalfAppendable类。

SQLStatement类里面有一个共有静态枚举类,里面有它的一个私有构造函数,枚举被设计成是单例模式,即枚举类型会由JVM在加载的时候,实例化枚举对象,你在枚举类中定义了多少个就会实例化多少个,JVM为了保证每一个枚举类元素的唯一实例,是不会允许外部进行new的,所以会把构造函数设计成private,防止用户生成实例,破坏唯一性。

枚举类里面含有增删查改四种。私有的静态类SQLStatement有sql语句的各种关键字list,distinct是boolean类型,例如:

   List<String> sets = new ArrayList();

子类ArrayList实例化List,因为List是一个接口,所以只能依靠其“子类”(在这里是List的实现类)来进行实例化,这里的对象是List的对象。

  private void sqlClause(AbstractSQL.SafeAppendable builder, String keyWord, List<String> parts, String open, String close, String conjunction) {            if(!parts.isEmpty()) {                if(!builder.isEmpty()) {                    builder.append("\n");                }                 builder.append(keyword);                builder.append(" ");                builder.append(open);                String last = "________";                int i = 0;                 for(int n = parts.size(); i < n; ++i) {                    String part = (String)parts.get(i);                    if(i > 0 && !part.equals(") \nAND (") && !part.equals(") \nOR (") && !last.equals(") \nAND (") && !last.equals(") \nOR (")) {                        builder.append(conjunction);                    }                     builder.append(part);                    last = part;                }                 builder.append(close);            }         }

上面这个函数就是增删查改通用的sql解析函数。

下面是增调用的函数

  private String insertSQL(AbstractSQL.SafeAppendable builder) {            this.sqlClause(builder, "INSERT INTO", this.tables, "", "", "");            this.sqlClause(builder, "", this.columns, "(", ")", ", ");            this.sqlClause(builder, "VALUES", this.values, "(", ")", ", ");            return builder.toString();        }

通过下面的函数确定增删查改对应调用的函数

 public String sql(Appendable a) {            AbstractSQL.SafeAppendable builder = new AbstractSQL.SafeAppendable(a);            if(this.statementType == null) {                return null;            } else {                String answer;                switch(null.$SwitchMap$org$apache$ibatis$jdbc$AbstractSQL$SQLStatement$StatementType[this.statementType.ordinal()]) {                case 1:                    answer = this.deleteSQL(builder);                    break;                case 2:                    answer = this.insertSQL(builder);                    break;                case 3:                    answer = this.selectSQL(builder);                    break;                case 4:                    answer = this.updateSQL(builder);                    break;                default:                    answer = null;                }                 return answer;            }        }

私有静态SalfAppendable类是进行sql字符串的拼接。

里面有是一个私有不可以改变的Appendable对象。

 private static class SafeAppendable {        private final Appendable a;        private boolean empty = true;         public SafeAppendable(Appendable a) {            this.a = a;        }         public AbstractSQL.SafeAppendable append(CharSequence s) {            try {                if(this.empty && s.length() > 0) {                    this.empty = false;                }                 this.a.append(s);                return this;            } catch (IOException var3) {                throw new RuntimeException(var3);            }        }         public boolean isEmpty() {            return this.empty;        }    }

@InsertProvider执行的原理是什么

@InsertProvider执行的原理是什么

然后调用ProviderSqlSource类,接着调用不可变类MappedStatement类,再调用BaseStatementHandler类,--->PreparedStatementHandler等。

2.ProviderSqlSource实现了sqlSource接口

代表从注解中读取相关的映射语句的内容,它创建的sql会被传到数据库。

根据SQL语句的类型不同,mybatis提供了多种SqlSource的具体实现:

1)StaticSqlSource:最终静态SQL语句的封装,其他类型的SqlSource最终都委托给StaticSqlSource。

2)RawSqlSource:原始静态SQL语句的封装,在加载时就已经确定了SQL语句,没有、等动态标签和${} SQL拼接,比动态SQL语句要快,因为不需要运行时解析SQL节点。

3)DynamicSqlSource:动态SQL语句的封装,在运行时需要根据参数处理、等标签或者${} SQL拼接之后才能生成最后要执行的静态SQL语句。

4)ProviderSqlSource:当SQL语句通过指定的类和方法获取时(使用@XXXProvider注解),需要使用本类,它会通过反射调用相应的方法得到SQL语句

关于@Insert和@InsertProvider注解用法

@Insert和@InsertProvider都是用来在实体类的Mapper类里注解保存方法的SQL语句。

不同的是,@Insert是直接配置SQL语句,而@InsertProvider则是通过SQL工厂类及对应的方法生产SQL语句,这种方法的好处在于,我们可以根据不同的需求生产出不同的SQL,适用性更好。

1.项目主要结构

(1)项目中的实体类

(2)每个实体类对应的Mapper方法

(3)SQL工厂

@InsertProvider执行的原理是什么

2.下面以BlogMapper中的保存Blog实体方法为例

Blog实体类属性:

为了方便说明,属性不设置过多,假设Blog类的属性有blogId,title,author

(1)@Insert的注解方式

@Insert("insert into blog(blogId,title,author) values(#blogId,#title,#author)")public boolean saveBlog(Blog blog);

说明:由于我们不能确定哪些属性没有值,那只能把所有属性都写上了。

(2)@InsertProvider的注解方式

@InsertProvider(type = SqlFactory.class,method = "insertBlog")public boolean saveBlog(@Param("bean")Blog blog);

说明:type指明SQL工厂类,method是工厂类里对应的方法

SqlFactory类代码:

public class SqlFactory {     public String insertBlog(Map<String,Object> para){         Blog blog = (Blog)para.get("bean"); //         SQL sql = new SQL(); //SQL语句对象,所在包:org.apache.ibatis.jdbc.SQL         sql.INSERT_INTO("blog");         if(blog.getBlogId() != null){ //判断blogId属性是否有值            sql.VALUES("blogId", blog.getBlogId());        }         if(blog.getTitle() != null){//判断title属性是否有值            sql.VALUES("title", blog.getTitle());        }         if(blog.getAuthor() != null){//判断author属性是否有值            sql.VALUES("author", blog.getAuthor());        }         return sql.toString();} }

使用@InsertProvider的方式,可以根据实体中有值的属性,进行动态的生成插入SQL语句如:

  • blogId和title有值:insert into blog(blogId,title) values(v1,v2);

  • author和title有值:insert into blog(author,title) values(v1,v2);

总结:其实也就是说因为mybaits的xml中有<if test=""></if>标签来动态生成sql,但是在程序代码中没有办法这么做。

那么insertprovider就是充当了这样一个角色,来动态的生成sql。

与之类似的还有MyBatis注解的巧妙使用---@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider等等。

“@InsertProvider执行的原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: @InsertProvider执行的原理是什么

本文链接: https://www.lsjlt.com/news/342818.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • @InsertProvider执行的原理是什么
    本篇内容介绍了“@InsertProvider执行的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!@InsertProvider执...
    99+
    2023-07-02
  • 全面解析@InsertProvider执行原理
    目录@InsertProvider执行原理1.首先要拼接处insert语句2.ProviderSqlSource实现了sqlSource接口关于@Insert和@InsertProv...
    99+
    2024-04-02
  • Java的执行原理是什么
    这篇文章主要讲解了“Java的执行原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的执行原理是什么”吧!一、编写java源程序java源文件...
    99+
    2024-04-02
  • react fiber执行原理是什么
    本文小编为大家详细介绍“react fiber执行原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react fiber执行原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。为...
    99+
    2023-07-04
  • python程序的执行原理是什么
    这篇文章将为大家详细讲解有关python程序的执行原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.scrap...
    99+
    2023-06-14
  • PHP程序的执行原理是什么
    这篇文章将为大家详细讲解有关PHP程序的执行原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Ja...
    99+
    2023-06-14
  • spring中aop的执行原理是什么
    在Spring中,AOP(面向切面编程)的执行原理主要涉及以下几个方面:1. 切面的定义:通过注解或配置文件等方式,定义切面(Asp...
    99+
    2023-08-09
    spring aop
  • Vue3.0插件执行原理是什么
    这篇文章主要介绍“Vue3.0插件执行原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3.0插件执行原理是什么”文章能帮助大家解决问题。一、编写插件Vue项目能够使用很多插件来丰富自己...
    99+
    2023-06-29
  • python中try语句的执行原理是什么
    本篇文章为大家展示了python中try语句的执行原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络...
    99+
    2023-06-14
  • JavaScript中执行上下文的原理是什么
    这期内容当中小编将会给大家带来有关JavaScript中执行上下文的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。执行上下文执行上下文是当前代码的执行环境。执行上下文主要是三种类型:全局执行上下...
    99+
    2023-06-15
  • Left join的概念与执行原理是什么
    这篇文章给大家介绍Left join的概念与执行原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。join 是 SQL查询中很常见的一种操作,具体来讲有join,left joi...
    99+
    2024-04-02
  • MySQL中kill 指令的执行原理是什么
    这篇文章将为大家详细讲解有关MySQL中kill 指令的执行原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Kill 指令执行原理指令执行特点 一个语句执行过程中...
    99+
    2023-06-08
  • Linq内部执行原理是怎么样的
    这篇文章主要介绍了Linq内部执行原理是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linq内部执行原理LINQ(Language Integrated Query...
    99+
    2023-06-17
  • Servlet的运行原理是什么
    这篇文章主要介绍“Servlet的运行原理是什么”,在日常操作中,相信很多人在Servlet的运行原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Servlet的运行原理是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • mybatis的运行原理是什么
    MyBatis的运行原理主要涉及以下几个方面: 配置文件:MyBatis的配置文件(mybatis-config.xml)中配置...
    99+
    2024-04-02
  • JavaScript的运行原理是什么
    这篇文章将为大家详细讲解有关JavaScript的运行原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。扫描器源代码首先被分解成 chunk,每个 c...
    99+
    2024-04-02
  • laravel运行的原理是什么
    Laravel是一个基于PHP的开源Web应用框架,它的运行原理如下: 路由:Laravel使用路由来确定请求应该由哪个控制器处...
    99+
    2023-10-28
    laravel
  • 数据库执行计划原则是什么
    本篇内容介绍了“数据库执行计划原则是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • spring初始化方法的执行顺序及其原理是什么
    这篇文章主要讲解了“spring初始化方法的执行顺序及其原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring初始化方法的执行顺序及其原理是什么”吧!Spring中初始化方法的...
    99+
    2023-06-29
  • wepy运行原理是什么
    这篇文章主要讲解了“wepy运行原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“wepy运行原理是什么”吧!分析源码之前,我们先来回顾一下,wepy 的使用:<!-- ...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作