Skip to content
Nedelcho Delchev edited this page Dec 14, 2019 · 3 revisions

SQL Builders

SQL Module

The SQL module provides a factory and builders for defining SQL scripts.

It is inspired by the Javascript library Squel, but not limited to its features nor striving for compatibility.

It aims at achieving:

  • Type safe methods for the respective builders
  • Native dialect dependent generation of the SQL
  • Flexibility to extend the default builders at any level

It is purely text generation and formating library without a requirement for an active JDBC connection. The only exception is the getNative(connection) method below for deriving the actual dialect based on the Product Name for the JDBC meta-data.

Supported Data Types

VARCHAR, CHAR, DATE, TIME, TIMESTAMP, INTEGER, TINYINT, BIGINT, SMALLINT, REAL, DOUBLE, BOOLEAN, BLOB, DECIMAL, BIT

Samples

Basic Sample

	String sql = SqlFactory.getDefault()
			.select()
			.column("*")
			.from("CUSTOMERS")
			.build();

SELECT * FROM CUSTOMERS

Native Dialect

	String sql = SqlFactory.getNative(new PostgresSqlDialect())
			.nextval("CUSTOMERS_SEQUENCE")
			.build();
			

SELECT nextval('CUSTOMERS_SEQUENCE')

Derive Dialect

	... 
	Connection connection = datasource.getConnection();
	String sql = SqlFactory.getNative(connection)
			.select()
			.column("*")
			.from("CUSTOMERS")
			.build();;
			

Joining Tables

	String sql = SqlFactory.getDefault()
			.select()
			.column("FIRST_NAME")
			.column("LAST_NAME")
			.from("CUSTOMERS")
			.leftJoin("ADDRESSES", "CUSTOMERS.ADDRESS_ID=ADDRESSES.ADDRESS_ID")
			.build();
			

SELECT FIRST_NAME, LAST_NAME FROM CUSTOMERS LEFT JOIN ADDRESSES ON CUSTOMERS.ADDRESS_ID=ADDRESSES.ADDRESS_ID

Expressions

	String sql = SqlFactory.getDefault()
			.select()
			.column("*")
			.from("CUSTOMERS")
			.where(SqlFactory.getDefault().expression().and("PRICE > ?").or("AMOUNT < ?").build())
			.build();
			

SELECT * FROM CUSTOMERS WHERE (PRICE > ? OR AMOUNT < ?)

Limit and Offset

	String sql = SqlFactory.getDefault()
			.select()
			.column("*")
			.from("CUSTOMERS")
			.limit(10)
			.offset(20)
			.build();
			

SELECT * FROM CUSTOMERS LIMIT 10 OFFSET 20

Group By and Having

	String sql = SqlFactory.getDefault()
			.select()
			.column("COUNT(FIRST_NAME)")
			.column("COUNTRY")
			.from("CUSTOMERS")
			.group("COUNTRY")
			.having("COUNT(FIRST_NAME) > 5")
			.build();
			

SELECT COUNT(FIRST_NAME), COUNTRY FROM CUSTOMERS GROUP BY COUNTRY HAVING COUNT(FIRST_NAME) > 5

Union

	String sql = SqlFactory.getDefault()
			.select()
			.column("COUNTRY")
			.from("CUSTOMERS")
			.union(SqlFactory.getDefault().select().column("COUNTRY").from("SUPPLIERS").build())
			.build();
			

SELECT COUNTRY FROM CUSTOMERS UNION SELECT COUNTRY FROM SUPPLIERS

Create Table

	String sql = SqlFactory.getDefault()
				.create()
				.table("CUSTOMERS")
				.column("ID", DataType.INTEGER, Modifiers.PRIMARY_KEY, Modifiers.NOT_NULL, Modifiers.NON_UNIQUE)
				.column("FIRST_NAME", DataType.VARCHAR, Modifiers.REGULAR, Modifiers.NOT_NULL, Modifiers.UNIQUE, "(20)")
				.column("LAST_NAME", DataType.VARCHAR, Modifiers.REGULAR, Modifiers.NULLABLE, Modifiers.NON_UNIQUE, "(30)")
				.build();
				

