Web message book | JavaWeb

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Web message book | JavaWeb

网络留言本的设计与实现

1. 需求描述

1.1 概述

网络留言本 gustbook 是一个基于 B/S 架构的 Web 应用,能够为用户提供留言服务,方便用户之间的交流学习


1.2 功能描述

  • 系统角色:系统中具有管理员、注册用户和游客
  • 管理员:登录、注销、管理用户(添加用户、修改用户信息-重置密码-个人信息-状态修改

禁言-角色修改)、删除用户
留言管理(增(发表留言)删(删除留言)改(修改留言)查(所有留言)(CRUD)),角色管理(增删改查)

  • 注册用户:登录、注销、修改个人信息、留言、查看所有的留言、回复、删除自己的留言、

修改自己的留言、关闭评论、隐藏留言、匿名

  • 游客:注册、浏览所有的开放留言

2. 系统架构及主要技术

2.1 系统架构

  • maven:项目构建工具,自动构建、下载所需要的 jar 包
  • Maven 项目目录说明

    项目文件夹 说明
    src/main/java Java 代码存放目录
    src/main/resourcess 配置文件存放的目录
    src/test/java 测试代码存放目录
    src/test/resourcess 测试配置文件存放目录
  • B/S 结构
  • MVC 模式:主要涉及到开发中的分层

    层级 描述
    最顶层 UI 用户界面(jsp页面)
    $$\Uparrow$ 控制层 controller 完成流程控制 Servlet
    $$\Uparrow$ 业务逻辑层 BLL 完成业务逻辑
    $$\Uparrow$ 数据访问层 DAL (Data Access Layer) 负责完成增删改查(CURD)
    最底层 数据库 DataBase

2.2 主要技术

3. 需求分析


4. 数据库设计

4.1 根据功能描述设计简单需求

4.2 MySQL 的安装与启动

4.2.1 安装 Navicat for MySQL

点此下载 Navicat for MySQL

4.2.2 下载 MySQL

点此下载 MySQL5.5.4.0

点此下载 MySQL-community

4.2.3 启动 MySQL 服务

  1. 解压 mysql5.5.40 压缩包
  2. 转至 ..\mysql5.5.40\bin 目录,双击 MySql开始.bat 以启动服务 在这里插入图片描述
文件名 说明
MySql开始.bat 启动 MySQL 服务
MySql关闭.bat 关闭 MySQL 服务
MySql控制台.bat

4.2.4 启动 Navicat for MySQL 客户端

在这里插入图片描述

4.2.5 新建连接

  1. 左侧空白处右键,选择 新建连接

在这里插入图片描述

  1. 输入连接名和在 MySQL 中配置的用户名和密码,选择 连接测试 ,出现连接成功后点 确认

在这里插入图片描述
在这里插入图片描述

4.2.6 建立数据库

4.2.6.1 在已连接的数据库右键选择 新建数据库...

在这里插入图片描述

4.2.6.2 输入数据库名,选择字符集(utf8 -- UTF-8 Unicode)、排序规则(utf8_general_ci),单击确定

在这里插入图片描述

4.2.6.3 运行 SQL 文件

点此下载 SQL命令文件(guestbook.sql)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2.6.4 刷新表,检查已创建成功的表

在这里插入图片描述

4.3 建立 MySQL 与 eclipse 项目之间的连接(配置 maven)

4.3.1 下载并解压 apache-maven-3.3.9

点此下载 apache-maven-3.3.9.zip

4.3.2 在 Eclipse 中关联 maven (使用 maven 方式创建 web 项目)

4.3.2.1 在 Eclipse 窗口工具栏中选择 Window -> Preferences

在这里插入图片描述

4.3.2.2 在弹出的窗口左侧选择 Maven -> Installations,选择 Add

在这里插入图片描述

4.3.3 关联外部 Maven

4.3.3.1 选择已解压的 ..\apache-maven-3.3.9 目录,单击 Finish

在这里插入图片描述

4.3.3.2 窗口右侧选择 apache-maven-3.3.9,单击 Apply

在这里插入图片描述

4.3.3.3 窗口左侧选择 Maven -> User Settings,选择窗口左侧 Global Settings 和 User Settings 下的 Browse 并选择 ..\apache-maven-3.3.9\conf\settings.xml 文件,单击 Apply

