• Java JDBC的基础知识(三)


    在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程。尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了。

    这些参数本来可以是在调用的时候再给的。以前学习过将工具类和测试类分开写的好处,下面就介绍数据库的工具类,它可以避免代码的臃肿的缺点。学会自己写一个数据库工具类,方便以后直接用。关键还是学会其中的编写思路。

    一、创建数据库工具类

    创建工具类的内容:

    1.私有化构造方法

    (防止别人欠欠new本类实例,也就是说这段程序也不是单例模式,工具运行时一个实例都没有)

    2.工具类里面有得到连接的方法

    3.工具类里面有关闭资源的方法

    4.工具类里面有注册驱动类

    二、创建数据库工具类具体操作及注意事项

    1.私有化构造方法

    public class DBUtil {
        // 私有化构造方法
        private DBUtil() {
        }
    }

     2.工具类里面有得到连接的方法

    //得到連接(Connection需导包)
        public static Connection getConn(){
            //return null;(先这样顶一下,不然编译器会报错)
            try {
                Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/t_employee","root","root");
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

     注意:当有执行语句之后,return null;要放在执行语句的后面。这个错误我找了3分钟。

        public static Connection getConn(){
            try {
                Connection conn=DriverManager.getConnection(url,user,password);//注意:这里就不要加双引号了。
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

    升级版代码:

    public static Connection getConn(){
            Connection conn=null;
            try {
                conn=DriverManager.getConnection(url,user,password);
            } catch (SQLException e) {
                //这里异常可以按照需求再设置一下,将问题反馈给用户
                throw new RuntimeException("获取连接失败");
            }
            return null;
        }

    注意:

    在getConnection中,三个参数(url,用户名、密码)都写死了,不是很使用。解决:可以在前面声明)。另外,考虑到在public static Connection getConn(){}这个静态的方发里,静态方法不可以访问实例对象成员,所以,在前面声明三个参数的时候,都要加上static修饰(static写在private的左边或者右边,都可以。编译器不会不报错)。

        private static String url="";
        private static String user="";
        private static String password="";
    Connection conn=DriverManager.getConnection(url,user,password);

    3.工具类里面有关闭资源的方法

        public static void close(ResultSet rs, Statement stm, Connection conn) {
            if (rs != null) {
                try {
                    rs.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (stm != null) {
                try {
                    stm.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
        }

    4.工具类里面有注册驱动类

    一般来说,驱动类可以写在private DBUtil(){}这个构造方发里,但是,这个构造方法在创建时的初衷是为了不让别人new本类实例,驱动加载这里,就违背了这一点。

    在写注册驱动类时,考虑把它写在单独的静态代码块里面。

    好处:静态代码块只加载一次!!!恰好符合驱动类只需加载一次的特性。

        static{
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    注意:"com.mysql.jdbc.Driver"又是写死的状态,不实用。解决办法——在前面声明。

    private static String className="";
    static{
            try {
                Class.forName(className);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    注意:

    在加载驱动类的时候,如果忘记加jar包,就会抛出如下的异常。(这种错误很常见!)

    Could not initialize class.DBUtil

    三、测试类就会变得很轻盈

    import java.sql.Connection;
    import java.sql.Statement;
    
    public class TestDemo {
        public static void main(String[] args) {
            add();
        }
    
        static void add() {
            Connection conn = null;
            Statement stm = null;
    
            try {
                conn = DBUtil.getConn();
                stm = conn.createStatement();
                String sql = "insert into t_employee(name,age,salary) values('阿三',23,90000)";
                // 切记:阿三要用单引号!!!
                stm.executeQuery(sql);
    
                System.out.println("执行成功");// 加一句,打印到控制台,验证程序没挂
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                DBUtil.close(null, stm, conn);
                // 第一个参数rs会报错:rs cannot be resolved to a variable,这里用null顶一下。
            }
    
        }
    }

    注意:下面这条代码

    stm.executeQuery(sql);

    当上面的add(){}被设置为void(无返回值)即,static void add(){}时,用stm.executeQuery(sql);

    当上面的add(){}被设置为有返回值时,比如static add(){}时,用stm.executeQueryUpdate(sql);

  • 相关阅读:
    Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
    Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)
    在Ocelot中使用自定义的中间件(二)
    在Ocelot中使用自定义的中间件(一)
    基于Angular 8和Bootstrap 4实现动态主题切换
    ASP.NET Core 2.0 Web API项目升级到ASP.NET Core 3.0概要笔记
    使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群
    使用Rancher在Microsoft Azure上搭建Kubernetes集群
    容器化单页面应用中Nginx反向代理与Kubernetes部署
    在C#中使用Irony实现SQL语句的解析
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/7264066.html
Copyright © 2020-2023  润新知