JDBC是一种可以执行SQL语句的JavaAPI。程序可通过JavaAPI连接到关系数据库,并使用结构化查询语言来完成对数据库的查询、更新。
Java的JDBC编程有如下9个步骤:
1. 加载数据库的JDBC驱动(JDBC API)
2. 创建连接
3. 创建命令
4. 准备SQL语句
5. 执行SQL
6. 处理结果
7. 关闭结果
8. 关闭命令
9. 关闭连接
代码演示如下:
public class MyFirstJdbcCase {
public static void main(String[] args) {
try {
//1. 加载数据库的JDBC驱动(JDBC API)
Class.forName("com.mysql.jdbc.Driver");
//2. 创建连接
String url = "jdbc:mysql://127.0.0.1:3306/memo?user=root&password=a1814203288";
try {
Connection connection = DriverManager.getConnection(url);
//3. 创建命令
Statement statement = connection.createStatement();
//4. 准备SQL语句
String sql = "select id,name,created_time,modify_time from memo_group";
//5. 执行SQL
ResultSet resultSet = statement.executeQuery(sql);
//6. 处理结果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
Timestamp createTime = resultSet.getTimestamp("created_time");
Timestamp modifyTime = resultSet.getTimestamp("modify_time");
System.out.println(id + " " + name + " " + createTime + " " + modifyTime);
}
//7. 关闭结果
resultSet.close();
//8. 关闭命令
statement.close();
//9. 关闭连接
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
由于在这个步骤里,有一些步骤是不变的,故而我们想到采用模板设计模式对其进行简化和优化。对于不变的步骤我们之间给出,对于需要改变的步骤使用抽象方法让使用端去决定如何改变,进而代码的使用效率也大大提升。
不变的步骤:
加载驱动,获取连接,创建命令,关闭(结果,命令,连接)。
需要改变的步骤:
SQL语句,执行命令,处理结果
具体模板代码如下:
public abstract class AbstractJdbcTemplate {
//执行流程
public <T> T execute(String sql) {
this.loadDriver();
this.createConnection();
this.createStatement();
Object o;
if (sql.trim().toUpperCase().startsWith("SELECT")) {
this.resultSet = this.executeQuery(sql);
o = this.handlerResult(resultSet);
} else {
int effect = this.executeUpdate(sql);
o = this.handlerResult(effect);
}
this.close();
return (T) o;
}
private Connection connection;
private Statement statement;
private ResultSet resultSet;
//加载驱动
private void loadDriver() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建链接
private void createConnection() {
String url = "jdbc:mysql://127.0.0.1:3306/memo";
try {
this.connection = DriverManager.getConnection(url, "root", "a1814203288");
} catch (SQLException e) {
e.printStackTrace();
}
}
//创建命令
private void createStatement() {
try {
this.statement = connection.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
private int executeUpdate(String sql) {
try {
return this.statement.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
private ResultSet executeQuery(String sql) {
try {
return this.statement.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//处理结果集
public abstract <T> T handlerResult(ResultSet resultSet);
public abstract <T> T handlerResult(int effect);
//关闭资源
private void close() {
if (this.resultSet != null) {
try {
this.resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (this.statement != null) {
try {
this.statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (this.connection != null) {
try {
this.connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
给出一个测试类:
public class JdbcTemplate extends AbstractJdbcTemplate {
@Override
public <T> T handlerResult(ResultSet resultSet) {
StringBuilder sb = new StringBuilder();
try {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
Timestamp createTime = resultSet.getTimestamp("created_time");
Timestamp modifyTime = resultSet.getTimestamp("modify_time");
sb.append(id).append(" ").append(name).append(" ").append(createTime).append(" ").append(modifyTime);
sb.append("\n");
}
} catch (SQLException e) {
e.printStackTrace();
}
return (T) sb.toString();
}
@Override
public <T> T handlerResult(int effect) {
return (T) Integer.valueOf(effect);
}
public static void main(String[] args) {
AbstractJdbcTemplate template = new JdbcTemplate();
Integer rs = template.execute("update memo_group set name='好日子' where id=667");
System.out.println(rs);
}
}
以上就是使用模板设计模式实现JDBC编程的全部流程。