1. 程式人生 > 其它 >【Java實習】Day 06

【Java實習】Day 06

技術標籤: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連線資料庫程式設計六步
  1. 註冊驅動。根據java的反射機制去註冊驅動Class.forName(全限定類名),通過反射機制載入Driver Manager.registerDriver(new Driver())可以提高執行效率:
Class.forName("com.mysql.jdbc.Driver");//這是mysql5的語法,mysql8可能會有點區別

java的反射機制:在類載入的時候就去執行某些操作或者獲取到類的某些資訊

  1. 獲取資料庫的連線:
String url = "jdbc:mysql://localhost:3306/資料庫名";
String username = 資料庫使用者名稱,預設都是"root";
String password = 密碼;
Connection connection = DriverManager.getConnection(url,username,password);
  1. 獲取資料庫操作物件
Statement statement = connection.createStatement();
  1. 預編譯資料庫,暫且不接觸
	 //connection.prepareStatement();//為了防止黑客通過注入的方式攻擊資料庫,需要先預編譯資料庫
  1. 執行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{
		刪除失敗;
	}
  1. 關閉資料庫,避免造成資源浪費
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(),否則會報空指標異常,因此需要進行非空校驗