在这里插入图片描述

4.3.4 Maven Settings 文件的配置

4.3.4.1 创建用于放置 Maven 下载的文件目录 ..\MavenRepository

4.3.4.2 编辑 ..\apache-maven-3.3.9\conf\settings.xml 文件

55行

<!-- 配置 Maven 下载的文件安装目录,例如 d:\mavenRepository 为要存放的目录 -->
<localRepository>d:\mavenRepository</localRepository>

<!-- 修改镜像源地址为阿里云 -->
161行
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

4.3.5 配置 Maven 环境变量

  1. 复制 ..\apache-maven-3.3.9 所在路径
  2. 打开控制面本,选择 高级系统设置

在这里插入图片描述

  1. 新建系统变量,单击确认

在这里插入图片描述

4.3.6 在 Eclipse 中创建 Maven 项目

4.3.6.1 在 Eclipse 中关联 maven (使用非 maven 方式创建 web 项目)

  1. 修改项目视图为 JavaEE

在这里插入图片描述

  1. 创建 Maven Project

在这里插入图片描述

  1. 保持默认选项,单击 Next

在这里插入图片描述

  1. Catalog 处选择 Internal,Filter 中选择 maven-archetype-webapp 1.0,单击 下一步

在这里插入图片描述

  1. 输入包名(Group Id)和项目名称(Srtifact Id),单击 Finish

在这里插入图片描述

  1. 等待项目创建完成
  2. 打开项目属性

在这里插入图片描述

  1. 转到 Java Build Path -> Libraries -> JRE System Library [JavaSE-1.8] ,在右侧选择 Edit

在这里插入图片描述

  1. 选择 Workspace default JRE,选择 FinishApply

在这里插入图片描述

  1. 在 src/resources 文件夹目录下选择 new -> Other

在这里插入图片描述

  1. 搜索并选择 Source Folder

在这里插入图片描述

  1. 将 Folder name 修改为源文件路径 src/test/resources

在这里插入图片描述

  1. 将 Maven 项目添加到 Tomcat Server 中,检测项目是否创建成功

在这里插入图片描述

  1. 在浏览器中输入项目本地地址,出现 Hello World 页面即项目创建成功
    在这里插入图片描述
  2. 显示错误检查窗口

在这里插入图片描述
在这里插入图片描述

  1. 查找到 Maven 项目错误提示 缺少 HttpServlet

在这里插入图片描述

  1. 在浏览器中转到 https://mvnrepository.com/ ,并搜索 servlet

在这里插入图片描述

  1. 选择版本 3.0.1

在这里插入图片描述

  1. 在新页面中复制 Maven 中的代码内容

在这里插入图片描述

  1. 编辑 pom.xml 文件

在这里插入图片描述

  1. 在 pom.xml 中 \<dependencies>\</dependencies> 的标签内粘贴网页中复制的代码,并保存

    <!-- Junit 测试工具 -->
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
       </dependency>
       
       <!-- 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>
    
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
  2. 在项目中创建 Servlet 文件

在这里插入图片描述

  1. 输入 Servlet 的 Java packge 和 Class name,单击 Next 和 Finish

在这里插入图片描述

  1. 使用注解方式配置 Servlet ,将 src/main/webapp/web.xml 文件中的内容修改为

    <!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>guestbook</display-name>
    </web-app>
  2. 将 src/main/java/com/servlet/c1/servlet/HelloServlet.java 文件中的内容修改为

    package com.servlet.c1.servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class HelloServlet
     */
    @WebServlet(urlPatterns = "/HelloServlet")
    public class HelloServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public HelloServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.getWriter().append("Served at: ").append(request.getContextPath());
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    }
  3. 在浏览器中输入 http://localhost:8080/guestbook/HelloServlet ,检测项目是创建成功

在这里插入图片描述

  1. 配置完成

4.3.6.2 在 Eclipse 中关联 maven (使用非 maven 方式创建 web 项目)

  1. 在浏览器中转到 https://mvnrepository.com/ ,并搜索 junit,单击 2. JUnit

在这里插入图片描述

  1. 选择版本 3.8.1

在这里插入图片描述

  1. 选择 Files 一栏中的 jar,右键选择 “链接另存为”

