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>
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&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true&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>
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