如何写出页面连接数据库的程序(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>

粘贴后记得点击更新,随后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

posted @ 2024-12-08 18:25  3jingsh0u  阅读(59)  评论(0)    收藏  举报