【JavaWeb项目】——外卖订餐系统之准备部分(Hutool工具,Bootstrap前端框架、三层架构,数据库设计以及方法设计

举报
Y小夜 发表于 2024/12/05 22:13:33 2024/12/05
【摘要】 ​🎯了解hutool工具及其使用😎简介        Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。        Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当...

🎯了解hutool工具及其使用

😎简介

        Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

        Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

        Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

😎安装

🎈Maven项目

不会maven的朋友可以去看这两篇文章学一下

Maven环境搭建-CSDN博客

IDEA集成Maven-CSDN博客

在项目的pom.xml的dependencies中加入以下内容:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

🎈Gradle项目

implementation 'cn.hutool:hutool-all:5.8.16'

😎 Hutool工具之数据库的简单操作

🎈由来

        数据库操作不外乎四门功课:增删改查,在Java的世界中,由于JDBC的存在,这项工作变得简单易用,但是也并没有做到使用上的简化。于是出现了JPA(Hibernate)、MyBatis、Jfinal、BeetlSQL等解决框架,或解决多数据库差异问题,或解决SQL维护问题。而Hutool对JDBC的封装,多数为在小型项目中对数据处理的简化,尤其只涉及单表操作时。OK,废话不多,我们来依次介绍。

🎈配置文件

        Maven项目中在src/main/resources目录下添加db.setting文件(非Maven项目添加到ClassPath中即可):

## db.setting文件

url = jdbc:mysql://localhost:3306/数据库名
user = 用户名
pass = 密码

## 可选配置
# 是否在日志中显示执行的SQL
showSql = true
# 是否格式化显示的SQL
formatSql = false
# 是否显示SQL参数
showParams = true
# 打印SQL的日志等级,默认debug,可以是info、warn、error
sqlLevel = debug

🎈 引入MySQL JDBC驱动的jar包

<!--mysql数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>

🎈增删改查

✨增

Db.use().insert(
    Entity.create("user")
    .set("name", "unitTestUser")
    .set("age", 66)
);

        插入数据并返回自增主键:

Db.use().insertForGeneratedKey(
    Entity.create("user")
    .set("name", "unitTestUser")
    .set("age", 66)
);

✨删

Db.use().del(
    Entity.create("user").set("name", "unitTestUser")//where条件
);

注意 考虑安全性,使用del方法时不允许使用空的where条件,防止全表删除,如有相关操作需要,请调用execute方法执行SQL实现。

✨改

Db.use().update(
    Entity.create().set("age", 88), //修改的数据
    Entity.create("user").set("name", "unitTestUser") //where条件
);

注意 条件语句除了可以用=精确匹配外,也可以范围条件匹配,例如表示 age < 12 可以这样构造Entity:Entity.create("user").set("age", "< 12"),但是通过Entity方式传入条件暂时不支持同字段多条件的情况。

✨查

  1. 查询全部字段
//user为表名
Db.use().findAll("user");
  • 条件查询
Db.use().findAll(Entity.create("user").set("name", "unitTestUser"));
  • 模糊查询
Db.use().findLike("user", "name", "Test", LikeType.Contains);

或者:

List<Entity> find = Db.use().find(Entity.create("user").set("name", "like 王%"));
  • 分页查询
//Page对象通过传入页码和每页条目数达到分页目的
PageResult<Entity> result = Db.use().page(Entity.create("user").set("age", "> 30"), new Page(10, 20));

🎯Bootstrap前端框架

😎简介

什么是 Bootstrap?

        Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。

历史

        Bootstrap 是由 Twitter 的 Mark Otto 和 Jacob Thornton 开发的。Bootstrap 是 2011 年八月在 GitHub 上发布的开源产品。

为什么使用 Bootstrap?

  • 移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式。
  • 浏览器支持:所有的主流浏览器都支持 Bootstrap。
  • 容易上手:只要您具备 HTML 和 CSS 的基础知识,您就可以开始学习 Bootstrap。
  • 响应式设计:Bootstrap 的响应式 CSS 能够自适应于台式机、平板电脑和手机。


    响应式设计

  • 它为开发人员创建接口提供了一个简洁统一的解决方案。
  • 它包含了功能强大的内置组件,易于定制。
  • 它还提供了基于 Web 的定制。
  • 它是开源的。

Bootstrap 包的内容

  • 基本结构:Bootstrap 提供了一个带有网格系统、链接样式、背景的基本结构。这将在 Bootstrap 基本结构 部分详细讲解。
  • CSS:Bootstrap 自带以下特性:全局的 CSS 设置、定义基本的 HTML 元素样式、可扩展的 class,以及一个先进的网格系统。这将在 Bootstrap CSS 部分详细讲解。
  • 组件:Bootstrap 包含了十几个可重用的组件,用于创建图像、下拉菜单、导航、警告框、弹出框等等。这将在 布局组件 部分详细讲解。
  • JavaScript 插件:Bootstrap 包含了十几个自定义的 jQuery 插件。您可以直接包含所有的插件,也可以逐个包含这些插件。这将在 Bootstrap 插件 部分详细讲解。
  • 定制:您可以定制 Bootstrap 的组件、LESS 变量和 jQuery 插件来得到您自己的版本。

😎使用

    <%--    引入Bootstrap--%>
    <link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

引入框架之后,其余的都是仿照着官网:Bootstrap 环境安装 | 菜鸟教程 (runoob.com)

🎯三层架构的使用

        三层架构通常指的是软件设计中的Controller、Service和DAO三个层次,它们在应用程序中各自承担不同的职责,相互协作以实现整体功能。

        Controller层(控制层):Controller层是表现层,负责接收用户的输入,并将请求转发给相应的服务层处理,最后返回处理结果给用户。它位于架构的最前端,直接面对用户或外部请求,是系统与外界交互的窗口。控制层的主要任务是请求处理和数据转发,不包含业务逻辑,确保了用户接口的轻量化。例如,在一个Web应用中,Controller层接收来自网页表单或者移动端的请求,然后调用Service层进行进一步的业务处理。

        Service层(业务逻辑层):Service层是业务逻辑层,封装了应用程序的核心业务逻辑。这一层承担着处理具体业务逻辑的任务,如用户的增删改查、发送验证码或邮件等。它解释用户的请求,执行必要的业务计算,调用数据访问层进行数据持久化操作,并返回执行结果。通过封装业务逻辑,Service层使得系统更加模块化,便于维护和复用。例如,在用户管理系统中,Service层会处理注册、登录等业务逻辑,调用DAO层来实现数据的存取。

        DAO层(数据访问层):DAO层负责与数据库或其他持久化存储方式直接交互。它的主要职责是执行具体的数据库操作,如CRUD(增加、查询、更新和删除),并返回操作结果。通过抽象化数据访问,DAO层使得业务逻辑层与数据存储细节解耦,提高了系统的适应性和稳定性。

😎controller层

        该层主要放置的是Servlet代码,进行接收用户的输入,并将请求转发给相应的服务层处理,最后返回处理结果给用户。

😎dao层

   DAO层(数据访问层):DAO层负责与数据库或其他持久化存储方式直接交互。它的主要职责是执行具体的数据库操作,如CRUD(增加、查询、更新和删除),并返回操作结果。通过抽象化数据访问,DAO层使得业务逻辑层与数据存储细节解耦,提高了系统的适应性和稳定性。

😎Service层

        Service层是业务逻辑层,封装了应用程序的核心业务逻辑。这一层承担着处理具体业务逻辑的任务,如用户的增删改查、发送验证码或邮件等。它解释用户的请求,执行必要的业务计算,调用数据访问层进行数据持久化操作,并返回执行结果。通过封装业务逻辑,Service层使得系统更加模块化,便于维护和复用。

🎯数据库设计

area表是表示店铺地址的。详情见表。

 area表

序号

列名

数据类型

长度

主键

说明

1

aid

int


地区id

2

aname

varchar

100


地区名称

car表是用来表示购物车信息的,详情见表。

表 car表

序号

列名

数据类型

长度

主键

说明

1

cid

int


购物车id

2

cname

varchar

1000


菜品名

3

cstate

int



购物车状态

4

cprice

int



单价

5

cfid

int



餐品id

6

cuid

int



用户id

7

cdid

int



店铺id

dianpu表是用来存储店铺信息的,详情见表3-4。

表3-4 dianpu

序号

列名

数据类型

长度

主键

说明

1

did

int


店铺id

2

dname

varchar

1000


店名

3

dareaid

int



所在区域id

food表是用来存储店铺中的餐品信息的,详情见表。

food表

序号

列名

数据类型

长度

主键

说明

1

fid

int


餐品id

2

fname

varchar

100


餐品名

3

fcount

int



购买人数

4

fprice

int



单价

5

fdianid

int



店铺id

6

fstate

int



状态

shangjia表是用来存储商家信息的,详情见表。

 shangjia

序号

列名

数据类型

长度

主键

说明

1

sid

int


商家id

2

sname

varchar

1000


商家名称

3

password

varchar

1000


登入密码

4

sdianid

int



店铺id

user表是用来存储用户信息的,详情见表。

 user

序号

列名

数据类型

长度

主键

说明

1

uid

int


用户id

2

uname

varchar

100


用户名称

3

password

varchar

100


用户密码

🎯方法设计

😎FoodDao类

package com.dingcan.dao;

import cn.hutool.db.Entity;

import java.util.List;

public interface FoodDao {
    List<Entity> findFood(String sql) ;
    boolean addFood( String fname,  int fcount, int fprice,int fdianid) ;
    boolean updateFood( int fid,String fname, int fcount, int fprice,int fdianid,int fstate) ;
    boolean updateState(int fid,int fstate);
}

😎FoodDaoImpl实现类

package com.dingcan.dao.impl;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import com.dingcan.dao.FoodDao;

import java.sql.SQLException;
import java.util.List;

public class FoodDaoImpl implements FoodDao {
    public List<Entity> findFood(String sql) {
        //依照sql语句进行查找
        List<Entity> list=null;
        try {
            list= Db.use().query(sql);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return list;
    }

    public boolean addFood(String fname, int fcount, int fprice, int fdianid) {
        int insert = 0;
        try {
            insert = Db.use().insert(Entity.create("food")
                    .set("fname", fname)
                    .set("fcount", fcount)
                    .set("fprice",fprice)
                    .set("fdianid",fdianid )
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if (insert>0){
            return  true;
        }
        return false;
    }

    public boolean updateFood(int fid, String fname, int fcount, int fprice, int fdianid, int fstate) {
        int update = 0;
        try {
            update = Db.use().update(
                    Entity.create("food")
                            .set("fname",fname)
                            .set("fcount",fcount)
                            .set("fprice",fprice)
                            .set("fdianid",fdianid)
                            .set("fstate", fstate),
                    Entity.create().set("fid", fid)
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if (update>0){
            return true;
        }
        return false;
    }

    public boolean updateState(int fid, int fstate) {
        int update = 0;
        try {
            update = Db.use().update(
                    Entity.create("food")
                            .set("fstate", fstate),
                    Entity.create().set("fid",fid)
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if(update>0){
            return  true;
        }
        return false;
    }

}

        这是一个Java类,名为FoodDaoImpl,实现了FoodDao接口。这个类主要用于操作数据库中的food表,包括查询、添加、更新食物信息和更新食物状态。具体功能如下:

1. findFood(String sql):根据传入的SQL语句查询数据库中的食物信息,返回一个包含Entity对象的列表。
2. addFood(String fname, int fcount, int fprice, int fdianid):向数据库中添加一条新的食物记录,参数分别为食物名称、数量、价格和店铺ID。如果插入成功,返回true,否则返回false。
3. updateFood(int fid, String fname, int fcount, int fprice, int fdianid, int fstate):根据传入的fid更新数据库中的食物信息,参数分别为食物ID、名称、数量、价格、店铺ID和状态。如果更新成功,返回true,否则返回false。
4. updateState(int fid, int fstate):根据传入的fid更新数据库中的食物状态,参数分别为食物ID和状态。如果更新成功,返回true,否则返回false。

😎 ShangDao类

package com.dingcan.dao;

public interface ShangDao {
    int FindSid(String sname1,String password1);
    int FindSdianid(int sid);
}

😎ShangDaoImpl类

package com.dingcan.dao.impl;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import com.dingcan.dao.ShangDao;

import java.sql.SQLException;
import java.util.List;

public class ShangDaoImpl implements ShangDao {

    public int FindSid(String sname1, String password1) {
        String sql="select sid from  shangjia where sname='"+sname1+"' and password='"+password1+"'";
        List<Entity> list=null;
        try {
            list= Db.use().query(sql);
            if (list.size()>0){
                return list.get(0).getInt("sid");
            }
            else return 0;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public int FindSdianid(int sid) {
        String sql="select sdianid from shangjia where sid="+sid;
        List<Entity> list=null;
        try {
            list= Db.use().query(sql);
            if (list.size()>0){
                return list.get(0).getInt("sdianid");
            }
            else return 0;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

        这是一个Java类,名为ShangDaoImpl,实现了ShangDao接口。这个类有两个方法:FindSid和FindSdianid。

        FindSid方法接收两个参数,分别是sname1和password1,用于查询数据库中是否存在对应的商家记录,如果存在则返回商家的ID,否则返回0。

        FindSdianid方法接收一个参数sid,用于查询数据库中对应商家的店铺ID,如果存在则返回店铺ID,否则返回0。

😎 UserDao类

package com.dingcan.dao;

public interface UserDao {
    int FindUid(String name,String password);
    String FindSql(String biaozhi);
    boolean addUser(String name,String password);

}

😎 UserDaoImpl类

package com.dingcan.dao.impl;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import com.dingcan.dao.UserDao;

import java.sql.SQLException;
import java.util.List;

public class UserDaoImpl implements UserDao {

    @Override
    public int FindUid(String name, String password) {
        String sql="select uid from  user where uname='"+name+"' and password='"+password+"'";

        List<Entity> list=null;
        try {
            list= Db.use().query(sql);
            if (list.size()>0){
                return list.get(0).getInt("uid");
            }
            else return 0;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String FindSql(String biaozhi) {
        String sql = null;
        switch (biaozhi)
        {
            case "0":
                sql="SELECT * FROM food WHERE fstate=1";
                break;
            case "1":
                sql="SELECT * FROM food WHERE fstate=1 AND fdianid=1";
                break;
            case "2":
                sql="SELECT * FROM food WHERE fstate=1 AND fdianid=1 AND fname LIKE '%肉%'";
                break;
            case "3":
                sql="SELECT * FROM food WHERE fstate=1 AND fdianid=1 AND fname LIKE '%菜%'";
                break;
            case "4":
                sql="SELECT * FROM food WHERE fstate = 1 AND fdianid = 1 AND fname NOT LIKE '%菜%' AND fname NOT LIKE '%肉%'";
                break;
            case "5":
                sql="SELECT * FROM food WHERE fstate=1 AND fdianid=2";
                break;
            case "6":
                sql="SELECT * FROM food WHERE fstate=1 AND fdianid=2 AND fname LIKE '%辣%'";
                break;
            case "7":
                sql="SELECT * FROM food WHERE fstate=1 AND fdianid=2 AND fname LIKE '%糖%'";
                break;
            case "8":
                sql="SELECT * FROM food WHERE fstate = 1 AND fdianid = 2 AND fname NOT LIKE '%糖%' AND fname NOT LIKE '%辣%'";
                break;
        }
        return sql;
    }

    @Override
    public boolean addUser(String name, String password) {
        int insert=0;
        try {
            insert=Db.use().insert(Entity.create("user")
                    .set("uname",name)
                    .set("password",password));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if (insert>0)
            return true;
        else
            return false;

    }
}

        这是一个Java类,名为UserDaoImpl,实现了UserDao接口。这个类有三个方法:FindUid、FindSql和addUser。

        1. FindUid方法接收两个参数,name和password,用于查询数据库中是否存在对应的用户记录。如果存在,返回用户的ID;否则返回0。

        2. FindSql方法接收一个参数biaozhi,根据不同的值返回不同的SQL查询语句。这些查询语句用于从food表中筛选出不同条件下的食物记录。

        3. addUser方法接收两个参数,name和password,用于向数据库的user表中插入一条新的用户记录。如果插入成功,返回true;否则返回false。

😎CarDao类

package com.dingcan.dao;

import cn.hutool.db.Entity;

import java.util.List;

public interface CarDao {
    List<Entity> uFindCar(int cuid);
    List<Entity> sFindCar(int sid);
    boolean addCar(String cname,int cprice,int cfid,int cuid,int cdid);
    boolean updateCar (int cid,int cstate);
    boolean delCar(int cid);
}

😎 CarDaoImpl类

package com.dingcan.dao.impl;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import com.dingcan.dao.CarDao;

import java.sql.SQLException;
import java.util.List;

public class CarDaoImpl implements CarDao {
    @Override
    public List<Entity> uFindCar(int cuid) {
        String sql="select * from car where cuid="+cuid;
        List<Entity> list=null;
        try {
            list= Db.use().query(sql);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return list;
    }
    @Override
    public List<Entity> sFindCar(int sid) {
        String sql="select * from shangjia,car where shangjia.sdianid=car.cdid and sid="+sid;
        List<Entity> list=null;
        try {
                list= Db.use().query(sql);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        return list;
        }


    @Override
    public boolean addCar(String cname, int cprice, int cfid, int cuid, int cdid) {
        int insert=0;
        try {
            insert = Db.use().insert(Entity.create("car")
                    .set("cname",cname)
                    .set("cprice",cprice)
                    .set("cfid",cfid)
                    .set("cuid",cuid)
                    .set("cdid",cdid));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if (insert>0)
            return true;
        return false;
    }

    @Override
    public boolean updateCar(int cid, int cstate) {
        int upadate=0;
        try {
            upadate = Db.use().update(Entity.create("car")
                    .set("cstate",cstate),Entity.create().set("cid",cid));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if (upadate>0)
            return true;
        return false;
    }

    @Override
    public boolean delCar(int cid) {
        int del=0;
        try {
            del=Db.use().del(Entity.create("car").set("cid",cid));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if (del>0)
            return true;
        return false;
    }
}

这是一个名为CarDaoImpl的Java类,实现了CarDao接口。这个类包含了以下方法:

1. uFindCar(int cuid):根据用户ID查询购物车信息。
2. sFindCar(int sid):根据商家ID查询购物车信息。
3. addCar(String cname, int cprice, int cfid, int cuid, int cdid):添加购物车。
4. updateCar(int cid, int cstate):更新购物车的状态。
5. delCar(int cid):删除指定的购物车。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。