Groovy,一个有趣的东西

当初作为一个毕业就使用Java的程序员,接触php时,非常的感慨:Java还TM做个毛中间件啊,LAMP平台啥都已经搞定了。再加上配合老左的Pylon框架,更是让我对Hibernate甚至ibatis鄙视到了尽头。当然,这也是因为我被“企业级”的Java给搞怕了,写个代码,其中一半时间在写xml的日子真是不堪回首。

最近有机会接触了一些Java路线上的新东西,我立刻被Groovy吸引到了。动态类型,简洁的语法,虽然for的语法有些蛋疼,但是闭包却让我欲罢不能。尤其是能够使用map初始化纯Pojo(或者应该叫Pogo?),对我简直有莫大的吸引。

玩了两下之后,我没有找到sql查询的resultset转map的方法~为啥啊为啥啊,能够通过map初始化pojo,却不能通过数据库的查询结果直接转换?!这不禁让我有些怀念起Pylon的DDA了,虽然那个里面老左也做了很多工作
:)。
于是自己顺手写了个小工具玩,拿出来显摆一下吧。

import groovy.sql.*
import java.sql.*;

class SqlRowsToMap {

   
    def static
toMap (row,clazz ){
   
   
def  map =[:]
   
    def props =
getProps(clazz)
   
    for(prop in
props){
   
   
   
//通过findColumn确定表中是否有与类的属性名相同的列
   
   
   
//这样通过try处理不好,会有性能问题,这个代码仅作为可行性实验。
   
   
    try{
   
   
   
   
row.findColumn(prop)
   
   
   
   
map.put(prop,row.getProperty(prop))
   
   
   
}catch(SQLException ex){
   
   
   
   
map.put(prop,null)
   
   
    }
   
    }
   
    map
    }
   
    def private
static getProps(clazz){
   
   
def  props=[];
   
   
clazz.getMetaClass().getProperties().each {
item->
   
   
   
if(item.name!=”class”&&item.name!=”metaClass”){

   
   
   
    props
<< item.name
   
   
    }
   
    }
   
    props
    }

}

class DBObject{
    def final
build(row){
   
    def map =
SqlRowsToMap.toMap(row,this.getClass());
   
   
map.each{prop,value->this.setProperty(prop,value)}

   
    this
    }
}

//测试代码
class user extends DBObject {
    def id
    def
name
    def
age
    def String
toString(){
   
    return
“USER: id = “+this.id+”;name = “+this.name+”;age =
“+this.age;
    }
   
}
def DBUSER = “root”
def DBPASS = “123”
def DBURL =
“jdbc:mysql://localhost:3306/groovytst?user=${DBUSER}&password=${DBPASS}”

def DBDRV = “com.mysql.jdbc.Driver”

def sql = Sql.newInstance(DBURL,DBDRV)
def list = []

//用法1,当user并非继承自DBObject的时候
sql.eachRow(“select * from users”) {row-> list
<< new
user(SqlRowsToMap.toMap(row,user))}
//用法2,当user继承自DBObject的时候
sql.eachRow(“select * from users”) {row-> list
<< new user().build(row)}

list.each {item->println item}