简介

Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程。

基本特点

  1. 构建在强大的Java语言之上 并 添加了从Python,Ruby和Smalltalk等语言中学到的 诸多特征,例如动态类型转换、闭包和元编程(metaprogramming)支持。
  2. 为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
  3. 支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让代码变得易于阅读和维护。
  4. 受检查类型异常(Checked Exception)也可以不用捕获。
  5. Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单。
  6. 在开发Web,GUI,数据库或控制台程序时 通过 减少框架性代码 大大提高了开发者的效率。
  7. 支持单元测试和模拟(对象),可以 简化测试。
  8. 无缝集成 所有已经存在的 Java对象和类库。
  9. 直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。
  10. 支持函数式编程,不需要main函数。
  11. 一些新的运算符。
  12. 默认导入常用的包。
  13. 断言不支持jvm的-ea参数进行开关。
  14. 支持对对象进行布尔求值。
  15. 类不支持default作用域,且默认作用域为public。
  16. groovy中基本类型也是对象,可以直接调用对象的方法。

    动态类型

    类型对于变量,属性,方法,闭包的参数以及方法的返回类型都是可有可无的,都是在给变量赋值的时候才决定它的类型, 不同的类型会在后面用到,任何类型都可以被使用,即使是基本类型 (通过自动包装(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代码。

  17. 不需public修饰符

如前面所言,Groovy的默认访问修饰符就是public,如果Groovy类成员需要public修饰,则根本不用写它。

  1. 不需要类型说明

同样前面也说过,Groovy也不关心变量和方法参数的具体类型。

  1. 不需要getter/setter方法

在很多ide(如eclipse)早就可以为程序员自动产生getter/setter方法了,在Groovy中,不需要getter/setter方法—所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果一定要通过getter/setter方法访问成员属性,Groovy也提供了它们)。

  1. 不需要构造函数

不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的构造函数—由于是map类型,通过这个参数可以构造对象时任意初始化它的成员变量)。

  1. 不需要return

Groovy中,方法不需要return来返回值。

  1. 不需要()

Groovy中方法调用可以省略()(构造函数除外)。
Groovy 中的方法是使用返回类型或使用 def 关键字定义的。方法可以接收任意数量的参数。定义参数时,不必显式定义类型。可以添加修饰符,如 public,private 和 protected。默认情况下,如果未提供可见性修饰符,则该方法为 public。

在 Groovy 中导入语句

import 语句可以用来导入,可以让你的代码使用其他库的功能。这是通过使用在 Import 关键字完成。
下面的示例演示了如何使用 MarkupBuilder 的类,它可能是最常用的创建 HTML 或 XML 标记的类之一。
import groovy.xml.MarkupBuilder
def 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.BigInteger
import java.math.BigDecimal

身份标识

标识符被用来定义变量,函数或其他用户定义的变量。标识符以字母开头,美元或下划线。他们不能以数字开头。以下是有效标识符的一些例子
def employeename
def student1
def student_name

其中,DEF 是在 Groovy 用来定义标识符的关键字。

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)
}