Java學習路線教程之JDBC基本操作
為了幫助大家熟練應用JDBC程式設計,接下來,在本節將通過一個綜合案例來講解JDBC的基本操作,確保大家能夠深刻理解JDBC的增、刪、改、查,靈活利用JDBC完成對資料庫的各項操作。
1. 建立一個Java類Student
在工程chapter01下建立com.qfedu.jdbc.domain包,並在該包下建立用於儲存學生資料的類Student,具體程式碼如例1-1所示。
【例1-1】 Student.java
1 package com.qfedu.jdbc.domain;
2 public class Student {
3 private int id;
4 private String sname;
5 private String age;
6 private String course;
7 public Student() {
8 super();
9 }
10 public Student(int id, String sname, String age, String course) {
11 super();
12 this.id = id;
13 this.sname = sname;
14 this.age = age;
15 this.course = course;
16 }
17 public int getId() {
18 return id;
19 }
20 public void setId(int id) {
21 this.id = id;
22 }
23 public String getSname() {
24 return sname;
25 }
26 public void setSname(String sname) {
27 this.sname = sname;
28 }
29 public String getAge() {
30 return age;
31 }
32 public void setAge(String age) {
33 this.age = age;
34 }
35 public String getCourse() {
36 return course;
37 }
38 public void setCourse(String course) {
39 this.course = course;
40 }
41 @Override
42 public String toString() {
43 return "Student [id=" + id + ", sname=" + sname + ", age=" + age +
44 ", course=" + course + "]";
45 }
46 }
2. 建立JDBCUtils工具類
在開發過程中,每次對資料庫的操作都需要註冊驅動、獲取連線、關閉資源等,造成大量重複程式碼。為了降低冗餘,提升開發效率,一般將JDBC的相關操作封裝到JDBC工具類中。在src目錄下新建com.qfedu.jdbc.utils包,並在該包下建立JDBCUtils工具類,具體程式碼如例1-2所示。
【例1-2】 JDBCUtils.java
1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.PreparedStatement;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 public class JDBCUtils {
7 private static String url = "jdbc:mysql://localhost:3306/chapter01";
8 private static String user = "root";
9 private static String pass = "root";
10 private static Connection conn = null;
11 static{
12 try{
13 Class.forName("com.mysql.jdbc.Driver");
14 conn = DriverManager.getConnection(url, user, pass);
15 }catch(Exception ex){
16 ex.printStackTrace();
17 //資料庫連線失敗,直接停止程式,丟擲執行時期異常
18 throw new RuntimeException("資料庫連線失敗");
19 }
20 }
21 //獲取連結
22 public static Connection getConnecton(){
23 return conn;
24 }
25 //釋放資源
26 public static void release(Connection conn,PreparedStatement
27 pstat,ResultSet rs) {
28 if (rs!=null) {
29 try {
30 rs.close();
31 } catch (SQLException e) {
32 e.printStackTrace();
33 }
34 rs=null;
35 }
36 release(conn,pstat);
37 }
38 public static void release(Connection conn,PreparedStatement pstat) {
39 if (pstat!=null) {
40 try {
41 pstat.close();
42 } catch (SQLException e) {
43 e.printStackTrace();
44 }
45 pstat=null;
46 }
47 if (conn !=null) {
48 try {
49 conn.close();
50 } catch (SQLException e) {
51 e.printStackTrace();
52 }
53 conn=null;
54 }
55 }
56 }
3. 新建StudentDao類
在src目錄下新建com.qfedu.jdbc.dao包,並在該包下新建StudentDao類,該類提供對資料庫表的增加、修改、刪除、查詢等操作,具體程式碼如例1-3所示。
【例1-3】 StudentDao.java
1 package com.qfedu.jdbc.dao;
2 import java.sql.Connection;
3 import java.sql.PreparedStatement;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 import java.util.ArrayList;
7 import com.qfedu.jdbc.domain.Student;
8 import com.qfedu.jdbc.utils.JDBCUtils;
9 public class StudentDao {
10 //新增Student
11 public boolean insert(Student student){
12 boolean flag =false ;
13 PreparedStatement pstat = null;
14 Connection conn = JDBCUtils.getConnecton();
15 String sql ="insert into student(sid,sname,age,course)
16 values(?,?,?,?)";
17 try {
18 pstat = conn.prepareStatement(sql);
19 pstat.setInt(1, student.getSid());
20 pstat.setString(2, student.getSname());
21 pstat.setString(3, student.getAge());
22 pstat.setString(4, student.getCourse());
23 int num = pstat.executeUpdate();
24 if (num>0) {
25 flag =true;
26 }
27 } catch (SQLException e) {
28 e.printStackTrace();
29 }finally {
30 JDBCUtils.release(conn, pstat);
31 }
32 return flag;
33 }
34 //更新Student
35 public boolean update(Student student){
36 boolean flag =false ;
37 PreparedStatement pstat = null;
38 Connection conn = JDBCUtils.getConnecton();
39 String sql ="update student set sname=?,age=?,course=? where
40 sid=? ";
41 try {
42 pstat = conn.prepareStatement(sql);
43 pstat.setInt(4, student.getSid());
44 pstat.setString(1, student.getSname());
45 pstat.setString(2, student.getAge());
46 pstat.setString(3, student.getCourse());
47 int num = pstat.executeUpdate();
48 if (num>0) {
49 flag =true;
50 }
51 } catch (SQLException e) {
52 e.printStackTrace();
53 }finally {
54 JDBCUtils.release(conn, pstat);
55 }
56 return flag;
57 }
58 //刪除Student
59 public boolean delete(Student student){
60 boolean flag =false ;
61 PreparedStatement pstat = null;
62 Connection conn = JDBCUtils.getConnecton();
63 String sql ="delete from student where sid=?";
64 try {
65 pstat = conn.prepareStatement(sql);
66 pstat.setInt(1, student.getSid());
67 int num = pstat.executeUpdate();
68 if (num>0) {
69 flag =true;
70 }
71 } catch (SQLException e) {
72 e.printStackTrace();
73 }finally {
74 JDBCUtils.release(conn, pstat);
75 }
76 return flag;
77 }
78 //查詢所有Student
79 public ArrayListselectAll(){
80 PreparedStatement pstat = null;
81 Connection conn = JDBCUtils.getConnecton();
82 String sql ="select * from student";
83 ArrayListlist = new ArrayList<>();
84 try {
85 pstat = conn.prepareStatement(sql);
86 ResultSet rs = pstat.executeQuery(sql);
87 while (rs.next()) {
88 Student newStudent = new Student();
89 newStudent.setSid(rs.getInt("sid"));
90 newStudent.setSname( rs.getString("sname"));
91 newStudent.setAge(rs.getString("age"));
92 newStudent.setCourse(rs.getString("course"));
93 list.add(newStudent);
94 }
95 } catch (SQLException e) {
96 e.printStackTrace();
97 }finally {
98 JDBCUtils.release(conn, pstat);
99 }
100 return list;
101 }
102 //查詢單個Student
103 public Student selectOne(Student student){
104 PreparedStatement pstat = null;
105 Connection conn = JDBCUtils.getConnecton();
106 String sql ="select * from student where sid = ? ";
107 Student newStudent = new Student();
108 try {
109 pstat = conn.prepareStatement(sql);
110 pstat.setInt(1, student.getSid());
111 ResultSet rs = pstat.executeQuery();
112 while (rs.next()) {
113 newStudent.setSid(rs.getInt("sid"));
114 newStudent.setSname( rs.getString("sname"));
115 newStudent.setAge(rs.getString("age"));
116 newStudent.setCourse(rs.getString("course"));
117 }
118 } catch (SQLException e) {
119 e.printStackTrace();
120 }finally {
121 JDBCUtils.release(conn, pstat);
122 }
123 return newStudent;
124 }
125 }
4. 編寫測試類TestInsert
在src目錄下新建com.qfedu.jdbc.test包,並在該包下新建TestInsert類,該類用於測試向表中新增資料的操作,具體程式碼如例1-4所示。
【例1-4】 TestInsert.java
1 package com.qfedu.jdbc.test;
2 import com.qfedu.jdbc.dao.StudentDao;
3 import com.qfedu.jdbc.domain.Student;
4 public class TestInsert {
5 public static void main(String[] args) {
6 StudentDao studentDao = new StudentDao();
7 Student student = new Student();
8 student.setSid(10);
9 student.setSname("sunqi");
10 student.setAge("23");
11 student.setCourse("python");
12 studentDao.insert(student);
13 }
14 }
執行TestInsert類,向資料表student中插入資料,通過SQL語句測試資料是否新增成功,執行結果如下所示。
mysql> SELECT * FROM STUDENT;
+-----+-------------+------+--------+
| sid | sname | age | course |
+-----+-------------+------+--------+
| 1 | zhangsan | 20 | Java |
| 2 | lisi | 21 | Java |
| 3 | wangwu | 22 | Java |
| 4 | zhaoliu | 22 | Python |
| 5 | sunqi | 22 | PHP |
| 6 | zhangsansan | 22 | PHP |
| 7 | name0 | 22 | Java |
| 8 | name1 | 22 | Java |
| 9 | name2 | 22 | Java |
| 10 | sunqi | 23 | Python |
+-----+-------------+------+--------+
10 rows in set (0.00 sec)
從以上執行結果可以看出,程式成功向資料表新增一條資料。
5. 編寫測試類TestUpdate
在src目錄下的com.qfedu.jdbc.test包下新建TestUpdate類,該類用於測試更新表中資料的操作,具體程式碼如例1-5所示。
【例1-5】 TestUpdate.java
1 package com.qfedu.jdbc.test;
2 import com.qfedu.jdbc.dao.StudentDao;
3 import com.qfedu.jdbc.domain.Student;
4 public class TestUpdate {
5 public static void main(String[] args) {
6 StudentDao studentDao = new StudentDao();
7 Student student = new Student();
8 student.setSid(10);
9 student.setSname("zhouba");
10 student.setAge("24");
11 student.setCourse("Java");
12 studentDao.update(student);
13 }
14 }
執行TestUpdate類,更新資料庫中sid值為10的資料資訊,通過SQL語句測試資料是否更新成功,執行結果如下所示。
mysql> SELECT * FROM STUDENT;
+-----+-------------+------+--------+
| sid | sname | age | course |
+-----+-------------+------+--------+
| 1 | zhangsan | 20 | Java |
| 2 | lisi | 21 | Java |
| 3 | wangwu | 22 | Java |
| 4 | zhaoliu | 22 | Python |
| 5 | sunqi | 22 | PHP |
| 6 | zhangsansan | 22 | PHP |
| 7 | name0 | 22 | Java |
| 8 | name1 | 22 | Java |
| 9 | name2 | 22 | Java |
| 10 | zhouba | 24 | Java |
+-----+-------------+------+--------+
10 rows in set (0.00 sec)
從以上執行結果可以看出,程式成功更新sid值為10的資料。
6. 編寫測試類TestDelete
在src目錄下的com.qfedu.jdbc.test包下新建TestDelete類,該類用於測試刪除表中資料的操作,具體程式碼如例1-6所示。
【例1-6】 TestDelete.java
1 package com.qfedu.jdbc.test;
2 import com.qfedu.jdbc.dao.StudentDao;
3 import com.qfedu.jdbc.domain.Student;
4 public class TestDelete {
5 public static void main(String[] args) {
6 StudentDao studentDao = new StudentDao();
7 Student student = new Student();
8 student.setSid(10);
9 studentDao.delete(student);
10 }
11 }
執行TestDelete類,刪除資料庫中sid值為10的資料資訊,通過SQL語句測試資料是否刪除成功,執行結果如下所示。
mysql> SELECT * FROM STUDENT;
+-----+-------------+------+--------+
| sid | sname | age | course |
+-----+-------------+------+--------+
| 1 | zhangsan | 20 | Java |
| 2 | lisi | 21 | Java |
| 3 | wangwu | 22 | Java |
| 4 | zhaoliu | 22 | Python |
| 5 | sunqi | 22 | PHP |
| 6 | zhangsansan | 22 | PHP |
| 7 | name0 | 22 | Java |
| 8 | name1 | 22 | Java |
| 9 | name2 | 22 | Java |
+-----+-------------+------+--------+
9 rows in set (0.00 sec)
從以上執行結果可以看出,程式成功刪除sid值為10的資料。
7. 編寫測試類TestSelectOne
在src目錄下的com.qfedu.jdbc.test包下新建TestSelectOne類,該類用於測試查詢表中單條資料的操作,具體程式碼如例1-7所示。
【例1-7】 TestSelectOne.java
1 package com.qfedu.jdbc.test;
2 import com.qfedu.jdbc.dao.StudentDao;
3 import com.qfedu.jdbc.domain.Student;
4 public class TestSelectOne {
5 public static void main(String[] args) {
6 StudentDao studentDao = new StudentDao();
7 Student student = new Student();
8 student.setSid(1);
9 Student findStudent = studentDao.selectOne(student);
10 System.out.println(findStudent.toString());
11 }
12 }
執行TestSelectOne類,程式的執行結果如圖1.1所示。
圖1.1 執行結果
從以上執行結果可以看出,程式成功查詢出sid值為1的資料並輸出到控制檯。
8. 編寫測試類TestSelectAll
在src目錄下的com.qfedu.jdbc.test包下新建TestSelectAll類,該類用於測試查詢表中所有資料的操作,具體程式碼如例1-8所示。
【例1-8】 TestSelectAll.java
1 package com.qfedu.jdbc.test;
2 import java.util.ArrayList;
3 import com.qfedu.jdbc.dao.StudentDao;
4 import com.qfedu.jdbc.domain.Student;
5 public class TestSelectAll {
6 public static void main(String[] args) {
7 StudentDao studentDao = new StudentDao();
8 ArrayListlist = studentDao.selectAll();
9 for (Student student : list) {
10 System.out.println(student.toString());
11 }
12 }
13 }
執行TestSelectAll類,程式的執行結果如圖1.2所示。
圖1.2 執行結果
從以上執行結果可以看出,程式成功查詢出表student中所有資料並輸出到控制檯。