CREATE TABLE CUSTOMERS ( ID INTEGER NOT NULL PRIMARY KEY , FIRST_NAME VARCHAR (20) NOT NULL UNIQUE , LAST_NAME VARCHAR (30) )

Create Table with Constraints

	String sql = SqlFactory.getDefault()
				.create()
				.table("CUSTOMERS")
				.column("FIRST_NAME", DataType.VARCHAR, Modifiers.REGULAR, Modifiers.NOT_NULL, Modifiers.UNIQUE, "(20)")
				.column("LAST_NAME", DataType.VARCHAR, Modifiers.REGULAR, Modifiers.NULLABLE, Modifiers.NON_UNIQUE, "(30)")
				.column("ADDRESS_ID", DataType.INTEGER, Modifiers.REGULAR, Modifiers.NULLABLE, Modifiers.NON_UNIQUE)
				.primaryKey(new String[] { "FIRST_NAME", "LAST_NAME" })
				.foreignKey("ADDRESS_FK", new String[] { "PERSON_ADDRESS_ID" }, "ADDRESSES", new String[] { "ADDRESS_ID" })
				.unique("LAST_NAME_UNIQUE", new String[] { "LAST_NAME" })
				.check("LAST_NAME_CHECK", "LAST_NAME = 'Smith'")
				.build();
				

CREATE TABLE CUSTOMERS ( FIRST_NAME VARCHAR (20) NOT NULL , LAST_NAME VARCHAR (30) , ADDRESS_ID INTEGER , PRIMARY KEY ( FIRST_NAME , LAST_NAME ), CONSTRAINT ADDRESS_FK FOREIGN KEY ( PERSON_ADDRESS_ID ) REFERENCES ADDRESSES( ADDRESS_ID ), CONSTRAINT LAST_NAME_UNIQUE UNIQUE ( LAST_NAME ), CONSTRAINT LAST_NAME_CHECK CHECK (LAST_NAME = 'Smith'))

Create View

	String sql = SqlFactory.getDefault()
				.create().view("CUSTOMERS_VIEW")
				.column("ID")
				.column("FIRST_NAME")
				.column("LAST_NAME")
				.asSelect(SqlFactory.getDefault().select().column("*").from("CUSTOMERS").build())
				.build();
				

CREATE VIEW CUSTOMERS_VIEW ( ID , FIRST_NAME , LAST_NAME ) AS SELECT * FROM CUSTOMERS

Insert Record

	tring sql = SqlFactory.getDefault()
			.insert()
			.into("CUSTOMERS")
			.column("FIRST_NAME")
			.column("LAST_NAME")
			.build();
			

INSERT INTO CUSTOMERS (FIRST_NAME, LAST_NAME) VALUES (?, ?)

Update Record

	String sql = SqlFactory.getDefault()
				.update()
				.table("CUSTOMERS")
				.set("FIRST_NAME", "'John'")
				.set("LAST_NAME", "'Smith'")
				.where("AGE > ?")
				.where("COMPANY = 'SAP'")
				.build();
				

UPDATE CUSTOMERS SET FIRST_NAME = 'John', LAST_NAME = 'Smith' WHERE (AGE > ?) AND (COMPANY = 'SAP')

Delete Record

	String sql = SqlFactory.getDefault()
				.delete()
				.from("CUSTOMERS")
				.where("AGE > ?")
				.where("COMPANY = 'SAP'")
				.build();
				

DELETE FROM CUSTOMERS WHERE (AGE > ?) AND (COMPANY = 'SAP')

Drop Table

	String sql = SqlFactory.getNative(new PostgresSqlDialect())
			.drop()
			.table("CUSTOMERS")
			.build();
			

DROP TABLE CUSTOMERS

More samples are available under the test folder of the project.

For the complete yet simplified POJO based database manipulation you might want to see the Persistence module