如何写出页面连接数据库的程序(Learned from 刘宇恒)
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