JDBC—(从复杂到简单)连接使用数据库的多种实现方法

博客概要

     具体以“打印全部信息”为例子,撰写JDBC的几种连接使用方法~

方法一(最复杂,无任何封装、调用)

     不做任何封装,就干写,纯写…

具体代码:

    /**
     * 最复杂,无封装
     * 打印全部
     */
    @Override
    public void printAllU() {
    
        try {
            //1.加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            
            //2.连接数据库
            Connection conn = DriverManager.getConnection
            	("jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8", "root", "123456");
            	
            //3.准备sql语句
            String sql="select * from tb_user";
            
            //4.选中语句并预编译处理
            PreparedStatement pstm = conn.prepareStatement(sql);
            
            //5.产生结果
            ResultSet rs = pstm.executeQuery();
            
            //6.处理结果
            while (rs.next()){
                System.out.println("*用户编号:" + rs.getInt(1) + ",\t*用户名称:" + rs.getString(2) + ",\t*用户密码:" + rs.getString(3) + ",\t*用户类型:" + rs.getInt(4));
            }
            
            //7.释放连接
            rs.close();
            pstm.close();
            conn.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

特征:每写一个功能就要写类似代码,重复代码巨多,代码冗余大,累人,而且不美观= =

方法二(稍微简化,轻微封装)

     就在同一类之下,对驱动地址、数据库连接地址、数据库用户名以及数据库密码,做了封装,提高了一点效率,减少了一点点重复代码,但半斤八两…

具体代码:

	//封装驱动地址、数据库信息
    private String driver="com.mysql.jdbc.Driver";
    private String url="jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8";
    private String jdbcuser="root";
    private String pwd="123456";

    /**
     * 稍微简化,有封装
     * 打印全部
     */
    @Override
    public void printAllU() {

        try {
            //1.加载数据库驱动
            Class.forName(driver);
            
            //2.连接数据库
            Connection conn = DriverManager.getConnection(url, jdbcuser, pwd);

            //3.准备sql语句
            String sql="select * from tb_user";
            
            //4.选中语句并预编译处理
            PreparedStatement pstm = conn.prepareStatement(sql);
            
            //5.产生结果
            ResultSet rs = pstm.executeQuery();
            
            //6.处理结果
            while (rs.next()){
                System.out.println("*用户编号:" + rs.getInt(1) + ",\t*用户名称:" + rs.getString(2) + ",\t*用户密码:" + rs.getString(3) + ",\t*用户类型:" + rs.getInt(4));
            }
            
            //7.释放连接
            rs.close();
            pstm.close();
            conn.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

特征:减少了一定量的代码重复,但是其实对减少冗余来说也还是杯水车薪的,每写一个功能也还是要写很多类似代码,同样累人,不美观= =

方法三(简单,使用封装,调用util工具类)

     充分使用封装,在util工具类中创建DBUtil,在其中将数据库信息、加载数据库驱动、获取数据库连接、获取sql语句并进行预编译以及释放资源的等方法全都封装起来,在使用的时候只要通过DBUtil调用具体方法就好了,就,贼舒服~

实现类

具体代码:

    DBUtil db=new DBUtil();
    Connection conn = null;
    PreparedStatement pstm = null;
    ResultSet rs = null;

    /**
     * 简化,封装
     * 打印全部
     */
    @Override
    public void printAllU() {

        try {
            //1.加载数据库驱动
            //2.连接数据库
            conn = db.getConn();

            //3.准备sql语句
            String sql="select * from tb_user";
            
            //4.选中语句并预编译处理
            Object[] params={};
            
            //5.产生结果
            rs = db.executeQuery(sql,params);
            
            //6.处理结果
            while (rs.next()){
                System.out.println("*用户编号:" + rs.getInt(1) + ",\t*用户名称:" + rs.getString(2) + ",\t*用户密码:" + rs.getString(3) + ",\t*用户类型:" + rs.getInt(4));
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //7.释放连接
            db.closeResource(rs, pstm, conn);
        }
    }

工具类

具体代码:

    //封装驱动地址、数据库信息
    private String driver = "com.mysql.jdbc.Driver";
    private String url = "jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8";
    private String jdbcuser = "root";
    private String pwd = "123456";

    public Connection conn = null;
    public PreparedStatement pstm = null;
    public ResultSet rs = null;

    //加载驱动+连接数据库
    public Connection getConn() {

        try {
            //加载数据库驱动
            Class.forName(driver);
            //获取数据库连接
            conn = DriverManager.getConnection(url, jdbcuser, pwd);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }


    //释放资源
    public void closeResource(ResultSet rs, PreparedStatement pstm, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (pstm != null) {
            try {
                pstm.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    //实现增删改BaseDao封装 -- Object[]占位“?”不知道是什么数据类型,所以用了泛型处理
    public int executeUpdate(String sql, Object[] params) {

        int num = 0;
        try {
            //预编译
            conn.prepareStatement(sql);
            //处理占位符“?”
            //判空
            if (params != null) {
                //循环获取
                for (int i = 0; i < params.length; i++) {
                    //因为不必知道类型,所以用泛型Object
                    pstm.setObject((i + 1), params[i]);
                }
            }
            num = pstm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return num;
    }


    //实现查询BaseDao封装 -- Object[]占位“?”不知道是什么数据类型,所以用了泛型处理
    public ResultSet executeQuery(String sql, Object[] params) {

        ResultSet rs = null;
        try {
            //预编译
            pstm = conn.prepareStatement(sql);
            //处理占位符“?”
            //判空
            if (params != null) {
                //循环获取
                for (int i = 0; i < params.length; i++) {
                    //因为不必知道类型,所以用泛型Object
                    pstm.setObject((i + 1), params[i]);
                }
            }
            rs = pstm.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

特征:大大减少了重复代码,大大减少了代码冗余,整洁又美观,方便又舒适,哦耶~

方法四(更简单,使用封装,调用工具类,设置properties资源配置文件)

     方法四是在方法三的基础之上,将驱动地址以及数据库的信息(包括数据库地址、数据库用户名和数据库密码)进一步封装到资源配置文件db.properties之中,这样做,能够方便用户通过直接修改资源配置文件而完成信息的更新修改!更加人性化了有木有~

工具类(部分代码区别)

具体代码:

    private static String driver;
    private static String url;
    private static String jdbcuser;
    private static String pwd;

    public Connection conn = null;
    public PreparedStatement pstm = null;
    public ResultSet rs = null;

    public static Properties properties = new Properties();

    //静态加载资源配置文件
    static {

        try {
            properties.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));

            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            jdbcuser = properties.getProperty("jdbcuser");
            pwd = properties.getProperty("pwd");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

db_properties资源配置文件

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf-8
jdbcuser = root
pwd = 123456

特征:大大减少了重复代码,大大减少了代码冗余,整洁又美观,方便又舒适,加之人性化升级~

总结

JDBC创建使用七步曲,以上都是围绕这“七步”做具体的简化和扩充~

1.加载数据库驱动
2.获取数据库连接
3.准备sql语句
4.选中语句并执行——预编译处理
5.产生结果
6.处理结果
7.释放连接

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值