Skip to content

在纯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等,只是为了节省篇幅没有照抄下来,上例的完整源代码请参见完整源码