# 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='玩具'; ``` **分页效果** ![](images/page.png) - 当前页(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 ```