# java-demo-211
**Repository Path**: zing173/java-demo-211
## Basic Information
- **Project Name**: java-demo-211
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-10-08
- **Last Updated**: 2024-11-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## ch01.创建 Java 项目
第一:下载 JDK
[Java Downloads | Oracle 中国](https://www.oracle.com/cn/java/technologies/downloads/#jdk21-windows)
第二:解压、配置环境变量
环境变量:通过 Path 环境变量,告诉操作系统JDK的安装目录在哪里,从而操作系统可以正常的访问 JDK 的相关工具程序,如:java、javac等
## ch02.创建 JavaWeb 项目
第一:创建 Java 项目
第二:添加 WEB 支持 - JavaWeb项目
第三:编写程序
- src:Java、Servlet
- web:HTML、CSS、JS
第四:创建工件(Artifact) - war
第五:部署工件到Tomcat中
- 注意:第一次需要配置 Tomcat
- 设置项目上下文路径
第六:运行项目
- 启动 Tomcat
- http://localhost:8080/项目上下文路径/目录/资源
- 项目上下文路径:访问 JavaWeb 项目的入口
- 其中,资源包括:html、css、js、文件(如图片)、Servlet
- http://localhost:8080/web/aa/bb/hello.html
>编写 Servlet 程序,打印输出:你好,Servlet
- 第一:定义一个类,继承 HttpServlet 类
- 注意:在 IDEA 中,需要添加 Tomcat 的依赖 - servlet-api.jar - HttpServlet 类
- 第二:重写 doXxx 或 service 方法
- Xxx表示请求方式,如Get、Post
- 第三:编写代码,实现相关业务逻辑
- 第四:配置,设置 Servlet 的访问路径(入口)
- @WebServlet("/")
- 其中,在Servlet中的 `/` 就是项目的上下文路径
**实现 Servlet 的核心步骤**
```java
// 第一:获取页面传递(表单)的数据 - 验证数据的合法性(正则表达式)
// 第二:加工处理 - 实现具体的业务逻辑
// 1.实例化 Dao 对象
// 2.调用 Dao对象中的方法,实现相关的数据库操作
// 第三:响应 - 重定向或转发页面
```
## ch03.实现用户登录
第一:编写程序,实现连接数据库
```java
public class DbUtil {
}
```
注意:JDK、JDBC、SQLServler是有版本的兼容性问题的!软件升级是成本问题的!
解决:
- 编辑`%JAVA_HOME%\conf\security\java.security`
- 修改前
```
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, DTLSv1.0, RC4, DES, \
MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
ECDH
```
- 修改后
```
jdk.tls.disabledAlgorithms=SSLv3, DTLSv1.0, RC4, DES, \
MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
ECDH
```
第二:编写实体类
**数据表**
```mssql
-- 用户信息表
create table users
(
id int identity(1,1) primary key, -- '用户编号'
username varchar(50) unique not null, -- '帐号'
password char(32) not null, -- '密码'
level varchar(10) default '会员', -- '用户级别'
image varchar(50) default 'default.jpg', -- '头像'
phone varchar(20), -- '联系电话'
email varchar(50), -- '邮箱地址'
register_time datetime default getdate(), -- '注册时间'
status int default 1, -- '状态'
);
insert into users(username,password,phone,email) values ('admin','123456','13417747371','114729040@qq.com') ;
insert into users(username,password,phone,email)
values ('zing','123456','13417747371','114729040@qq.com') ;
```
**实体类**
```java
public class User {
// ...
}
```
第三:编写DAO接口
数据访问对象:结合业务,针对相应的数据表,定义相关的方法,实现数据库操作
接口是标准、规范,只告诉你能做什么,但没有具体的实现!
特殊注意:在 DAO 方法中,只单纯的做数据库的 CRUD 操作,不要编写任何的业务代码!
```java
public interface UserDao {
// 操作1...
// 操作2...
// 操作N...
}
```
第四:编写 DAO 接口的实现
基于上面定义的接口(标准、规范),定义相关的实现。注意:根据业务,同一个接口可能有多个实现。
```java
public class UserDaoImpl implements UserDao {
// 重写接口中的所有抽象方法(实现方法)
// JDBC数据库操作 - 7个步骤
}
```
第五:编写测试类
对DAO中的方法进行测试
注意:此步骤按需要操作
```java
public void UserDaoTest {
private static void testXxxx() {
// ...
}
// ...
public static void main(String[] args) {
testXxxx() ;
}
}
```
第六:编写相关的页面
> error.jsp、welcome.jsp、login.html、reg.html
>
> HTML + CSS + JS
- 展示结果
- 提供用户操作的界面
第七:编写Servlet
>编写 Servlet 程序的四个步骤!!!!!
- 服务器端程序,接收页面发送过来的请求
- 对请求进行处理
- 响应处理结果
```java
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
// ...
}
```
最后注意:
此案必须拿下~
此案必须拿下~
此案必须拿下~
## ch04.分页查询
```java
-- 产品信息表
create table product
(
product_id varchar(50) primary key not null , -- 产品编号
product_name varchar(50) not null, -- 产品名称
product_type varchar(50) not null, -- 产品类型
product_price float not null, -- 产品价格
product_count int not null default 1, -- 产品库存
product_image varchar(50) default 'default.jpeg', -- 产品图片
product_date datetime default getdate(), -- 上货日期
product_desc varchar(200) default '暂无描述', -- 描述
product_sale int, -- 销量
product_status int -- 是否上架
) ;
-- 初始化数据
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('101','米家智能插座WIFI版','家电',39.5,100,'101.png','2013-01-07','101..',100,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('102','德尔玛多功能蒸汽清洁机','家电',59.5,100,'102.png','2015-11-01','102..',200,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('103','90分框体旅行箱','家居',200,100,'103.png','2013-09-04','103..',300,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('104','米家两六冰箱160L','家电',1999.5,100,'104.png','2018-04-03','104..',400,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('105','流浪地球CN171运兵车','玩具',199.5,100,'105.png','2019-03-02','105..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('106','回力袜子男抗菌中筒袜秋冬新品情侣款','服装',42,100,'106.jpeg','2019-03-02','106..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('107','周生生水波纹手链','首饰',1629,100,'107.jpeg','2017-06-14','107..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('108','腾讯视频年卡+京东PLUS会员','硬件',148,100,'108.png','2019-06-24','108..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('109','Dyson戴森 手持无线吸尘器 V7','家电',1199,100,'109.jpeg','2013-05-22','109..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('110','京东京造 哥窑自动茶具套装','家居',519,100,'110.jpeg','2018-05-08','110..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('112','鸭鸭佟丽娅同款工装羽绒服','服装',699,100,'112.jpeg','2022-11-02','112..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('113','JBL T115TWS真无线耳机','家电',168,100,'113.jpeg','2022-01-01','113..',500,1) ;
insert into product(product_id,product_name,product_type,product_price,product_count,product_image,product_date,product_desc,product_sale,product_status)
values ('114','玖合 256GB SATA3 SSD固态硬盘','硬件',96,100,'114.jpeg','2012-12-12','114..',500,1) ;
select * from product;
-- 分页查询
select * from (
select *,
row_number() over(order by t1.字段 asc) as rownumber
from 表名 as t1 where 条件
) as t2
where rownumber between (当前页数-1)*每页记录数+1 and 当前页数 * 每页记录数
select count(product_id) from product where 条件;
-- 动态条件查询 + 分页查询
select * from (
select *, row_number() over(order by t1.product_id asc) as rownumber
from product as t1
where 1=1
and product_name like '%7%'
and product_type='玩具'
) as t2
where rownumber between 1 and 5;
select count(product_id) from product where 1=1
and product_name like '%7%'
and product_type='玩具';
```
**分页效果**

- 当前页(currentPage)
- 总页数(totalPageCount)
- 整除:总记录数 / 每页显示记录数
- 不整除 : 总记录数 / 每页显示记录数 + 1
- 每页显示记录数(pageCount)
- 总记录数(totalRecords)
- select count(*) from users ;
- 当前页显示的数据集合(data)
- SQL语句
第一:编写DAO,执行以下 SQL 语句
分页查询
```mssql
select * from (
select *,
row_number() over(order by t1.字段 asc) as rownumber
from 表名 as t1 where 条件
) as t2
where rownumber between (当前页数-1)*每页记录数+1 and 当前页数 * 每页记录数
```
查询总记录数
```mssql
-- select count(主键) from 表名 ;
select count(product_id) from product ;
```
第二:定义分页工具类,把分页信息封装起来
```java
public class PagerUtil {
/**
* 当前页
*/
private int currentPage;
/**
* 每页显示记录数
*/
private int pageCount;
/**
* 总记录数
*/
private int totalRecordCount;
/**
* 总页数
*/
private int totalPageCount;
/**
* 页面显示的数据
*/
List data;
// setter/getter
}
```
第三: 编写Servlet
> 组织并封装分页信息
- 获取当前页
- 调用DAO,把分页信息封装到 PagerUtil 对象中
- 把PagerUtil对象封装在请求作用域中,转发到 JSP 页面
第四:编写前端页面
> 在JSP页面中,读取分页工具类的分页信息
1)导入JSTL标签库
```
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
```
注意:在项目中添加标签库的相关JAR包
2)使用 JSTL + EL 遍历数据
```
| ${u.id} |
${u.username} |
${u.name} |
${u.sex} |
${u.phone} |
删除 | 修改 |
```
## ch05.JDBC事务操作
```mssql
-- 创建bank表
create table bank
(
customerName CHAR(10), --顾客姓名
currentMoney MONEY --当前余额
)
-- 添加索引,当前余额⾄少1块
GO
alter table bank
add constraint ck_currentMoney
check(currentMoney>=1)
GO
insert into bank(customerName,currentMoney) values('张三',1000)
insert into bank(customerName,currentMoney) values('李四',1)
select * from bank ;
--李四要转500块钱给张三
-- 转帐业务:1 - 转出
update bank set
currentMoney = currentMoney - 1000
where customerName = '张三'
-- 转帐业务:2 - 转入
update bank set
currentMoney = currentMoney + 1000
where customerName = '李四'
```
在 JDBC 中,提供以下代码实现事务操作
```java
// 设置手动提交事务 - JDBC默认是自动提交事务
conn.setAutoCommit(false);
// 提交事务
conn.commit() ;
// 回滚事务
conn.rollback() ;
```
## ch06.JDBC存储过程
```mssql
GO
create procedure proc_zhuang_zhang
@out_name varchar(50) , -- 转出帐号
@in_name varchar(50) , -- 转入帐号
@jiao_yi_money money , -- 交易金额
@row int output -- 记录是否转帐成功,1为成功,否则失败
as
begin transaction
declare @n int = 0 -- 定义变量,用户记录错误代码
-- 转出
update bank set
currentMoney = currentMoney - @jiao_yi_money
where customerName = @out_name
set @n = @n + @@error
-- 转入
update bank set
currentMoney = currentMoney + @jiao_yi_money
where customerName = @in_name
set @n = @n + @@error
-- 逻辑判断
if @n = 0
begin
set @row = 1
commit transaction
end
else
begin
set @row = 0
rollback transaction
end
GO
select * from bank;
declare @r int
exec proc_zhuang_zhang '张三','李四',100,@r output
print @r
```