在这里插入图片描述
在这里插入图片描述

  1. 将下载好的 jar 文件复制到 Eclipse 项目的 /WebContent/WEB-INF/lib 目录下

在这里插入图片描述

  1. 在浏览器中转到 https://mvnrepository.com/ ,并搜索 mysql,单击 1. MySQL Connector/J

在这里插入图片描述

  1. 选择版本 5.1.38

在这里插入图片描述

  1. 选择 Files 一栏中的 jar,右键选择 “链接另存为”

在这里插入图片描述

  1. 将下载好的 jar 文件复制到 Eclipse 项目的 /WebContent/WEB-INF/lib 目录下

在这里插入图片描述

  1. 配置完成

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


5. Dao层设计

5.1 角色表增删改查

5.1.1 目录路径

目录结构
guestbook
├── Java Resources
│   ├── src/main/java
│    │    ├── com.servlet.c1.guestbook.dao
│    │    │    ├── IBaseDao.java
│    │    │    └── ISysRoleDao.java
│    │    ├── com.servlet.c1.guestbook.dao.impl
│    │    │    ├── BaseDaoImpl.java
│    │    │    └── SysRoleDaoImpl.java
│   │     ├── com.servlet.c1.guestbook.model
│    │    │    └── SysRole.java
│   │     ├── com.servlet.c1.guestbook.services
│   │     ├── com.servlet.c1.guestbook.servlet
│   │     └── com.servlet.c1.guestbook.utils
│    │        └── DBUtils.java
│   ├── src/main/resources
│   ├── src/test/java
│    │    └── com.servlet.c1.guestbook.dao.impl
│    │        └── SysRoleDaoImplTest.java
│   └── src/test/resources
├── Develop Resources
│   ├── webapp
│   │     ├── WEB-INF
│    │    │    └── web.xml
│    │    └── index.jsp
│   ├── web-resources
│   │     └── META-INF
│    │        └── maven
│    │            └── com.servlet.c1
│    │            │    └── guestbook
│    │            │        ├── pom.peoperties
│    │            │        └── pom.xml
│    │            └── MANIFEST.MF
├── src
│   ├── main
│   │     ├── java
│    │    │    └── com
│    │    │        └── servlet
│    │    │            └── c1
│    │    │            │    └── guestbook
│    │    │            │        ├── model
│    │    │            │        │    └── SysRole.java
│    │    │            │        ├── servlet
│    │    │            │        └── utils
│    │    │            │            └── DBUtils.java
│    │    │            └── guestbook
│    │    │                ├── dao
│    │    │                │    ├── impl
│    │    │                │    │    ├── BaseDaoImpl.java
│    │    │                │    │    └── SysRoleDao.java
│    │    │                │    ├── IBaseDao.java
│    │    │                │    └── ISysRoleDao.java
│    │    │                └── services
│   │     ├── resources
│   │     └── webapp
│    │        ├── WEB-INF
│    │        │    └── web.xml
│    │        └── index.jsp
│   └── test
│        ├── java
│        │    └── com
│        │        └── servlet
│        │            └── c1
│        │                └── guestbook
│        │                    └── dao
│        │                        └── impl
│        │                            └── SysRoleImplTest.java
│       └── resources
├── target
│    └── m2e-wtp
│        └── web-resources
│            └── META-INF
│                ├── maven
│                │    └── com.dervlet.c1
│                │        └── guestbook
│                │            ├── pom.properties
│                │            └── pom.xml
│                └── MANIFEST.MF
└── pom.xml

5.1.2 源代码

源代码

IBaseDao.java

package com.servlet.c1.guestbook.dao;

public interface IBaseDao {
    /** 
     * 用于实现增删改的方法
     * 返回数据库操作受影响的行数
     */
    int updateBySql(String sql, Object[] parans);
    
    
    /**
     * 用于查询的方法
     * 返回数据库操作受影响的行数
     */
    void queryBySql(String sql, Object[] params);    
}

ISysRoleDao.java

package com.servlet.c1.guestbook.dao;

import java.util.List;
import com.servlet.c1.guestbook.model.SysRole;

/** 接口 增删改查 */
public interface ISysRoleDao {
    /**
     * 接口作用:添加角色信息到数据库中
     * int:默认为数据库操作所影响的行数,返回新增记录的 id
     */
    public int add(SysRole sysRole);
    
