【Java實習】Day 06
阿新 • • 發佈:2021-01-17
技術標籤:Java
1、java連線資料庫的程式設計六步
2、前後端通過作用域共享資料,將後端資料響應到前端
- Student類
package pers.syx.beans;
/**
* 資料庫遍歷過程中,將每一條記錄都封裝成學生物件,再將學生物件裝到集合中
*/
public class Student {
private Integer id; //主鍵id
private String name;
private String hobby;
private String address;
private String birthday; //以字串形式存到資料庫的話,資料庫是可以接收的
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", hobby='" + hobby + '\'' +
", address='" + address + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public Student() {
}
public Student(Integer id, String name, String hobby, String address, String birthday) {
this.id = id;
this.name = name;
this.hobby = hobby;
this.address = address;
this.birthday = birthday;
}
}
- StudentServlet
package pers.syx.servlet;
import pers.syx.beans.Student;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
public class StudentServlet extends HttpServlet{
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("訪問成功了!!!");
//接收標識,確定執行的方法
String method = req.getParameter("method");
if(method != null) {
if (method.equals("test")) {
test(req, resp);
}
}
else{//如果不傳method,會報空指標異常。所以寫了一個else提示method為空
System.out.println("method為空!");
}
}
/**
* 測試資料庫資料,把資料庫資料響應到瀏覽器端
* @param req
* @param resp
*/
public void test(HttpServletRequest req, HttpServletResponse resp) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
//獲取資料庫所有資料
try {
//1、註冊驅動。專案中儘量捕獲異常而不是拋異常
Class.forName("com.mysql.jdbc.Driver");
//2、獲取連線
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/web_test", "root", "3170602003");
//3、建立資料庫操作物件
statement = connection.createStatement();
//4、執行SQL語句。無法將結果集物件直接響應瀏覽器,只能將集合響應到瀏覽器端
resultSet = statement.executeQuery("select * from tb_student");
//建立一個集合物件
ArrayList<Student> students = new ArrayList<>();
//遍歷集合
if(resultSet != null){
while(resultSet.next()){
String name = resultSet.getString("name");
String hobby = resultSet.getString("hobby");
String address = resultSet.getString("address");
Date birthday = resultSet.getDate("birthday");
//測試列印
// System.out.println(name);
// System.out.println(hobby);
// System.out.println(address);
// System.out.println(birthday);
//建立學生物件
Student student = new Student();
//給物件賦值
student.setName(name);
student.setHobby(hobby);
student.setAddress(address);
student.setBirthday(birthday.toString());
//把學生物件裝進集合
students.add(student);
}
}
//測試集合資料
for(Student student:students){
System.out.println(student);
}
//把集合物件存放到作用域。作用域存在於前端和後端的資料共享區
//req.setAttribute();//把資料存放在request域中,只限於在一次地址跳轉中,所以域範圍比較小
HttpSession session = req.getSession();//session會話物件。開啟瀏覽器時物件建立成功,關閉瀏覽器時物件銷燬,生命週期是從瀏覽器開啟到關閉
session.setAttribute("students",students);//把物件/資料存放到作用域,鍵值對<"key",value>,根據key獲取value
//執行重定向,地址會發生改變
resp.sendRedirect("http://localhost:8080/jsp/test.jsp");
} catch (Exception e) {
e.printStackTrace();
}finally {
//5、關閉資料庫資源
try {
resultSet.close();
statement.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
- test.jsp
<%--
Created by IntelliJ IDEA.
User: nosteglic
Date: 2021/1/4
Time: 15:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>測試資料</title>
</head>
<body>
<%--el表示式,從後端的域物件當中獲取資料 --%>
${students}
</body>
</html>
- 資料庫設計——學生表tb_stu
- 註冊驅動。根據java的反射機制去註冊驅動
Class.forName(全限定類名)
,通過反射機制載入Driver Manager.registerDriver(new Driver())
可以提高執行效率:
Class.forName("com.mysql.jdbc.Driver");//這是mysql5的語法,mysql8可能會有點區別
java的反射機制:在類載入的時候就去執行某些操作或者獲取到類的某些資訊
- 獲取資料庫的連線:
String url = "jdbc:mysql://localhost:3306/資料庫名";
String username = 資料庫使用者名稱,預設都是"root";
String password = 密碼;
Connection connection = DriverManager.getConnection(url,username,password);
- 獲取資料庫操作物件
Statement statement = connection.createStatement();
- 預編譯資料庫,暫且不接觸
//connection.prepareStatement();//為了防止黑客通過注入的方式攻擊資料庫,需要先預編譯資料庫
- 執行sql語句
- 查詢操作
ResultSet resultSet = statement.executeQuery("select * from 表名");
ResultSet 返回資料結果集
遍歷資料庫資料:
while(resultSet.next()){
String 變數名 = resultSet.getString("表的欄位名");
}
其中,變數型別和欄位型別一一對應
- 新增操作
int num = statement.executeUpdate("insert 表名(列名1,列名2)values(',')");
如果要拼接變數,則:
int num = statement.executeUpdate("insert 表名(列名1,列名2)values('"+變數名1+"','"+變數名2+"')");
返回的是影響記錄條數,存放在num中:
if(num == 1){
新增成功;
}else{
新增失敗;
}
在執行新增操作時,需要將查詢操作語句註釋掉。因為新增操作會對結果集產生影響,如果不註釋掉查詢操作相關語句的話會報錯
- 修改操作
int num = statement.executeUpdate("update 表名 set 列名1 = '值1',列名2 = '值2'" where 列名 = '值');
if(num == 1){
修改成功;
}else{
修改失敗;
}
- 刪除操作
int num = statement.executeUpdate("delete from 表名 where 列名 = '值'");
if(num == 1){
刪除成功;
}else{
刪除失敗;
}
- 關閉資料庫,避免造成資源浪費
finally{
try{
if(resultSet != null)
resultSet.close();
if(statement != null)
statement.close();
if(connection != null)
connection.close();
}catch(Exception e){
e.printStackTrace();
}
}
- 放在finally塊中是避免前面程式碼有錯誤,程式無法執行到關閉資料庫程式碼,從而造成的資源浪費。
- 如果resultSet等的值為空,則不能呼叫close(),否則會報空指標異常,因此需要進行非空校驗