‘壹’ 真正的Mybatis动态sql —MyBatis Dynamic SQL
这个库是一个用于生成动态SQL语句的框架。可以将它看作是一个类型安全的sQL模板库,它提供了对MyBatis3和Spring JDBC模板的额外支持。该库将生成供MyBatis或Spring使用的格式化的fuL LETE INET、SELECT和UPDATE语句。最常见的用例是生成可以直接由MyBatis使用的语句和一组数学参数。该库还将生成与Spring JDBC模板兼容的语句和参数对象。该库通过实现一个类似SQL的DSL来工作,该DSL创建一个对象,该对象包含完整的SQL语句和该语句所需的任何参数。
https://github.com/mybatis/mybatis-dynamic-sql
https://mybatis.org/mybatis-dynamic-sql/docs/introction.html
org.mybatis.dynamic.sql.SqlTable 表定义包括表的实际名称(包括适当的模式)。如果需要,可以在选择语句中应用表别名。你的Table应该继承SqlTable 类。
org. mybatiss .dynamic.sql. sqlcolumn 用于定义在库中使用的列。应该使用SqlTable中的构建器方法创建SqlColumns。列定义包括:
我们建议使用以下使用模式以提供最大的灵活性。这个模式允许您以“限定”或“非限定”的方式使用表和列名,这看起来像自然的SQL。例如,在下面的列中,一个列可以被称为 firstName 或 user.firstName 。
该库将创建用作 MyBatis mapper 输入的类。这些类包括生成的SQL,以及与生成的SQL匹配的参数集。这两者都是MyBatis所要求的。这些对象应该是 MyBatis mapper 方法的唯一参数。
(注意: MyBatis Dynamic SQL 不需要XML文件就能工作的很好,但并不意味着不支持XML,毕竟 **MyBatis **最初被设计为是一个 XML 驱动的框架。当你使用关联查询,需要复杂的映射,那么使用XML 与 MyBatis Dynamic SQL 结合起来或者是更好选择,你的XML或许只需要包含一些)
‘贰’ 静态的SQL 和动态的SQL有什么区别
静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。
动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。
‘叁’ 请问sql中怎么实现字段的动态查询
用动态sql即可实现。
如student表中有如下内容:
‘肆’ 动态SQL是什么什么是静态SQL,动态SQL的动态体现在哪里
首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程。
在某种高级语言中,如果嵌入了SQL语句,而这个SQL语句的主体结构已经明确,例如在Java的一段代码中有一个待执行的SQL“select * from t1 where c1>5”,在Java编译阶段,就可以将这段SQL交给数据库管理系统去分析,数据库软件可以对这段SQL进行语法解析,生成数据库方面的可执行代码,这样的SQL称为静态SQL,即在编译阶段就可以确定数据库要做什么事情。
而如果嵌入的SQL没有明确给出,如在Java中定义了一个字符串类型的变量sql:String sql;,然后采用preparedStatement对象的execute方法去执行这个sql,该sql的值可能等于从文本框中读取的一个SQL或者从键盘输入的SQL,但具体是什么,在编译时无法确定,只有等到程序运行起来,在执行的过程中才能确定,这种SQL叫做动态SQL。例如每一种数据库软件都有能够执行SQL语句的界面,那个界面接收的SQL就是动态SQL,因为数据库厂商在做这个界面时,并不知道用户会输入哪些SQL,只有在该界面执行后,接收了用户的实际输入,才知道SQL是什么。
另外还要注意一点,在SQL中如果某些参数没有确定,如"select * from t1 where c1>? and c2<?",这种语句是静态SQL,不是动态SQL,虽然个别参数的值不知道,但整个SQL的结构已经确定,数据库是可以将它编译的,在执行阶段只需将个别参数的值补充进来即可。
‘伍’ SQL行转列应用的动态实现方式
SQL行转列的需求,在项目中还是经常可见的,尤其报表类的应用,更是非常广泛!上期我们讲了SQL行转列的静态实现方式,本期搞一下行转列的动态实现方案,解决方案并不唯一,这里采用存储过程的实现方式!
接下来我们详细讲解下SQL动态行转列的实现步骤:
这里还是老套路,IT编程人入门的经典学生选课表系列,学生表、课程表、成绩表!就拿这套耳熟能详的表结构进行讲解!
插入模拟的数据,用于动态行转案例的使用!
这一步相对还是比较重要,毕竟我们要在一个静态的行转列基础之上,构建动态的行转列应用,课程数据会有动态变化,学生也会选择新开的课程,这样静态模式势必不会有效,但参照静态模板,去开发动态的模式,则更加有参照性!
通过测试,数据效果没有问题,正是我们期待的样子!
动态行转列无疑需要使用SQL编程的技术,动态的递归课程名称,这样才可以一劳永逸的解决问题!
先编写动态的SQL脚本:
测试结果与静态SQL完全一致,看来问题已经解决,接下来就是优化的问题了!
将上述的动态脚本封装成存储过程,第一可以尽量地提升查询效率,第二方便代码段的调用!
封装完存储过程,我们再执行一下,看看结果!果然没有任何问题,与预期完全一致!
这时候我们更改一下数据,课程表中新增物理、化学两门课程,诺克萨斯之手分别选择了两门课程,盖伦仅仅选择了化学,武器大师逃学,俩门课都没有选择。
数据改变之后,我们继续测试一下,再次执行我们编写好的存储过程,结果非常完美,随着数据的变化,查询的结果集也是对应的变化,非常NICE,大功告成了!
连续俩篇的文章更新,SQL行转列在项目中的应用都已经涵盖了。即将步入年底了,肯定有很多小伙伴被客户、领导追着搞各种报表,希望对小伙伴们有些许的帮助。#学编程# #互联网# #IT#