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目录下读取文件。