如何寫出頁面連線資料庫的程式(Learned from 劉宇恆)

3jingsh0u發表於2024-12-08

IDEA+Mysql
這次寫的是一個使用者管理的系統
實現功能:
註冊賬戶(增)
登出賬戶(刪)
修改密碼(改)
使用者登入(查)
Mysql
新建一個資料庫(db1)
用db1新建一張表(tb_user)
設定兩個資料,使用者名稱和密碼.

mysql
create database db1;
use db1;
create table tb_user (
username varchar(15),
password varchar(15)
);
確認成功建立即可

IEDA
1.新建一個空專案


2.在專案(Demo2)下新建一個new module (Test)


3.Java專案中,pom.xml 檔案是 Maven 專案的核心配置檔案。POM 代表“專案物件模型”(Project Object Model),它定義了專案的基本資訊和配置,包括依賴項、構建過程、外掛以及其他特性。

主要部分解釋:

project: 根元素,定義了整個 POM 檔案。

modelVersion: POM 模型的版本,當前通常使用 4.0.0。

groupId: 專案的唯一識別符號,通常是組織或公司的域名反向書寫。

artifactId: 專案的名稱,通常是專案的基本名稱。

version: 專案的版本號,通常使用語義版本控制。

packaging: 指定輸出型別,如 jar 或 war。

name: 專案的顯示名稱。

description: 專案的簡要描述。

dependencies: 專案的依賴項定義。每個依賴項都有 groupId、artifactId 和 version。

build: 構建配置,包括構建所用的外掛和相關的配置。

plugins: 構建過程中使用的 Maven 外掛,例如上面示例中的 maven-compiler-plugin,指定 Java 源和目標版本。
相同功能的專案 copy相同的即可.

我的程式碼

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>Test</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Test Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.33</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>
    <!--     axios -->
    <!--  https://mvnrepository.com/artifact/org.webjars.npm/axios  -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!--     Maven helper 外掛 -->
    <!--  https://mvnrepository.com/artifact/org.nuiton/maven-helper-plugin  -->
    <!--  https://mvnrepository.com/artifact/org.nuiton/maven-helper-plugin  -->
    <!--      serlet api -->
    <!--  https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api  -->
    <!--  https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api  -->
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.17.0</version>
    </dependency>
    <!--     mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
    <!--     mysql -->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!--  https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl  -->
    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-jstlel</artifactId>
      <version>1.2.5</version>
    </dependency>


  </dependencies>
  <build>
    <finalName>Test</finalName>

    <plugins>
      <!-- tomcat外掛 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>7463</port>
          <!--           <path>/web_demo_3/HelloWeb.html</path> -->
          <!--                  web_demo_3/HelloWeb.html -->
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>11</source>
          <target>11</target>
        </configuration>
      </plugin>
    </plugins>


  </build>
</project>

貼上後記得點選更新,隨後IDEA會自動下載依賴

4.新建如下.xml檔案(resource下新建資料夾點"."需要用斜槓也就是除號"/"替換)(注意縮排層次)

UserMapper.xml下的程式碼是 MyBatis 框架的一個 Mapper 檔案的基本結構。MyBatis 是一種持久層框架,它支援將 SQL 查詢與 Java 物件進行對映,使開發者能夠更方便地進行資料庫操作.包括xml宣告,dtd宣告和mapper元素.

UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.stdu.mapper.UserMapper">


</mapper>

mybatis-config.xml下的程式碼是 MyBatis 框架的配置檔案(通常命名為 mybatis-config.xml),用於設定 MyBatis 的全域性配置,包括資料庫連線、事務管理和對映器的配置
主要功能是資料庫連線配置:透過 dataSource 元素配置資料庫的連線資訊,包括驅動、URL、使用者名稱和密碼。
事務管理:設定 JDBC 事務管理器,適用於簡單的事務處理。
環境定義:支援多環境配置,方便在不同的開發、測試和生產環境中切換。
Mapper 對映:指定 SQL 對映檔案的位置,以便 MyBatis 可以找到並執行相應的 SQL 語句

程式碼如下

