`
Heis
  • 浏览: 114437 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

LikeSql——让你更优雅地写SQL

阅读更多

 

LikeSql是什么

LikeSql是我写一个开源的小框架(http://code.google.com/p/likesql/),目标是提供一个更优雅地处理SQL的一个方案,希望能够替代PreparedStatement和直接拼接SQL。虽然现在还有没有正式的release版本,我还在为此努力。

 

设计宗旨:

  • 专注于优雅地编写SQL和易读性
  • 保持细小和灵活

 

一些代码示例:

 

public void testAtStyleExpression(){
		LikeSql sql=DML.select("id,name")
		               .from("user")
		               .where(AtExp.at("(name =@name or id=@id) and gender=@gender")
		            		                       .set("id", 1)
		            		                       .set("name", "John")
		            		                       .set("gender", "M"));
		
		String eSql="SELECT id,name FROM user WHERE (name ='John' or id=1) and gender='M'";
		String eTpl="SELECT id,name FROM user WHERE (name =? or id=?) and gender=?";
		
		assertEquals(eSql,sql.toString());
		assertEquals(eTpl,sql.toTemplate());
	}
public void testInExpression(){
		LikeSql sSql=DML.select("id,name")
		    .from("user")
		    .where(QuestExp.qt("id in (?)").set(1,ArrayExp.array(new int[]{1,3,6})));
		
		String eSql="SELECT id,name FROM user WHERE id in (1,3,6)";
		String eTpl="SELECT id,name FROM user WHERE id in (?,?,?)";
		
		assertEquals(eSql,sSql.toString());
		assertEquals(eTpl,sSql.toTemplate());
	}
public void testSimpleSql(){
		String eSql="INSERT INTO users (no,id,name,gender,height) VALUES(1,15666662656565,'johny',null,195.36)";
		String eTpl="INSERT INTO users (no,id,name,gender,height) VALUES(?,?,?,?,?)";
		
		LikeSql iSql=DML.insertInto("users")
		    .value("no", 1)
		    .value("id", new BigInteger("15666662656565"))
		    .value("name","johny")
		    .value("gender",null)
		    .value("height", 195.36);
		
		assertEquals(eSql,iSql.toString());
		assertEquals(eTpl,iSql.toTemplate());
	}

 

LikeSql sql=DML.selectAll()
				               .from("user")
				               .where(QuestExp.qt("id=? AND gender=?")
						                      .set(1, 1)
						                      .set(2, 'M'));
				PreparedStatement stmt=sql.toPreStatement(con);
				System.out.println("Template:"+sql.toTemplate());
				System.out.println("SQL:"+sql.toString());
				ResultSet rs=stmt.executeQuery();
				while(rs.next()){
					System.out.println(rs.getString("name"));
				}

 

LikeSql不是什么

  • LikeSql不是ORM框架
  • LikeSql不是重复发明iBatis,Hibernate

 

为什么会有LikeSql

其实最初的想法来源于我工作经手的几个项目,项目都是采用简单的JDBC+直接拼接SQL来访问数据库。直接拼接SQL存在诸多缺点,这里就不在多论述了。主要是我在维护和改进的过程中,发现并没有一个很优雅的方式来处理SQL。我写过两篇文章来讨论过这个问题

我使用DSL编写SQL的一个java实现

你还在用PreparedStatement吗

我认为PreparedStatement对比直接拼接SQL并没有绝对的优势,而且它没法解决一些实际的需求,写起来也不能算优雅。于是我开始搜索相关的解决方案,并没有发现一些现存的工具,在读了很多相关的文章,我认为DSL会是一个很好的方式来处理SQL。我在工作的项目当中引入了DSL的思想,写了一个雏形的框架,因为一开始写的时候,设计不是特别完善,于是决定做一个开源的项目,把这个框架重新设计,这就成了LikeSql。


LikeSql的计划

  1. 尽快完善文档,释出release版本(希望年内达成吧)
  2. 编写教程和例子
  3. 建立反馈渠道和讨论圈子
  4. 和其他框架的集成

 

关于LikeSql的名字

 

Like有两层意思,一个相似,像的意思,就是希望这个框架写起来与SQL文本很相近,易读性强;另一个意思是喜欢,希望使用它的用户能够喜欢写SQL。

 

 

欢迎加入这个项目,欢迎指教和讨论。

23
1
分享到:
评论
13 楼 Heis 2010-11-29  
hpf1908 写道
上你的googlecode啥都没有啊?我对这个很感兴趣,以前用dephi也做过类似的事情

现在只能checkout源代码,真的是啥都没有,我会努力的啦。
12 楼 Heis 2010-11-29  
zrf8579 写道
推荐你看下Ebean

我去看了一下。Ebean和ibatis差不多
http://www.avaje.org/ebean/introquery.html
其实Ebean使用的查询语法也是一种DSL,但是与SQL的语法相比已经大相径庭了。同类的语言还有Hibernate的HQL。LikeSql只是针对SQL的简单封装,在语法上尽量贴近,同时改进可读性,在封装深度和语法设计上有不同。
11 楼 jy1245626 2010-11-29  
与Spring的JdbcTemplete有什么区别??
貌似就是它的翻版
10 楼 hsw168 2010-11-29  
其实,在对预编译的方式稍微封装一下就很不错了:
db.preparedUpdate("DELETE FROM LD_XZYMX WHERE FCBH=? AND YDBH=? AND NVL(JHLX,0)!=0 AND CKQR=0",
new Object[]{fcbh, ydbh}, true);
这样的代码也是很灵活的,,,
9 楼 deepfuture 2010-11-29  
不错,再智能一点就好。。。。,让它成为真正的描述性的语言,还能智能形成存储过程
8 楼 flootball 2010-11-29  
写个存储过程不就得了。
7 楼 hpf1908 2010-11-29  
上你的googlecode啥都没有啊?我对这个很感兴趣,以前用dephi也做过类似的事情
6 楼 zrf8579 2010-11-29  
推荐你看下Ebean
5 楼 icyheart 2010-11-29  
加油 支持你 
4 楼 spiritfrog 2010-11-29  
挺好的一个开源项目, 顶你lz
3 楼 ychon 2010-11-28  
  支持,希望早点出release
2 楼 Heis 2010-11-28  
A1.不是的,因为是SQL拼接,可以在from语句里面写多个table

A2.这个框架专注于写SQL,你看到的例子是java代码。其实我很反对将SQL写到xml文件中,这样会造成可读性比较差,你必须在java代码和xml文件中切换。如果你确实觉得需要,你还是去用ibatis吧,不适合用LikeSql

A3.我的确也被不确定的条件烦恼过,考虑到这一块的复杂性,还有易读性的问题,还是不封装这一块了,让程序员自己写吧。LikeSql不应该超出它的职责,而应该专注于SQL,而不是去重复发明一个ibatis。

PS:我一直不喜欢map替代bean的作用,map的易读性很差。
1 楼 finallygo 2010-11-28  
1.ms只支持单表操作?
2.最好支持能将sql语句写在xml文件中,否则sql语句长了的话...
3.我看你的条件查询好像还是用了判断来拼接sql,我觉得这么做还是会使代码看起来不太好,建议在ibatis的基础上再做一些改进
比如一个通过用户id和用户名来进行的一个查询(条件个数不是固定的)可以这么设计:
sql语句为
select * from user where userid=#userId# and username=#userName#
之后让用户传入一个map,
结构可以是{userId:1,userName:'tom'},也可以是{userId:1}或者是{userName:'tom'}
之后分析sql语句,将需要的参数注入,不需要的就去掉
比如map结构是{userId:1,userName:'tom'},
生成的sql就是select * from user where userid=#userId# and username=#userName#
如果结构是{userId:1}
生成的sql就是select * from user where userid=#userId#

相关推荐

    mybatis动态sql(使用<where>标签来处理多个查询条件)

    ### MyBatis动态SQL——使用`&lt;where&gt;`标签处理多个查询条件 #### 一、引言 在实际的软件开发过程中,我们经常会遇到需要根据不同的条件动态构建SQL语句的需求。这种需求通常出现在搜索功能中,例如用户可以指定多...

    PHP实例开发源码——新翔图书馆管理系统.zip

    - 错误处理:查找错误处理代码,了解如何优雅地处理可能出现的问题。 - 安全实践:学习代码中如何防止常见安全漏洞的方法。 通过深入研究新翔图书馆管理系统的源代码,开发者不仅能掌握PHP编程技巧,还能了解到Web...

    mysql的myisam解决并发读写解决方法

    但它的缺点也很明显——在进行写操作时(包括更新和删除),整个表都会被锁定,这意味着其他任何对这个表的操作都将被阻塞,直到写操作完成。这种机制导致了在高并发场景下,特别是读写混合负载的情况下,MyISAM的...

    Laravel开发-laravel-sphinx

    SphinxQL是Sphinx提供的SQL-like查询接口,使得开发者可以使用熟悉的SQL语法来执行全文检索。 laravel-sphinx为Laravel开发者提供了以下关键功能: 1. **查询构建器集成**:laravel-sphinx将SphinxQL的语法与...

    C#酒店管理系统(附带数据库)

    此外,错误处理和异常处理也是必不可少的部分,它们能确保系统在遇到问题时能够优雅地恢复,避免数据丢失或系统崩溃。 总的来说,C#酒店管理系统结合了C#编程语言和数据库技术,实现了对酒店信息的高效管理。通过...

    Laravel开发-oracledb

    最后,由于Oracle数据库的某些特性可能与MySQL等数据库不同,例如数据类型、SQL语法等,你可能需要对Eloquent模型和迁移文件进行一些调整以适应Oracle。例如,Oracle不支持`enum`类型,你可以使用`varchar2`代替。...

    ASP.NET-[聊天留言]铁力Tieli.net多用户留言本v1.1.1.zip

    7. 错误处理:在ASP.NET中,可以设置全局错误处理,确保在出现异常时能够优雅地处理,防止信息泄露,并向用户友好地显示错误信息。 总的来说,铁力Tieli.net多用户留言本v1.1.1展示了ASP.NET在构建Web应用程序方面...

    dataStructuresAndAlgos:列编码

    在IT领域,数据结构与算法是编程的基础,也是提升程序效率的关键。Python作为一种高级编程语言,因其简洁易读的语法而被广泛...通过深入学习和实践,我们可以更好地应对各种编程挑战,编写出高效、优雅的Python代码。

    kokesma_backend

    6. **错误处理**:Go语言鼓励显式的错误处理,项目中会大量使用错误检查(error checking)和错误返回,确保程序在遇到问题时能够优雅地处理。 7. **测试与调试**:Go语言内置的testing包使得单元测试和集成测试变...

    BeToHero

    4. **异常处理**:C#提供try-catch语句进行异常处理,确保程序在遇到错误时能优雅地处理。 5. **LINQ(Language Integrated Query)**:C#的查询表达式,允许开发者使用SQL-like语法进行数据查询,适用于处理集合、...

Global site tag (gtag.js) - Google Analytics