🎼个人主页:【Y小夜】
😎作者简介:一位双非学校的大二学生,编程爱好者,
专注于基础和实战分享,欢迎私信咨询!
感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️
目录
🎯了解hutool工具及其使用
😎简介
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
😎安装
🎈Maven项目
不会maven的朋友可以去看这两篇文章学一下
在项目的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方式传入条件暂时不支持同字段多条件的情况。
✨查
- 查询全部字段
//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):删除指定的购物车。