Introduction

Sharin is a Java library including these functions.

  • SQL Generator
  • SQL Formatter
  • SQL Runner
  • Doc Builder
  • CSV Parser
  • Unintegrated LINQ

SQL Generator

Usage:

EntityInfo entityInfo = new EntityInfo(Employee.class);
SqlGenerator sqlGenerator = new BasicSqlGenerator(entityInfo);

Employee example = new Employee();
example.departmentId = 20;
example.job = "ANALYST";

Sql sql = sqlGenerator.selectByExample("*, -department.location",
        "id ASC", example);
String sqlText = sql.getText();
Object[] sqlParams = sql.getParams();

Input (Employee):

@Table(name = "emp")
public class Employee {

    @Id
    @Column(name = "empno")
    public Integer id;

    @Column(name = "ename")
    public String name;

    public String job;

    @Column(name = "deptno")
    public Integer departmentId;

    @ManyToOne
    @JoinColumn(name = "deptno")
    public transient Department department;
}

Input (Department):

@Table(name = "dept")
public class Department {

    @Id
    @Column(name = "deptno")
    public Integer id;

    @Column(name = "dname")
    public String name;

    @Column(name = "loc")
    public String location;
}

Output (sqlText):

SELECT
emp.deptno AS "departmentId",
emp.empno AS "id",
emp.job AS "job",
emp.ename AS "name",
department.deptno AS "department.id",
department.dname AS "department.name"
FROM emp
LEFT JOIN dept department ON emp.deptno = department.deptno
WHERE emp.deptno = ? AND emp.job = ?
ORDER BY "id" ASC

Output (sqlParams):

[20, ANALYST]

SQL Formatter

Usage:

BasicSqlFormatter sqlFormatter = new BasicSqlFormatter(template);

Map<String, Object> context = new HashMap<String, Object>();
context.put("ename", null);
context.put("deptno", 20);
context.put("jobs", new String[] { "ANALYST", "CLERK" });
context.put("order", "empno");

String result = sqlFormatter.format(context);

Input (template):

SELECT *
FROM emp
-- #begin
    WHERE
    -- #begin
        ename LIKE
        '%A%' -- $ename
    -- #end
    -- #begin
        AND -- #prepend
        deptno =
        30 -- $deptno
    -- #end
    -- #begin
        AND -- #prepend
        job IN (
        'SALESMAN' -- $jobs
        )
    -- #end
-- #end
ORDER BY 
ename -- &order
ASC

Output (result):

SELECT *
FROM emp
WHERE deptno = 20 AND job IN ( 'ANALYST', 'CLERK' )
ORDER BY empno ASC

SQL Runner

Usage:

ResultSetProcessor objectProcessor = new BeanResultSetProcessor(
        Employee.class);
SqlRunner sqlRunner = new BasicSqlRunner(dataSource, objectProcessor);

Sql sql = new Sql(sqlText, sqlParams);
Employee employee = sqlRunner.selectForObject(sql);

Input (sqlText):

SELECT
emp.empno AS "id",
emp.ename AS "name",
department.dname AS "department.name"
FROM emp
INNER JOIN dept department ON emp.deptno = department.deptno
WHERE emp.deptno = ? AND emp.job = ?
ORDER BY "id" ASC

Input (sqlParams):

[20, ANALYST]

Output (employee):

id=7788
name=SCOTT
job=<null>
departmentId=<null>

Output (employee.department):

id=<null>
name=RESEARCH
location=<null>

Doc Builder

Usage:

import static sharin.doc.builder.xhtml1.Xhtml1DocBuilder.Static.*;

...

Elem elem = form().methodGet().action("search")._(
        input().typeText().name("q"), input().typeSubmit());
String result = elem.toString();

Output (result):

<form method="get" action="search">
<input type="text" name="q" />
<input type="submit" />
</form>

CSV Parser

Usage (CsvPullParser):

CsvPullParser csvPullParser = new BasicCsvPullParser();

for (String[] record : csvPullParser.parse(reader)) {
    /* do something */
}

Usage (CsvPushParser):

CsvPushParser csvPushParser = new BasicCsvPushParser();

BasicCsvHandler csvHandler = new BasicCsvHandler();
csvPushParser.parse(reader, csvHandler);

String[][] records = csvHandler.getRecords();

Input (reader):

1,One
2,"T,wo"
3,"T""hree"
4,"F
our"

Output (records):

[1, One]
[2, T,wo]
[3, T"hree]
[4, F
our]

Unintegrated LINQ

Usage:

import static sharin.unlinq.BasicEnumerable.*;

...

Func<Integer, Boolean> whereFunc = new Func<Integer, Boolean>() {
    public Boolean call(Integer arg1) {
        return arg1 % 3 == 1;
    }
};
Func<Integer, Character> selectFunc = new Func<Integer, Character>() {
    public Character call(Integer arg1) {
        return (char) ('A' + arg1 - 1);
    }
};
List<Character> result = from(10, 21, 14, 12, 1, 22, 9, 14, 1, 17)
        .where(whereFunc).select(selectFunc).toList();
System.out.println(result);

Output (result):

[J, A, V, A]