Java 中封装JDBC连接到JDBCUtils工具类的详解

简介: Java 中封装JDBC连接到JDBCUtils工具类的详解

前言

在JDBC操作中,获取连接和释放资源是经常使用到的,可以将其封装成到一个工具类JDBCUtils中

JDBCUtils中有两个方法得到连接和关闭连接,代码如下

//这是一个工具类,完成mysql的连接和关闭资源
public class JDBCUtils {
    //定义相关的属性(4个),因为只需要一份,因此我们做成static
    private static String user;//用户名
    private static String password;//密码
    private static String url; //url
    private static String driver;//驱动名
    //初始化相关属性值,放到静态代码块中完成
    static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\mysql.properties"));
            //读取相关的属性值
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            url = properties.getProperty("url");
            driver = properties.getProperty("driver");
        } catch (IOException e) {
            //在实际开发中,我们可以这样处理
            //1.将编译异常转成,运行异常
            //2.这时调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便
            throw new RuntimeException(e);
        }
    }
    //连接方法,返回Connection
    public static Connection getConnection() {
        try {
            Class.forName(driver);
            return DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            //1.将编译异常转成,运行异常
            //2.这时调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便
            throw new RuntimeException(e);
        }
    }
    //关闭相关资源
    /*
        1.resultSet 结果集
        2.prepareStatement 或者 Statement
        3.connection
        4.如果需要关闭资源,就传入对象,否则传入null
     */
    public static void close(ResultSet set, Statement statement, Connection connection) {
        try {
            //判断是否为null
            if (set != null) {
                set.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            //将编译异常,转换为运行异常抛出
            throw new RuntimeException(e);
        }
    }
}

JDBCUtils工具类的使用如下

public class JDBCUtils_Use {
    //使用JDBCUtils 进行DML操作(insert update delete)
    @Test
    public void testDML() {
        //1.得到连接
        Connection connection = null;
        //2.组织一个sql
        //更新记录
//        String sql = "UPDATE actor SET NAME=? WHERE id=?";
        //删除记录
        String sql = "DELETE FROM actor WHERE id=?";
        //添加记录
//        String sql = "INSERT INTO actor VALUES(?,?,?,?,?)";
        PreparedStatement preparedStatement = null;
        //创建PrepareStatement对象
        try {
            connection = JDBCUtils.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            //添加记录
//            preparedStatement.setInt(1, 3);
//            preparedStatement.setString(2, "周润发");
//            preparedStatement.setString(3, "男");
//            preparedStatement.setString(4, "1999-01-10");
//            preparedStatement.setString(5, "1234567890");
            //修改记录
//            preparedStatement.setString(1, "周星驰");
//            preparedStatement.setInt(2, 1);
            //删除记录
            preparedStatement.setInt(1, 1);
            int rows = preparedStatement.executeUpdate();
            System.out.println(rows > 0 ? "执行成功" : "执行失败");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.close(null, preparedStatement, connection);
        }
    }
    @Test
    public void testSelect() {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //1.得到连接
            connection = JDBCUtils.getConnection();
            String sql = "SELECT id,name,borndate FROM ACTOR WHERE id = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 2);
            //执行得到结果集
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                String name = resultSet.getString("name");
                int id = resultSet.getInt("id");
                Date borndate = resultSet.getDate("borndate");
                System.out.println(id + "\t" + name + "\t" + borndate);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(resultSet, preparedStatement, connection);
        }
    }
}

输出结果分别为

执行成功
2 王宝强 1980-01-03


目录
打赏
0
0
0
0
10
分享
相关文章
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
125 30
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
java连接kerberos用户认证
java连接kerberos用户认证
90 22
|
2月前
|
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
188 15