mybatis-config.xml
```plaintext
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--                資料庫名稱-->
                <property name="url" value="jdbc:mysql://localhost:3306/db1?useSSL=false&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;userServerPreStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/stdu/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

5.因為idea社群版沒有web程式框架就需要自己新增
新建如下資料夾(注意縮排層次)

web.xml 是 Java EE Web 應用程式的部署描述符檔案,主要用於配置和控制應用程式的行為。以下是 web.xml 檔案能實現的主要功能:

(1). Servlet 配置
定義 Servlets: 可以透過 servlet 和 servlet-mapping 元素定義和對映 servlets。例如,可以指定哪些 URL 請求將由哪些 servlets 處理。

(2). 初始化引數
提供初始化引數: 透過 init-param 元素,可以為 servlets 提供初始化引數。這些引數可以在 servlet 中訪問。

(3). 過濾器配置
定義 Filters: 透過 filter 和 filter-mapping 元素定義過濾器,可以在 servlets 處理請求之前或之後執行特定操作,比如日誌記錄、安全檢查等。

(4). 監聽器配置
設定 Listeners: 透過 listener 元素可以配置應用的監聽器。監聽器是監聽特定事件(如應用啟動、關閉、會話建立等)並做出響應的類。

(5). 錯誤頁面處理
定義錯誤頁面: 可以透過 error-page 元素指定應用在出現特定錯誤(如 404 找不到頁面,500 伺服器錯誤)時的處理頁面。
(6). 安全配置
安全約束: 可以透過 security-constraint 元素定義訪問控制。可以為特定 URL 模式配置登入要求和訪問控制。

(7). 會話配置
會話管理: 可以配置會話超時時間,以及其他與會話生命週期相關的設定。

(8). MIME 型別和歡迎檔案
指定 MIME 型別: 可以定義副檔名的 MIME 型別。
歡迎檔案: 定義預設的歡迎檔案,比如當使用者訪問根 URL 時顯示的頁面。
由於我們是第一個最簡單的程式,以上功能未使用只有個DOCTYPE 宣告宣告宣告此文件遵循 Java Servlet 2.3 規範的 Document Type Definition (DTD)。
PUBLIC ID 說明了此 DTD 的公共名稱和提供的 URL,以便進行驗證和解析

web.xml
```plaintext
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
</web-app>

6.java資料夾下新建以下三個資料夾

pojo 代表 "Plain Old Java Object",通常用作簡單的資料模型或資料傳輸物件。POJO 類是普通的 Java 類,不依賴於特定的架構或框架,通常只包含欄位、建構函式、getter 和 setter 方法
pojo下新建User

User.java
```plaintext
package com.stdu.pojo;

public class User {
    private String username;
    private String password;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public User() {
    }
}

mapper 資料夾下的程式碼(無論是 Java 介面還是 XML 對映檔案)主要負責定義和實現與資料庫的操作,將 SQL 語句與 Java 方法對映起來
mapper資料夾下新建UserMapper檔案 注意要選擇介面(interface)

Servlet 資料夾下的程式碼透過處理 HTTP 請求,生成動態內容,管理會話和使用者狀態,提供了 Java Web 應用程式的核心控制功能。Servlet 是實現 Web 應用程式邏輯的主要元件,允許開發者建立複雜的使用者互動和資料處理功能
新建如下類


各種功能的Servlet

InsertUserServlet.java
```plaintext
package com.stdu.Servlet;

import com.stdu.mapper.UserMapper;
import com.stdu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
@WebServlet("/InsertUser")
public class InsertUserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        String resource = "mybatis-config.xml";

        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(com.stdu.mapper.UserMapper.class);

         User user=new User(username,password);
         userMapper.InsertUser(user);
         sqlSession.commit();
         sqlSession.close();
         resp.sendRedirect("login.jsp");
    }
}

LookAllServlet.java

```plaintext
package com.stdu.Servlet;

import com.stdu.mapper.UserMapper;
import com.stdu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@WebServlet("/LookAll")
public class LookAllServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String resource = "mybatis-config.xml";

        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(com.stdu.mapper.UserMapper.class);
        List<User>list =userMapper.LookAll();
        sqlSession.close();

        req.setAttribute("list",list);
        req.getRequestDispatcher("lookAll.jsp").forward(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

SelectUserServlet.java
```plaintext
package com.stdu.Servlet;

import com.stdu.mapper.UserMapper;
import com.stdu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

