拓展阅读

linq

querydsl

ORM-01-Hibernate、MyBatis、EclipseLink、Spring Data JPA、TopLink、ActiveJDBC、Querydsl 和 JOOQ 对比

ORM-02-Hibernate 对象关系映射(ORM)框架

ORM-02-JPA Java Persistence API 入门介绍

orm-04-Spring Data JPA 入门介绍

ORM-05-javalite activejdbc

ORM-06-jooq 入门介绍

ORM-07-querydsl 入门介绍

ORM-08-EclipseLink 入门介绍

ORM-09-TopLink

前言

自己通过 jdbc 实现了一个 数据库查询工具,不过后来想拓展查询功能时,总觉得不够尽兴。

所以在想能不能把 SQL 的构建单独抽离出来。

这里整理学习下其他的组件。

Yeamy/SqlBuilder

https://github.com/Yeamy/SqlBuilder

这个项目只是一个Java编写的SQL语句生成器。

它并不能让提高你的代码执行效率,但是可以让你的Java代码更直观,更纯粹。

0. 例子

这个一个简单的例子,像这样:

  [java]
1
2
Column fruit_name = new Column("name"); SQL.delete("fruit", Clause.equal(fruit_name, "apple"));

通过上面生成的SQL语句:

  [sql]
1
DELETE FROM `fruit` WHERE `name` = "apple";

1. 插入(INSERT)

  [java]
1
2
3
4
String sql = new Insert(String table) .addAll(Map<String, Object> cv) // map<列, 值>批量全部 .add(String column, Object value) // 单独添加 .toString();

2. 删除(DELETE)

  [java]
1
SQL.delete(String table, Clause where);

3. 修改(UPDATE)

  [java]
1
2
3
4
5
String sql = new Update(String table) .addAll(Map<String, Object> cv) // 批量全部 .add(String column, Object value) // 单独添加 .where(clause) .toString();

4. 查询(SELECT)

简单地搜索全表:

  [java]
1
SQL.select(String table, Clause where, int limit);

大多数情况,我们需要使用 select builder 来帮助我们事先复杂搜索。

使用builder不需要单独声明表名,但是所有包含的列的表名都必须不能为空,尤其是在多表查询的时候!

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
Column price_fruitId = new Column("price", "fruitId"); Column fruit_fruitId = new Column("fruit", "fruitId"); Column fruit_name = new Column("fruit", "name"); String sql = new Select() .addColumn(new Column("mylike", null)) // 没有搜索列 .addColumn(new Column("fruit", "*")) // 表的所有列 .addColumn(new Column("price", xxx)) // 表的指定列 .innerJoin(price_fruitId, fruit_fruitId) // join .where(Clause.like(fruit_name, "apple")) // where .orderBy(new Asc(price_fruitId).desc(xxx)) // order by .limit(2) // limit .toString();

5. 约束(WHERE)

  [java]
1
2
3
4
5
6
7
8
9
// 单独条件: // in, between, isNull, isNotNull, like, // equal(=), lessThan(<), lessEqual(<=), moreThan(>), moreEqual(>=) Clause.equal(column, pattern) // 多条件 MultiClause clause = new MultiClause(clause1) .and(clause2) .or(new MultiClause(xxx)...);

总的来说,最复杂的还是这个类。

6. 列(Column)

  [java]
1
2
3
4
Column(String name); // 不带表名 Column(String table, String name); // 带表名 Column(table, name).as(String alias); // 带列的“别名” Column(table, name).as(tableAlias, nameAlias); // 带表的“别名”

参考资料