    /**
     * 接口作用:删除角色,返回操作所音响的行数
     */
    int delete(int id);
    
    /**
     * 接口作用:修改角色,返回操作所音响的行数
     */
    int update(SysRole sysRole);
    
    /**
     * 接口作用:获取单条记录,返回一根角色信息
     */
    SysRole get(int id);
    
    /**
     * 接口作用:获取多条记录,返回所有角色
     */
    List<SysRole> getAll();
}

BaseDaoImpl.java

package com.servlet.c1.guestbook.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.servlet.c1.guestbook.dao.IBaseDao;
import com.servlet.c1.guestbook.utils.DBUtils;

public class BaseDaoImpl implements IBaseDao {
    /**
     * 将 Connetion 等对象定义为保护类型,是为了提供给子类使用
     */
    protected Connection conn = null;
    protected PreparedStatement st = null;
    protected ResultSet rs = null;
    
    @Override
    public int updateBySql(String sql, Object[] parans) {
        int ret = -1;
        try {
            // 1获取数据库连接 Connection,获取数据库的连接
            conn = DBUtils.getConnection();
//            // 2准备sql
//            String sql = "insert into trote(role_name,description)values(?,?)";
            // 3获取连接对象Statement对象,向数据库发送具体的命令
            st = conn.prepareStatement(sql);
            // 4给参数赋值
            if (parans.length > 0) {
                for (int i = 0; i < parans.length; i++) {
                    st.setObject(i + 1, parans[i]);
                } 
            }
            // 5执行数据命令,Statement对象来说有两种操作:executeUpdate用于执行增改操作,一种是executeQuery用于执行查询操作
            ret = st.executeUpdate();    //返回被影响的行数
            // 6关闭资源
            DBUtils.close(conn, st, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ret;
    }

    @Override
    public void queryBySql(String sql, Object[] params) {
        
    }
}

SysRoleDaoImpl.java

package com.servlet.c1.guestbook.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;

import com.servlet.c1.guestbook.dao.ISysRoleDao;
import com.servlet.c1.guestbook.model.SysRole;
import com.servlet.c1.guestbook.utils.DBUtils;

/**
 * SysRoleDaoImpl 的父类  BaseDaoImpl
 * SysRoleDaoImpl 实现的接口 ISysRoleDao
 */
public class SysRoleDaoImpl extends BaseDaoImpl implements ISysRoleDao {
    /**
     * 关于静态成员和非静态成员
     * 为社么静态成员访问非静态成员会报错?生命周期不同
     * 不带 static 的就是非静态成员,带static的为静态成员
     * 例如 A.java 编译为  A.class (将 A.class 调入到内存中,即 JVM(虚拟机) 中)
     * 如果是静态成员或代码块:随着类的加载而加载,类被装入到内存中,静态代码就已经执行(存在)了。
     * 如果是非静态成员或代码块: SysRoleDaoImpl dao = new SysRoleDaoImpl();  dao.add(); 去排序执行,创建dao对象之后,调用对象的方法后才可以执行
     * 时间上,静态成员出现先于非静态成员,所以静态成员不能访问非静态成员
     * 
     * 访问方式不同:因为生命周期不同
     */
    
     // 实现数据库访问操作,需要四个信息
    static String driver = "com.mysql.jdbc.Driver";
    
    // 2. 数据库的连接串,连接 mysql 的端口:3306
//    String URL = "jdbc.mysql://localhost:3306/guestbook";
    static String url = "jdbc:mysql://127.0.0.1:3306/guestbook?useUnicode=true&useJDBCCompliantTimezoneShift=true&uselegacyDatetimeCode=false&serverTimezone=UTC";;
    
    // 3 用户名
    static String user = "root";
    
    // 4密码
    static String password = "root";
    
//    // 加载数据库驱动,动态代码块
//    {
//        Class.forName(driver);
//    }
    
    // 加载数据库驱动,静态代码块
    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //分为两类:增删改、两类添加
    /**
     * 增
     */
    @Override
    public int add(SysRole sysRole) {
        String sql = "insert into trole(role_name, description)values(?,?)";
        Object[] params = new Object[] {sysRole.getRoleName(), sysRole.getDescription()};
        return super.updateBySql(sql, params);
        
//        Connection conn = null;
//        PreparedStatement st = null;
//        ResultSet rs = null;
//        int ret = -1;
//        try {
//            // 1获取数据库连接 Connection,获取数据库的连接
//            conn = DBUtils.getConnection();
//            // 2准备sql
//            String sql = "insert into trote(role_name,description)values(?,?)";
//            // 3获取连接对象Statement对象,向数据库发送具体的命令
//            st = conn.prepareStatement(sql);
//            // 4给参数赋值
//            st.setString(1, sysRole.getRoleName());
//            st.setString(2, sysRole.getDescription());
//            // 5执行数据命令,Statement对象来说有两种操作:executeUpdate用于执行增改操作,一种是executeQuery用于执行查询操作
//            ret = st.executeUpdate();    //返回被影响的行数
//            // 6关闭资源
//            DBUtils.close(conn, st, rs);
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
//        return ret;
    }

    /**
     * 删
     */
    @Override
    public int delete(int id) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        int ret = -1;
        try {
            // 1获取数据库连接 Connection,获取数据库的连接
            conn = DBUtils.getConnection();
            // 2准备sql
            String sql = "delete from trote where id = ?";
            // 3获取连接对象Statement对象,向数据库发送具体的命令
            st = conn.prepareStatement(sql);
            // 4给参数赋值
            st.setInt(1, id);
            // 5执行数据命令,Statement对象来说有两种操作:executeUpdate用于执行增改操作,一种是executeQuery用于执行查询操作
            ret = st.executeUpdate();    //返回被影响的行数
            // 6关闭资源
            DBUtils.close(conn, st, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ret;
    }
    
    /**
     * 改
     */
    @Override
    public int update(SysRole sysRole) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        int ret = -1;
        try {
            // 1获取数据库连接 Connection,获取数据库的连接
            conn = DBUtils.getConnection();
            // 2准备sql
            String sql = "update trole set role_name = ?, description = ? where id = ?";
            // 3获取连接对象Statement对象,向数据库发送具体的命令
            st = conn.prepareStatement(sql);
            // 4给参数赋值
            st.setString(1, sysRole.getRoleName());
            st.setString(2, sysRole.getDescription());
            st.setInt(3, sysRole.getId());
            // 5执行数据命令,Statement对象来说有两种操作:executeUpdate用于执行增改操作,一种是executeQuery用于执行查询操作
            ret = st.executeUpdate();    //返回被影响的行数
            // 6关闭资源
            DBUtils.close(conn, st, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ret;
    }
    
    /**
     * 获取一个对象
     */
    @Override
    public SysRole get(int id) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        SysRole sysRole = null;
        try {
            // 1获取数据库连接 Connection,获取数据库的连接
            conn = DBUtils.getConnection();
            // 2准备sql
            String sql = "select * from trole where id = ?";
            // 3获取连接对象Statement对象,向数据库发送具体的命令
            st = conn.prepareStatement(sql);
            // 4给参数赋值
            st.setInt(1, id);
            // 5执行数据命令,Statement对象来说有两种操作:executeUpdate用于执行增改操作,一种是executeQuery用于执行查询操作
            rs = st.executeQuery();
            // 访问结果集
            while(rs.next()) {
                id = rs.getInt("id");
                String roleName = rs.getString("role_name");
                String description = rs.getString("description");
                sysRole = new SysRole(id, roleName, description);
            }
            // 6关闭资源
            DBUtils.close(conn, st, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return sysRole;
    }

    /**
     * 获取所有对象的值,返回结果集
     */
    @Override
    public List<SysRole> getAll() {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        List<SysRole> list = new ArrayList<SysRole>();
        try {
            // 1获取数据库连接 Connection,获取数据库的连接
            conn = DBUtils.getConnection();
            // 2准备sql
            String sql = "select * from trole";
            // 3获取连接对象Statement对象,向数据库发送具体的命令
            st = conn.prepareStatement(sql);
            // 4执行数据命令,Statement对象来说有两种操作:executeUpdate用于执行增改操作,一种是executeQuery用于执行查询操作
            rs = st.executeQuery();
            // 访问结果集
            while(rs.next()) {
                int id = rs.getInt("id");
                String roleName = rs.getString("role_name");
                String description = rs.getString("description");
                SysRole sysRole = new SysRole(id, roleName, description);
                list.add(sysRole);
            }
            // 6关闭资源
            DBUtils.close(conn, st, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list.size()!=0 ? list : null;
    }
    
    public static void main(String[] args) {
        SysRoleDaoImpl dao = new SysRoleDaoImpl();
        SysRole sysRole = new SysRole("fff","fff");
        int ret = dao.add(sysRole);
        System.out.println(ret>0?"success":"fail");
    }
    
}

SysRole.java

package com.servlet.c1.guestbook.model;

import java.io.Serializable;

// 对数据库操作文件
public class SysRole implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private int id;
    private String roleName;    // 自动匹配 mysql 中的 role_name
    private String description;
    
    public SysRole() {
        super();
    }
    
    public SysRole(int id, String roleName, String description) {
        super();
        this.id = id;
        this.roleName = roleName;
        this.description = description;
    }
    
    public SysRole(String roleName, String description) {
        super();
        this.roleName = roleName;
        this.description = description;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

DBUtils.java

package com.servlet.c1.guestbook.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 数据库工具类,功能:
 * 1 提供数据连接
 * 2 关闭数据库
 */
public class DBUtils {
    // 实现数据库访问操作,需要四个信息
    static String driver = "com.mysql.jdbc.Driver";
    
    // 2. 数据库的连接串,连接 mysql 的端口:3306
//        String URL = "jdbc.mysql://localhost:3306/guestbook";
    static String url = "jdbc:mysql://127.0.0.1:3306/guestbook?useUnicode=true&useJDBCCompliantTimezoneShift=true&uselegacyDatetimeCode=false&serverTimezone=UTC";;
    
    // 3 用户名
    static String user = "root";
    
    // 4密码
    static String password = "root";
    
//        // 加载数据库驱动,动态代码块
//        {
//            Class.forName(driver);
//        }
    
    // 加载数据库驱动,静态代码块
    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * 获取数据库连接对象
     * @return
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    
    public static void close(Connection conn, Statement st, ResultSet rs) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if(st != null) {
                    try {
                        st.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } finally {
                        if(conn != null) {
                            try {
                                conn.close();
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }
}

SysRoleDaoImplTest.java

package com.servlet.c1.guestbook.dao.impl;

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

import com.servlet.c1.guestbook.dao.ISysRoleDao;
import com.servlet.c1.guestbook.impl.SysRoleDaoImpl;
import com.servlet.c1.guestbook.model.SysRole;

class SysRoleDaoImplTest {
    private ISysRoleDao roleDao = new SysRoleDaoImpl();
    /**
     * 测试方法返回值为 void,public修饰,public可以省略
     * 方法不能有参数
     */

    @Test
    void testAdd() {
        SysRole sysRole = new SysRole("xxx","xxx");
        assertEquals(1, roleDao.add(sysRole));
    }
    
    @Test
    void testDelete() {
        fail("Not yet implemented");
    }

    @Test
    void testUpdate() {
        fail("Not yet implemented");
    }

    @Test
    void testGet() {
        fail("Not yet implemented");
    }

    @Test
    void testGetAll() {
        fail("Not yet implemented");
    }

}

5.2 抽象数据访问工具类 DBUtils

5.3 抽象 IBaseDao

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
XML 网络协议 Java
JavaWeb -- HTTP -- WEB服务器TOMCAT
JavaWeb -- HTTP -- WEB服务器TOMCAT
|
4月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
64 1
|
4月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
252 0
|
6月前
|
JavaScript 程序员 应用服务中间件
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(2)
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(2)
60 7
|
6月前
|
XML 存储 JavaScript
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(1)
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(1)
69 5
|
6月前
|
Java 应用服务中间件 程序员
JavaWeb基础第四章(SpringBootWeb工程,HTTP协议与Web服务器-Tomcat)
JavaWeb基础第四章(SpringBootWeb工程,HTTP协议与Web服务器-Tomcat)
|
7月前
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
|
缓存 前端开发 JavaScript
【JavaWeb】Web前端性能优化
【JavaWeb】Web前端性能优化
79 1
【JavaWeb】Web前端性能优化
|
SQL 安全 Shell
【JavaWeb知识】Web常见的攻击技术
【JavaWeb知识】Web常见的攻击技术
82 0
|
前端开发 JavaScript Java
Javaweb第一章:Web前端的入门理论
Javaweb第一章:Web前端的入门理论
128 0