antlr3学习以及简单的应用--使用sql语句查询集合中的对象

 

  其实 很早之前就想学习这个了antlr,可是因为种种原因,一直到最近才有时间来学,本来这篇文章应该是在年前写的,结果刚好回家去了,而家里又没有电脑‍.

       说了这么多废话,现在进入正题!antlr它是一个词法和语法的解析工具,你可以理解它为一个解析一门语言结构的工具,这里的语言不仅仅包括了常用的计算机语言,即使是你自己发明的语言,只要你能将这种语言描述出来,就可以用它来解析,强大吧^ ^ .所以,我一般把它当做一个"翻译家",使用它可以实现不用语言之间的交流,所以,I have a dream,所有的计算机语言是不是可以有统一的一天,至少语法和常用api是统一的???

        其实,在hibernate中也可以看到它的身影,强大的hql,就是基于antlr来实现的,实际上基于之前我说的,你可以理解为它自己发明了一种语言,并将这门语言和sql进行了翻译.

        接下来,我简单的介绍一下antlr的使用吧.(以下都以antlr-3.4为例)

        首先,我们想象一下,如果我们学习一门语言(无论是计算机语言还是自然语言),是不是首先要学习这门语言的词法和语法??这里说的词法就是一门语言的基本组成元素,比如我们英文中的单词,计算机语言中的关键字,而语法,就不用我说了吧.所以,如果我们希望antlr能学会一门语言就需要让它知道这两个元素的组成结构.而这两个元素在antlr中对应的是语法解析器和词法解析器.   

        我们要开始写这两个解析器了,首先我们要知道一些基本知识,语言描述文件一般是写在一个.g为后缀的文件中,而语法解析器的名字一般以小写开头,而词法解析器一般以大写开头

        具体怎么写,我这里就不介绍了,这里推荐一篇文章吧http://chzhou.blog.sohu.com/116306746.html

        到这里,我假定你已经对antlr有一定的了解了( 众人: - -!!! ),接下来,我将实现一个通过sql语句来查询java中对象集合的功能,比如我们可能经常需要在一个对象集合中,获取某个属性的集合,或者说我们需要找到符合某种条件的对象.

        (1)写出语法文件(因为我的需求比较简单,所以我解析的也是简单的sql语句,形如select field1,field2 from table1 where field1 = 'aaa'这样的),文件中附件中的QuerySql.g

       (2)配合生成的QuerySqlLexer,QuerySqlParser并利用反射来实现需求

       (3)测试下我们的代码

      @Test

	public void testQueryFromPojoList_selectSome() throws Exception {
		List<MockUser> users = Arrays.asList(new MockUser(1,"tom",new Date()),new MockUser(2,"jerry",new Date()));
		List<Map<String, ?>> result = converter.queryFromPojoList("select id,name from users where name='tom'", users);
		System.out.println("testQueryFromPojoList_selectSome:" + result);
	} 

      MockUser的构造函数为:

 

      public MockUser(Integer id, String name, Date birthday) { 

              this.id = id;//唯一标示

              this.name = name;//用户名

              this.birthday = birthday;//出生日期

      }
 

 

      MockUser 为一个测试用户类,最后输出的结果为:

      testQueryFromPojoList_selectSome:[{id=1, name=tom}]

 

最新代码请到https://github.com/hongliuliao/sql4nosql查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值