-
Notifications
You must be signed in to change notification settings - Fork 12
在纯JDBC项目中使用
Yong Zhu edited this page Mar 12, 2018
·
11 revisions
纯Jdbc持久层工具因为不支持ORM,所以jDialects提供的十种主键生成方式就无用武之地了,但是跨数据库的分页、函数转换、DDL生成功能还是能用上的,以下示例演示在纯JDBC环境下使用jDialects来创建数据库表、插入数据、分页查询:
public class Demo {
@Test
public void doTest() {
HikariDataSource ds = new HikariDataSource();// DataSource
// H2 is a memory database
ds.setDriverClassName("org.h2.Driver");
ds.setJdbcUrl("jdbc:h2:mem:DBName;MODE=MYSQL;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=0");
ds.setUsername("sa");
ds.setPassword("");
Dialect dialect = Dialect.guessDialect(ds);
Dialect.allowLogOutput = true;
Connection conn = null;
try {
conn = ds.getConnection();
TableModel t = new TableModel("users");
t.column("firstName").VARCHAR(20).pkey();
t.column("lastName").VARCHAR(20).pkey();
t.column("age").INTEGER();
String[] ddlArray = dialect.toDropAndCreateDDL(t);
for (String ddl : ddlArray)
try {
execute(conn, ddl);
} catch (Exception e) {
}
for (int i = 1; i <= 100; i++)
execute(conn, "insert into users (firstName, lastName, age) values(?,?,?)", "Foo" + i, "Bar" + i, i);
Assert.assertEquals(100L, ((Number) queryForObject(conn, "select count(*) from users")).longValue());
List<Map<String, Object>> users = queryForMapList(conn, dialect.paginAndTrans(2, 10,
"select concat(firstName, ' ', lastName) as UserName, age from users where age>?"), 50);
Assert.assertEquals(10, users.size());
for (Map<String, Object> map : users)
System.out.println("UserName=" + map.get("USERNAME") + ", age=" + map.get("AGE"));
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
ds.close();
}
}
这个示例演示了在纯Jdbc环境下,利用到了jDialects的DDL生成、分页、函数变换功能。以上代码只需要更改数据源配置,就可以自动适应多种数据库,不必再为每一种数据库写对应的DDL和SQL了。
纯JDBC的使用是比较繁琐的,通常要编写一些小方法将纯JDBC包装一下,来简化编码(这方面的典型可见Apache-DbUtils和JdbcTempalte这两个工具),本例也不例外,也编写了一些小方法如execute、queryForObject等,只是为了节省篇幅没有照抄下来,上例的完整源代码请参见完整源码。