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);

原文地址:https://www.cnblogs.com/1693977889zz/p/7264066.html