简介
Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程。
基本特点
- 构建在强大的Java语言之上 并 添加了从Python,Ruby和Smalltalk等语言中学到的 诸多特征,例如动态类型转换、闭包和元编程(metaprogramming)支持。
- 为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
- 支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让代码变得易于阅读和维护。
- 受检查类型异常(Checked Exception)也可以不用捕获。
- Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单。
- 在开发Web,GUI,数据库或控制台程序时 通过 减少框架性代码 大大提高了开发者的效率。
- 支持单元测试和模拟(对象),可以 简化测试。
- 无缝集成 所有已经存在的 Java对象和类库。
- 直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。
- 支持函数式编程,不需要main函数。
- 一些新的运算符。
- 默认导入常用的包。
- 断言不支持jvm的-ea参数进行开关。
- 支持对对象进行布尔求值。
- 类不支持default作用域,且默认作用域为public。
-
动态类型
类型对于变量,属性,方法,闭包的参数以及方法的返回类型都是可有可无的,都是在给变量赋值的时候才决定它的类型, 不同的类型会在后面用到,任何类型都可以被使用,即使是基本类型 (通过自动包装(autoboxing)). 当需要时,很多类型之间的转换都会自动发生,比如在这些类型之间的转换: 字符串(String),基本类型(如int) 和类型的包装类 (如Integer)之间,可以把不同的基本类型添加到同一数组(collections)中。
闭包
闭包就是可以使用参数的代码片段,每个闭包会被编译成继承groovy.lang.Closure类的类,这个类有一个叫call方法,通过该方法可以传递参数并调用这个闭包.它们可以访问并修改在闭包创建的范围内的变量,在闭包内创建的变量在闭包被调用的范围内同样可以被引用, 闭包可以保存在变量中并被作为参数传递到方法中。
语法
Groovy 语法与Java 语言的语法很相似,虽然 Groovy 的语法源于Smalltalk和Ruby这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby与 Groovy 不同,因为它的语法与 Java 语法差异很大。)
许多 Java 开发人员喜欢 Groovy 代码和 Java 代码的相似性。从学习的角度看,如果知道如何编写 Java 代码,那就已经了解 Groovy 了。Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java 代码更少。类
Groovy类和java类一样,完全可以用标准java bean的语法定义一个Groovy类。但作为另一种语言,可以使用更Groovy的方式定义类,这样的好处是,可以少写一半以上的javabean代码。
不需public修饰符
如前面所言,Groovy的默认访问修饰符就是public,如果Groovy类成员需要public修饰,则根本不用写它。
- 不需要类型说明
同样前面也说过,Groovy也不关心变量和方法参数的具体类型。
- 不需要getter/setter方法
在很多ide(如eclipse)早就可以为程序员自动产生getter/setter方法了,在Groovy中,不需要getter/setter方法—所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果一定要通过getter/setter方法访问成员属性,Groovy也提供了它们)。
- 不需要构造函数
不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的构造函数—由于是map类型,通过这个参数可以构造对象时任意初始化它的成员变量)。
- 不需要return
Groovy中,方法不需要return来返回值。
- 不需要()
Groovy中方法调用可以省略()(构造函数除外)。
Groovy 中的方法是使用返回类型或使用 def 关键字定义的。方法可以接收任意数量的参数。定义参数时,不必显式定义类型。可以添加修饰符,如 public,private 和 protected。默认情况下,如果未提供可见性修饰符,则该方法为 public。
在 Groovy 中导入语句
import 语句可以用来导入,可以让你的代码使用其他库的功能。这是通过使用在 Import 关键字完成。
下面的示例演示了如何使用 MarkupBuilder 的类,它可能是最常用的创建 HTML 或 XML 标记的类之一。import groovy.xml.MarkupBuilderdef xml = new MarkupBuilder()
默认情况下,Groovy 在代码中包括以下库,因此您不需要显式导入它们。import java.lang.*import java.util.*import java.io.*import java.net.*import groovy.lang.*import groovy.util.*import java.math.BigIntegerimport java.math.BigDecimal
身份标识
标识符被用来定义变量,函数或其他用户定义的变量。标识符以字母开头,美元或下划线。他们不能以数字开头。以下是有效标识符的一些例子 def employeenamedef student1def student_name
Groovy 方法
最简单的方法是没有参数的方法,如下所示:def methodName() {//Method code}
下面是一个简单方法的例子
def DisplayName() {println("This is how methods work in groovy");println("This is an example of a simple method");}
在上面的例子中,DisplayName 是一个简单的方法,它由两个 println 语句组成上述方法的输出将是 -
This is how methods work in groovy
This is an example of a simple method
方法参数
如果一个方法的行为由一个或多个参数的值确定,则它通常是有用的。我们可以使用方法参数将值传递给被调用的方法。请注意,参数名称必须彼此不同。
使用参数的最简单的方法类型,如下所示 −def methodName(parameter1, parameter2, parameter3) {// Method code goes here}
以下是使用参数的简单方法的示例def ``sum(int a,int b) {int c = a+b;println(c);}
在这个例子中,我们创建一个带有 2 个参数 a 和 b 的 sum 方法。两个参数都是 int 类型。
方法返回值
方法也可以将值返回到调用程序。 这在现在编程语言中是必需的,其中方法执行某种计算,然后将所需值返回到调用方法。
下面是一个带有返回值的简单方法的例子。def sum(int a,int b) {int c = a+b;return c;}
部分Groovy脚本例子
与数据库交互
def ``select() {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)sql.rows(``'select * from gc_user_role'``) { row ->println(row)}sql.close()}<br /><br />def ``query() {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)ArrayList res = sql.rows(``'select * from gc_user_role'``)println(res)sql.close()}<br />def ``queryEntity(String querySql) {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)ArrayList res = sql.rows(querySql)println(res)sql.close()}def ``insert() {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)``def ``str = ``'insert into vm_service(id,name,del_flag) values(?,?,?)'<br />`` ``def ``params = [``'5555'``, ``'``测试插入``'``, ``0``]``//``返回主键<br />`` ``def ``id = sql.executeInsert(str, params)println(id[``0``])}def ``saveEntity(String entityid,String name,String delFlag) {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)``def ``str = ``'insert into vm_service(id,name,del_flag) values(?,?,?)'<br />`` ``def ``params = [entityid, name, delFlag]``//``返回主键<br />`` ``def ``id = sql.executeInsert(str, params)println(id[``0``])}<br />def ``update() {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)``def ``str = ``'update vm_service set name=? where id =1'<br />`` ``def ``params = [``"``测试数据``"``]``//``返回主键<br />`` ``def ``id = sql.executeUpdate(str, params)println(id)}def ``editEntity(String name) {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)``def ``str = ``'update vm_service set name=? where id =1'<br />`` ``def ``params = [name]``//``返回主键<br />`` ``def ``id = sql.executeUpdate(str, params)println(id)}<br />def ``delete() {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)``def ``str = ``'delete from vm_service where id = ?'<br />`` ``def ``params = [``"4"``]``//``返回主键<br />`` ``def ``id = sql.execute(str, params)println(id)}def ``deleteEntity(String entityId) {``def ``sql = Sql.``_newInstance_``(``'jdbc:mysql://192.168.80.219:3306/gc_cloud_starter'``,``'用户名'``, ``'用户密码'``)``def ``str = ``'delete from vm_service where id = ?'<br />`` ``def ``params = [entityId]``//``返回主键<br />`` ``def ``id = sql.execute(str, params)println(id)}
获取日期时间
def ``date() {DateUtil.``_date_``()``//``获取当前时间<br />`` ``def ``now = DateUtil.``_format_``(``new ``Date(), ``"yyyy-MM-dd HH:mm:ss"``)``def ``today = DateUtil.``_today_``()``//``获取当前日期的年、月、日、周几<br />`` ``def ``year = DateUtil.``_year_``(``new ``Date())``def ``month = DateUtil.``_month_``(``new ``Date())``def ``dayOfMonth = DateUtil.``_dayOfMonth_``(``new ``Date())``def ``dayOfWeek = DateUtil.``_dayOfWeek_``(``new ``Date())``//``当前时间的时间戳<br />`` ``def ``current = DateUtil.``_currentSeconds_``()``//``字符串转``Date<br />`` ``Date parse1 = DateUtil.``_parse_``(``"2020-01-01 23:30:30"``)Date parse2 = DateUtil.``_parse_``(``"2020-01-01"``)Date parse3 = DateUtil.``_parse_``(``"2020/01/01"``)println(now + today + year + month + dayOfMonth + dayOfWeek + current + parse1 + parse2 + parse3)}
