【Servlet】规范项目结构|基于Mysql+JDBC+Servlet 制作简易网页|实现登录、添加、删除、显示的功能(上)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 【Servlet】规范项目结构|基于Mysql+JDBC+Servlet 制作简易网页|实现登录、添加、删除、显示的功能

🔥前言


书接上文,今天我们来规范书写servlet代码,分包分类的规划项目结构。我们知道一个项目靠一个人是很难完成的,那么在团队合作的时候难免会有看不懂队友写的代码的情况出现。因此按照特定的格式来书写代码无疑可以一定程度上减少这种事情发生的概率。


1、需要导入的jar包以及项目结构速览


84a511e1501b4950b380c23a6b5c2d57.png

284cd88b5a7b4ad392700e9cddd30cfe.png

b472d8b0f10c46b6938b8e3577316afd.png


2、工具类放在util包下,资源文件放在src目录下

工具类最终版JDBCUtils可参考我JDBC专栏里的博文,资源文件就是图中的jdbc.properties,里面存放数据库的驱动路径、访问路径、账号名和密码。


3、具体类写在实体类的包下(entity)

以此次博客要分享的项目为例:


我要做的是一个有登录和增删查询功能的网页,因此可以定义一个Person类,实现Serializable接口(形成习惯),封装姓名、密码等属性并提供对应的构造方法(不要忘了写无参构造)


具体代码如下:

package com.qj.entity;
import java.io.Serializable;
public class Person implements Serializable {
    private Integer id;
    private String name;
    private String pwd;
    private String QQ;
    private String beizhu;
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", QQ='" + QQ + '\'' +
                ", beizhu='" + beizhu + '\'' +
                '}';
    }
    public Person(Integer id, String name, String pwd, String QQ, String beizhu) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
        this.QQ = QQ;
        this.beizhu = beizhu;
    }
    public Person() {
    }
    public Person(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }
    public String getQQ() {
        return QQ;
    }
    public void setQQ(String QQ) {
        this.QQ = QQ;
    }
    public String getBeizhu() {
        return beizhu;
    }
    public void setBeizhu(String beizhu) {
        this.beizhu = beizhu;
    }
    public Integer getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

4、dao层接口与接口的实现类

dao层是与数据库对接的,存放操作数据库的接口方法。而在dao包里面还有一个impl包用来存放接口的实现类,用来操作数据库,例如:增删改查。


4.1、PersonDao接口

这里提供了几种方法接口:


根据查询名字返回person对象

查询数据库中的所有人并存入list集合中

将person信息插入到数据库中

根据id删除数据库中的person

package com.qj.dao;
import com.qj.entity.Person;
import java.util.List;
public interface PersonDao {
    /**
     *
     * @param name  用户输入的名字
     * @return      返回数据库里的Person对象
     */
    Person selectByName(String name);
    /**
     *
     * @return  返回t_Perosn表中所有人
     */
    List<Person> selectAll();
    /**
     *
     * @param person  插入到表格
     * @return        受影响行数
     */
    int insertPerson(Person person);
    /**
     *
     * @param id      按照id删除好友
     * @return        返回受影响行数
     */
    int deletePerson(Integer id);
}

4.2、PersonDaoImpl接口实现类

这里就是针对PersonDao接口的具体实现代码,如果有看不懂的可以参考我的JDBC专栏的文章

package com.qj.dao.impl;
import com.qj.dao.PersonDao;
import com.qj.entity.Person;
import com.qj.util.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class PersonDaoImpl implements PersonDao {
    @Override
    public Person selectByName(String name) {
        Connection conn = null;
        PreparedStatement ps=null;
        ResultSet rs = null;
        Person person = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select *from t_Person where p_name=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, name);
            rs = ps.executeQuery();
            if (rs.next()) {
                String l_name = rs.getString("p_name");
                String l_pwd = rs.getString("p_password");
                person = new Person(l_name, l_pwd);
            }
        } catch (Exception e) {
            System.out.println("未知异常");
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, ps, null);
        }
        return person;
    }
    @Override
    public List<Person> selectAll() {
        Connection conn = null;
        PreparedStatement ps=null;
        ResultSet rs = null;
        List<Person> list = new ArrayList<>();
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select *from t_Person";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                Integer id = rs.getInt("p_id");
                String name = rs.getString("p_name");
                String pwd = rs.getString("p_password");
                String QQ = rs.getString("p_QQ");
                String beizhu = rs.getString("p_bz");
                Person p = new Person(id, name, pwd, QQ,beizhu);
                list.add(p);
            }
        } catch (Exception e) {
            System.out.println("未知异常");
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, ps, null);
        }
        return list;
    }
    @Override
    public int insertPerson(Person person) {
        Connection conn = null;
        PreparedStatement ps=null;
        int n=0;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "insert into t_Person value(null,?,?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, person.getName());
            ps.setString(2, person.getPwd());
            ps.setString(3, person.getQQ());
            ps.setString(4, person.getBeizhu());
            n = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(null, ps, null);
        }
        return n;
    }
    @Override
    public int deletePerson(Integer id) {
        Connection conn = null;
        PreparedStatement ps=null;
        int n=0;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "delete from t_Person where p_id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, id);
            n = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(null, ps, null);
        }
        return n;
    }
}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
1202 2
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
2916 1
|
前端开发 关系型数据库 MySQL
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
393 0
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
243 0
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
299 0
|
关系型数据库 MySQL Java
【Azure 应用服务】App Service 无法连接到Azure MySQL服务,报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
【Azure 应用服务】App Service 无法连接到Azure MySQL服务,报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
612 0
|
6月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
465 158
|
6月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多