201621123063《java程序設計》第14周實驗總結
1. 本周學習總結
1.1 以你喜歡的方式(思維導圖或其他)歸納總結與數據庫相關內容。
2. 使用數據庫技術改造你的系統
2.1 簡述如何使用數據庫技術改造你的系統。要建立什麽表?截圖你的表設計。
圖書借閱系統使用數據庫存儲館藏圖書信息,要建立圖書信息表。
id
作為主鍵
將圖書表從數據庫中讀出:
數據庫圖表:
成功讀取並放入JTable顯示:
2.2 系統中使用到了JDBC中什麽關鍵類?
Connection
:獲得與數據庫的連接
DriverManger
:驅動管理器,註冊驅動
PreparedStatement
:Statement子類,預編譯SQL語句後讓數據庫執行
ResultSet
2.3 截圖數據庫相關模塊的關鍵代碼。關鍵行需要加註釋。
3. 代碼量統計
3.1 統計本周完成的代碼量
需要將每周的代碼統計情況融合到一張表中。
周次 | 行數 | 新增行數 | 文件數 | 新增文件數 |
---|---|---|---|---|
1 | 226 | 226 | 45 | 45 |
2 | 377 | 377 | 7 | 7 |
3 | 712 | 281 | 42 | 9 |
4 | 166 | 166 | 2 | 2 |
5 | 253 | 253 | 4 | 4 |
6 | 484 | 484 | 9 | 9 |
7 | 269 | 269 | 1 | 1 |
8 | 301 | 32 | 5 | 4 |
9 | 447 | 447 | 7 | 7 |
10 | 401 | 26 | 9 | 0 |
11 | 1262 | 1262 | 18 | 18 |
12 | 965 | 965 | 12 | 12 |
13 | 887 | 887 | 9 | 9 |
14 | 675 | 675 | 10 | 10 |
選做:4. 數據庫學習指導
1. MySQL數據庫基本操作
建立數據庫,將自己的姓名、學號作為一條記錄插入。(截圖,需出現自己的學號、姓名)
在自己建立的數據庫上執行常見SQL語句
2. 使用JDBC連接數據庫與Statement
2.1 使用Statement操作數據庫。完成實驗任務書-題目2。截圖其中的public static void displayAll()與public static int insert(Student stu)的關鍵代碼並出現自己的學號。
2.2 如果要完成根據指定姓名查詢學生數據,即完成函數public Student findStuByName(String name),其中的sql語句怎麽寫?
String sql = "select * from students WHERE name = "+name;
2.3 你認為使用JDBC操作數據庫的套路是什麽?
①加載數據庫驅動
②建立數據庫連接
③創建數據庫操作對象
④定義操作的SQL語句
⑤執行數據庫操作
⑥獲取並操作結果集
⑦close()關閉對象
參考:實驗任務書-題目2
3. PreparedStatement與參數化查詢
3.1 使用PreparedStatement,編寫public Student findStuByName(String name),實現根據name進行查找, 。(粘貼關鍵代碼及運行截圖,運行截圖中需出現學號,比較2.2,說明兩種實現的不同)
public static Student findStuByName(String name)
{
String URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String userName = "root";
String password = "123456";
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Student student = null;
String sql = "select*from students where name = ?";
try {
conn = DriverManager.getConnection(URL, userName, password);
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, name);
resultSet = preparedStatement.executeQuery();
while(resultSet.next())
{
student = new Student(resultSet.getInt("id"),resultSet.getString("stuno"),resultSet.getString("name"),resultSet.getInt("age"),resultSet.getDate("birthdate"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
preparedStatement = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null)
try {
conn.close();
conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
return student;
}
運行截圖:
不同:PreparedStatement
的執行效率高於Statement
,Statement
每次執行sql語句,相關數據庫都要執行sql
語句的編譯,Preparedstatement
是預編譯的。
3.2 如果要實現模糊查找,怎麽修改?比如編寫public List
public static List<Student> findStusByName(String name)
{
String URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String userName = "root";
String password = "123456";
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String sql = "select*from students where name like ?";
List<Student> students = new ArrayList<>();
try {
conn = DriverManager.getConnection(URL, userName, password);
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, "%"+name+"%");
resultSet = preparedStatement.executeQuery();
while(resultSet.next())
{
Student student = new Student(resultSet.getInt("id"),resultSet.getString("stuno"),resultSet.getString("name"),resultSet.getInt("age"),resultSet.getDate("birthdate"));
students.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
preparedStatement = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null)
try {
conn.close();
conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
return students;
}
測試數據:
運行截圖:
6. 事務處理
6.1 使用代碼與運行結果證明你確實實現了事務處理功能,並說明事務處理時在編碼時需要註意哪些?註意:要比較運行成功與運行失敗兩種情況下對數據庫的更改情況。(粘貼一段你認為比較有價值的代碼,出現學號)
測試數據:
更改前:
更改後:
運行失敗:數據庫中數據沒有變化
註意:數據庫操作要分步進行,不能同時進行多個操作
6.2 你覺得什麽時候需要使用事務處理?
對數據庫的數據進行連續操作時,為了保證數據的一致性和正確性,需要使用事務處理。當對數據庫的數據進行操作失敗時,事務處理可以讓所有的數據回滾到進行操作之前的數據。
選做:5.課外閱讀
5.2 代碼結構中Dao,Service,Controller,Util,Model是什麽意思,為什麽劃分
Dao: Data Access Object,負責數據存取
Service:服務,完成一些指定的工作
Controller:控制器,所有的指令都由控制器發出
Util:工具,常用來處理和業務邏輯沒有關系的數據
Model:模型,描述了一個類型數據的定義,通常是各數據的集合
劃分好處:
①劃分代碼結構可以讓代碼具有良好的可移植性
②可以讓多人協作並行開發更容易
③開發時能對程序的結構有更清晰的概念
5.3 mysq數據庫管理工具navicat基本使用方法
可以直接在可視化圖表中對數據進行一些常規操作,在查詢
中可以用代碼語句對數據庫進行增刪改查和事務控制
201621123063《java程序設計》第14周實驗總結