@WebServlet("/SelectUser")
public class SelectUserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        String resource = "mybatis-config.xml";

        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(com.stdu.mapper.UserMapper.class);

        User user=new User(username,password);
       User user1= userMapper.SelectUser(user);
        sqlSession.close();

        if(user1==null){

            resp.sendRedirect("login.jsp");
        }
       else {
            resp.sendRedirect("menu.jsp");
        }
    }
}
DeleteUserServlet.java
```plaintext
package com.stdu.Servlet;

import com.stdu.mapper.UserMapper;
import com.stdu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

@WebServlet("/DeleteUser")
public class DeleteUserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        // 建立 User 物件並設定 username 和 password
        User user = new User();
        user.setUsername(username);
        user.setPassword(password); // 確保設定密碼

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            // 呼叫 DeleteUser 方法,傳遞 User 物件
            int rowsAffected = userMapper.DeleteUser(user);

            // 提交事務
            sqlSession.commit();

            // 根據刪除結果,重定向到相應頁面
            if (rowsAffected > 0) {
                resp.sendRedirect("delete.jsp?message=User deleted successfully");
            } else {
                // 這裡可以新增錯誤日誌以便除錯
                System.out.println("DeleteUser returned 0, user may not exist or password may be incorrect: " + username);
                resp.sendRedirect("delete.jsp?message=User not found or delete failed");
            }
        } catch (Exception e) {
            e.printStackTrace(); // 列印異常以便除錯
            resp.sendRedirect("delete.jsp?message=An error occurred while deleting the user");
        } finally {
            sqlSession.close(); // 確保在完成操作後關閉會話
        }
    }
        // 確保在完成操作後關閉會話
}

webapp下新建以下.jsp檔案 (各個頁面)

login.jsp
```plaintext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<html>
<head>
    <title>Title</title>
</head>

<body>
      <h1> 登入 </h1>

     <form method="POST" action="/Test/SelectUser">
     <p> 賬號 <input type="text" name="username"> </p>
     <p> 密碼 <input type="text" name="password"> </p>
    <input type="submit" value="登入">   <a href="/Test/enrol.jsp">註冊</a>   <a href="/Test/delete.jsp">登出</a>
       </form>
</body>
</html>
enrol.jsp
```plaintext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<html>
<head>
    <title>Title</title>
</head>

<body>
      <h1> 註冊 </h1>

     <form method="POST" action="/Test/InsertUser">

     <p> 賬號 <input type="text" name="username"> </p>
     <p> 密碼 <input type="text" name="password"> </p>
    <input type="submit" value="註冊">
       </form>
</body>
</html>
menu.jsp
```plaintext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <a href="/Test/LookAll">檢視所有賬戶</a>
</body>
</html>
lookAll.jsp
```plaintext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <table>
     <tr>
     <th>賬戶</th>
     <th>密碼</th>
   <c:forEach items="${list}" var="item"  >
     </tr>
     <td>${item.username}</td>
      <td>${item.password}</td>
     <tr>
    </c:forEach>
  </table>
</body>
</html>
delete.jsp
```plaintext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<html>
<head>
    <title>登出賬戶</title>
</head>
<body>
    <h1>登出賬戶</h1>

    <form method="POST" action="/Test/DeleteUser">
        <p> 請輸入要刪除的: </p>
        <p>賬號<input type="text" name="username"> </p>
        <p>密碼<input type="text" name="password"> </p>
        <input type="submit" value="刪除">
    </form>

    <c:if test="${not empty param.message}">
        <p style="color: red;">${param.message}</p>
    </c:if>
</body>
</html>

每個功能都要在介面類UserMapper裡寫好對映介面

UserMaapper
```plaintext
package com.stdu.mapper;

import com.stdu.pojo.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {
    //插入 返回型別為void
    @Insert("insert into tb_user values(#{username},#{password})")
    void InsertUser(User user);
    //查詢 返回型別pojo裡的類名
    @Select("select * from tb_user where username=#{username} and password=#{password}")
    User SelectUser(User user);
    //顯示 返回型別所有資料的集合
    @Select("select * from tb_user")
     List<User> LookAll();
    //刪除
    @Delete("delete from tb_user where username=#{username} and password=#{password}")
    int DeleteUser(User user);
}

具體實現效果
https://www.bilibili.com/video/BV1w5qHYeEDr/?vd_source=f470a8a6b8d22213c3e7c5555ae6aa1c

相關文章