JDBC之模板设计模式

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编程的全部流程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值