JDBC(获取数据库连接、自定义JDBC工具类)

1、JDBC

(1)概念:

JDBC(Java DataBase Connectivity,java数据库连接),是java程序访问数据库的标准API,是由java语言编写的类和接口组成。但是访问不同的数据库要有不同的数据库驱动。java只是提供接口,具体实现由不同的数据库生产厂商来实现(数据库驱动)。

(2)使用JDBC访问数据库:

加载驱动:

Class.forName("com.mysql.jdbc.Driver");
  • forName方法是Class类的静态方法,参数是要加载的驱动程序的名称。

创建数据库连接:

        String url = "jdbc:mysql://localhost:3306/student mangement system";//url: 数据库地址  jdbc:mysql://连接主机IP:端口号//数据库名字
        String username="root";
        String password="root";
        Connection con = DriverManager.getConnection(url, username, password);
  • url是数据库地址,连接数据库还需要数据库的用户名和密码
  • DriverManager类的getConnection实现了实现数据库连接的方法

创建Statement对象:

Statement对象或他的子类,为数据库传输sql语句并返回执行结果。

Statement stat = con.createStatement();

执行sql语句:

  • 即通Statement对象调用方法执行sql语句。
  • public int executeUpdate(String sql);  执行insert 、update、 delete语句,或者是DDL语句,返回值是受影响的行数。
  • public ResultSet executeQuery(String sql);  执行select语句,将结果集封装在结果集对象ResultSet中。

释放资源:

    stat.close();
    con.close();

 2、自定义JDBC工具类

(1)不含配置文件:

因为数据库的连接代码都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取数据库的连接对象。

 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 import java.sql.Statement;
 6 
 7 public final class JDBCUtils {// 不能被继承或重写
 8     private JDBCUtils() {
 9     }
10 
11     private static Connection con;
12 
13     static {
14         try {
15             Class.forName("com.mysql.jdbc.Driver");
16             String url = "jdbc:mysql://localhost:3306/student mangement system";
17             String username = "root";
18             String password = "root";
19             con = DriverManager.getConnection(url, username, password);
20         } catch (Exception e) {
21             e.printStackTrace();
22             throw new RuntimeException(e + "数据库连接失败");
23         }
24     }
25 
26     public static Connection getConnection() {
27         return con;
28     }
29 
30     public static void close(Connection con, Statement stat) {
31 
32         if (stat != null) {
33             try {
34                 stat.close();
35             } catch (SQLException e) {
36                 e.printStackTrace();
37                 System.out.println("stat流关闭异常!");
38             }
39         }
40 
41         if (con != null) {
42             try {
43                 con.close();
44             } catch (SQLException e) {
45                 e.printStackTrace();
46                 System.out.println("con流关闭异常!");
47             }
48         }
49 
50     }
51 
52     public static void close(Connection con, Statement stat, ResultSet rs) {
53         if (rs != null) {
54             try {
55                 rs.close();
56             } catch (SQLException e) {
57                 e.printStackTrace();
58                 System.out.println("rs流关闭异常!");
59             }
60         }
61 
62         if (stat != null) {
63             try {
64                 stat.close();
65             } catch (SQLException e) {
66                 e.printStackTrace();
67                 System.out.println("stat流关闭异常!");
68             }
69         }
70 
71         if (con != null) {
72             try {
73                 con.close();
74             } catch (SQLException e) {
75                 e.printStackTrace();
76                 System.out.println("con流关闭异常!");
77             }
78         }
79 
80     }
81 }

测试工具类:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test {
    public static void main(String[] args)throws Exception {
        Connection con = JDBCUtils.getConnection();
        PreparedStatement pst = con.prepareStatement("SELECT sname,studentno FROM student");
        ResultSet rs = pst.executeQuery();
        while(rs.next()){
            System.out.println(rs.getString("sname")+"   "+rs.getString("studentno"));
        }
        JDBCUtils.close(con, pst, rs);
    }
}

(2)含有配置文件的工具类:

 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 import java.util.Properties;
 9 
10 public class JDBCUtils {
11     private static Connection con;
12     private static String driver;
13     private static String url;
14     private static String username;
15     private static String password;
16 
17     static {// 静态代码块只执行一次,获取一次信息即可
18         try {
19             readConfig();
20             Class.forName(driver);
21             con = DriverManager.getConnection(url, username, password);
22         } catch (Exception ex) {
23             throw new RuntimeException("数据库连接失败");
24         }
25     }
26 /*
27  * getClassLoader();返回该类的加载器
28  * getResourceAsStream();查找具有给定名称的资源 
29  */
30     private static void readConfig() {
31         InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("JDBC.properties");
32         Properties pro = new Properties();
33         try {
34             pro.load(in);
35         } catch (IOException e) {
36             e.printStackTrace();
37         }
38         driver = pro.getProperty("driver");
39         url = pro.getProperty("url");
40         username = pro.getProperty("username");
41         password = pro.getProperty("password");
42     }
43 
44     public static Connection getConnection() {
45         return con;
46     }
47     public static void close(Connection con, Statement stat) {
48 
49         if (stat != null) {
50             try {
51                 stat.close();
52             } catch (SQLException e) {
53                 e.printStackTrace();
54                 System.out.println("stat流关闭异常!");
55             }
56         }
57 
58         if (con != null) {
59             try {
60                 con.close();
61             } catch (SQLException e) {
62                 e.printStackTrace();
63                 System.out.println("con流关闭异常!");
64             }
65         }
66 
67     }
68 
69     public static void close(Connection con, Statement stat, ResultSet rs) {
70         if (rs != null) {
71             try {
72                 rs.close();
73             } catch (SQLException e) {
74                 e.printStackTrace();
75                 System.out.println("rs流关闭异常!");
76             }
77         }
78 
79         if (stat != null) {
80             try {
81                 stat.close();
82             } catch (SQLException e) {
83                 e.printStackTrace();
84                 System.out.println("stat流关闭异常!");
85             }
86         }
87 
88         if (con != null) {
89             try {
90                 con.close();
91             } catch (SQLException e) {
92                 e.printStackTrace();
93                 System.out.println("con流关闭异常!");
94             }
95         }
96 
97 }
98 }
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test {
    public static void main(String[] args) {

        ResultSet rs = null;
        PreparedStatement pst = null;

        Connection con = JDBCUtils.getConnection();
        try {
            pst = con.prepareStatement("SELECT sname,studentno FROM student");
            rs = pst.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("sname") + "   "
                        + rs.getString("studentno"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        JDBCUtils.close(con, pst, rs);
    }
}

配置文件:

这样在以后更换数据库后,只需更改配置文件即可,不用再修改程序里面的内容。

利用Properties类,读取配置文件中的信息,通过键获取值。

类加载器getClassLoader()负责读取 Java 字节代码,因为在实际情况下,用户得到的项目没有sre文件夹,只能在bin目录下读取文件。

原文地址:https://www.cnblogs.com/zhai1997/p/11375165.html