将字符串转换为日期类型?转换成其他新式
思路:调用日期类的工具类,创建为日期类,再使用格式化类转换为自己想要的格式形式。
public static String nullToDate(String value) {
// new Date();
// SimpleDateFormat
// LocalDateTime
// String value="2023-5-4";
String reg = "yyyy-MM-dd hh:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(reg);
try {
Date date = DateUtils.parseDate(value);
return simpleDateFormat.format(date);
} catch (Exception e) {
// e.printStackTrace();
}
return "0000-00-00 00:00:00";
}
接口和继承的注意点?
继承必须写在接口前面
如何删除集合中的特定元素?
迭代器方法:通过集合的长度遍历集合,在遍历过程当中判断遍历的元素是否是自己需要删除的元素,有则删除,无则继续遍历。
代码思路如下 这样可以做到长度自动减1
方法一
for(int i=0;i<list.size();i++)
{
Student student2=list.get(i);
if(student2.getSid()==sid2){
list.remove(student2);
System.out.println("成功删除!");
}
else System.out.println("该学生不存在!");
}
方法二
private static void mod4(Collection<Person> list) {
Iterator<Person> it = list.iterator();
while (it.hasNext()) {
Person person = it.next();
if (person.getName().contains("h")) {
it.remove();
}
}
System.out.println(list);
}
集合的三种遍历方式
迭代器
增强型for
普通for
for(int i=0;i< list.size();++i){
System.out.println((Person)list.get(i));
}
System.out.println();
Iterator<Person> iterator=list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println();
for (Person p:list){
System.out.println(p);
}
接口使用
MyInterface tt = new TT(); tt.test1();//直接创建实现类的对象a1(new MyInterface() { @Override public void test1() { System.out.println("匿名内部类对象"); } });//在接口参数的方法中重新重新编写接口的方法体。注意,只适合接口只有一个方法的
MyInterface myInterface = ()->{ //重新编写方法体,注意,只适合接口只有一个方法的 System.out.println("lambda表达式"); }; myInterface.test1();//这两个相同意思 a1(()->{ System.out.println("lambda表达式"); }); TreeMap<Student, String> map = new TreeMap<>((o1, o2) -> o2.getAge() - o1.getAge());- 3.的排序规则,o1-o2 表示正序,o2-o1 表示反序
JavaWeb项目插件下载出现问题?
解决办法
- 找到idea的安装目录
- 根据这个目录(C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\conf),找到 settings.xml 文件
- 将这个文件复制到 .m2 目录下 C:\Users\ANGGE\.m2,得到如下结果
- 对齐setting.xml 内容修改
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
把这个复制到这里,把原来的注释掉
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
得到如下结果,点击保存即可
2023-2-20
/**
* 2023-2-20 计算机基础
* 1.二进制和十进制相互转换
* 二进制:由1和0表示
* 十进制:0-9表示
* 二进制转换为十进制?01001001 转换为十进制? 73
* 如果用73 转换为二进制怎么转换?用73除以2 01001001
* 2.计算机配置:(Java开发常用笔记本配置(最低要求))
* 1)处理器 CPU i5-十代以上
* 2)硬盘 至少512G以上 固态硬盘
* 3)内存 16G以上
* ------------------
* 假如有台式机:
* 4)主板
* 5)显卡:集显和独显
* 6)机箱
* 7)电源
* 8)散热器
* 9)显示器
* 10)外设:鼠标,键盘,打印机,影响
* 3.理解BS/CS的区别?
* BS通过浏览器访问
* CS必须安装在本地
* 4.环境变量?意思,就是快速找到当前软件进行打开
* 5.java 运行到虚拟机上,不是直接运行到系统
* 6.专业文字编辑器:notepad++
* 7.手写一个HelloWorld
* 1:类名和文件名一致
* 2:类名要大写(大驼峰)
* 3:类名不要有中文或特殊字符
* 8.java里面这里的命名规则:所有命名都不要用中文或者特殊字符
* 1)项目名称:最好全部英文小写,如果有两个字符用-隔开
* 2)包名:全部小写,如果有两个字符,用.隔开
* com.cn.wanxi.model.UserModel
* 国际.国内.公司.模块.类
* 所有的类不要直接命名到src下面,必须要写包
* 3)驼峰式命名:如果多个字符,则每一个字符第一个字母大写
* 大驼峰,则首字母大写:其他首字母大写UserModel(类名)
* 小驼峰。则首字母小写:其他首字母大写userModel(属性,方法,变量)
* 全大写:USER_MODEL 快捷键:ctrl+shift+U(常量)
* 全小写:user-model(项目名)
* 全小写:user.model(包)
* ----------------------------
* 第一阶段命名规则:
* 项目名:都是全小写
* class class="user-name color"
*----------------------------------------------------
* 9.t odo 表示接下来要干什么事情,可以理解为任务发布,以后直接在idea里面查看即可
*-----------------------------------------------------------
* 10.Java 关键字,在idea里面会通过颜色进行区分,在平时不能自己用来命名
* 11.java字符只能是单个字符a-z0-9还有一个中文和特殊字符
* 12.java字符串用双引号括起来
* 13.Java字面量必须要用容器来装:数据类型
* 14.绿色的波浪线表示当前单词idea不认识,给我们一个提示,如果想让它认识?
* 15.代码格式化对齐:ctrl+alt+l
* 16.变量:要变化的量,就是值不固定
* int salary=15000;
* 数据类型 变量名(标识符) 赋值运算符 变量值(字面量)
* 17.标识符:用来定义名字的符号
* 1.不能用特殊字符
* 2.不能用Java关键字
* 3.不能以数字开头
* --------------
* 规范:以后命名全部用英文字符即可
* 18.命名规则:
* 19.Java数据类型
* 基本数据类型
* 整数:按照取值范围分类:byte short int long
* 小数:
* 布尔
* 字符
* 数据类型面试一般会问:
* 1)数据类型的字节数
* 2)数据类型的默认值
* 3)数据类型的大小
* 4)布尔占几个字节?
* 数据类型 字节数 默认值
* byte 1 0
* short 2 0
* int 4 0
* long 8 0
* float 4 0.0
* double 8 0.0
* boolean 1 false
* char 2 ‘’
* 小数默认数据类型为double,整数默认数据类型为int
* 对于长整型 long 命名需要大写L结尾 long l=1L;
* 对于单精度float 用大写F结尾 float f = 1.0F;
* 对于双精度double 用大写D结尾 double g=1.1D;
* 引用数据类型
* 20.键盘录入:用户想要自己添加变量的值
* 1)需要导入第三方包 import java.util.Scanner;
* 2)要得到工具类 创建工具类对象 Scanner scanner=new Scanner(System.in); 涉及到IO流
* 变量命名:注意:一定不要写缩写,我们的代码是给别人维护
* 3)得到录入的数据 int a = scanner.nextInt();
* 注意:需要给用户提示信息
*
*/
2023-2-21
/**
* 2023-2-21 运算符
* 回顾:
* 1.bs/cs结构
* 2.变量
* 3.关键字 八大基本类型,public,class,void,static
* 4.标识符 取的名字;
* 5.字面量 对数据进行变量的赋值的值 一般是指等号后面的值
* 6.键盘录入
* ----------------------------------------------
* 运算符
* 当运算符进行运算时,会得到一个和当前运算符最大的运算符的数据类型
* 如果是整数,则向下取整
* 整数相加等于整数,如果有字符相加,则叫字符串拼接
* 字符串拼接从左到右开始计算,
* --------------------------
* 自增自减运算符
* a = a++; 先将右边的a的值赋值给左边的a,
* 然后对右边的a进行++,
* 并没有将值赋值给左边的a
* a=a--;和上面一样
* b=++b; 先将右边的b进行加1,然后赋值给左边的b,所以左边的b加1
* ----------------------------------------------------
* 数据类型转换
* 隐式转换,将范围大的装入范围小的,省略了(数据类型)
* 强制转换,将范围小的赋值给范围大的,必须显式(数据类型)
* java里面没有非零表示true,零表示false的说法
* --------------------------------------------------
* 赋值运算符
* b+=1;//隐藏了一个强制转换其实意思就是b=b+1;
* 只不过做了一个强制转换b=(byte)(b+1);
* ---------------------------------------------------
* 关系运算符
* 比较运算符
* 关系运算符一般用于基本数据类型
* ------------------------------
* 逻辑关系
* & true&false false 遇false为false
* | 遇true为true 只要有一个为true,则结果为true
* ! 取反
* ^ true^false 相同为false,不同为true
* 短路运算符
* && false && false 遇false则后边条件不进行计算
* ||
* 短路与只要左边false,则右边不运行
* 短路或,则只要左边为true,右边不运行
* ---------------------------
* 三运运算符
* int a=b>c?e:f;
* 如果b>c为true,则a的值为e,否则为f;
* ----------------------------------------
* 优先级
* 一般情况下,先乘除后加减,先括号,后外边,先短路与在短路或
*
*
*/
2023-2-22 项目的完整建立过程
public class ReadMe {
/**
* 2023-1-31 http和tomcat和servlet
* 1.http:协议特点
* 2.get和post的区别?
* 1)get请求有大小限制 post没有
* 2)安全:get请求会出现在浏览器地址,post不用
* 3)请求刷新时,post会重新提交数据
* 4)get请求会缓存,post不会
* 5)get请求速度更快,因为直接走缓存
* 6)每次必须请求后台,就是必须是新请求,不要走缓存,最好用post
* 7)get请求必须是字符串,post请求所有格式(文件,图片,视频,字符)
* 3.web访问后台需要一个容器:tomcat容器
* 4.下载按照tomcat 注意:版本 servlet 4.0 tomcat 9.0 jdk 1.8(安装包)
* 1)下载tomcat 9.*
* 2)下载安装包(不用配置环境变量),不要下载压缩包(需要配置环境变量)
* 3)注意:port修改为大于等于0即可:默认是-1
* 4)安装tomcat之前需要安装JDK
* 5)怎么运行tomcat,标识已经安装成功?
* 找到服务,直接启动即可:访问:http://localhost:8080/
* 5.创建JavaWeb项目
* 1)直接创建一个maven项目
* 2)添加web服务支持
* 3)添加tomcat
* 4)启动项目
* 6.为什么能够直接访问到index.jsp页面?
* 7.SERVLET 导入servlet的jar包
* 1)怎么得到servlet的包?两种方式:
* 百度 直接搜索,
* 官网 https://search.maven.org/
* 8.servlet 需要实现里面的所有方法
* 9.执行时,调用service
* 10.servlet的生命周期:初始化 init,执行service,销毁destroy
* 11.WebServlet里面的地址必须唯一,必须以左斜杠开头/
* 12.以后查询一般用get,更新(增加,修改,删除)一般用post
* 13.涉及到密码等敏感信息则用post,设计到IO流用post
*
*/
/**
* 2023-2-1 请求和响应
* 1.请求行
* 2.postman测试工具:浏览器默认只能是get方法访问,post方法不能访问
* 3.访问后他:一般通过parm的形式传递参数(数据)
* 4.Java 接收数据一般用req.getParameter("name");
* 5.java 如果想要将对象转换为json对象{"key":"value}的形式,则需要进行封装
* 6.Java没有自己的api,所以会引入第三方jar包
* 7.fastjson,gson,
* 8.以后前后端数据传递都通过json对象进行
* 9.前后端相互交互:
* 1)乱码处理
* 2)得到前端的数据
* 3)将数据封装到对象
* 4)进行逻辑处理(service层)
* 5)得到逻辑处理结果
* 6)将最终结果以json对象传递给调用者(前端)
* 10.java里面最好不要出现魔法值:容易经常改变的值:推荐用枚举
* 11.第三阶段设计到jsp,涉及到页面转发,涉及到作用域,
* 12.Java得到前端的数据:req.getParameter("username");这里的username对于的是页面里面的name属性
* 13.jsp页面得到Java的数据${name}这里面的name对应的是req.setAttribute("name", username);
* 14.servlet里面的三大作用域
* 1)request 数据只能在转发的页面才能取到
* 2)session req.getSession() 数据可以在"任何"页面都可以取到(不能跨浏览器)
* 3)application req.getServletContext() 数据可以在任何页面都可以取到 (可以跨浏览器)
* 15. req对属性进行设置
* req.setAttribute("pass", pass);添加属性名
* req.getAttribute("name");根据属性名得到值
* req.removeAttribute("name");删除属性名
* 16. resp.sendRedirect("/success.jsp");重定向
* 17.页面转发和重定向的区别?
* ----------------------------------------------
* 请求:
* 1)乱码
* 2)得到前端数据getParameter,Map,queryString
* 3)得到地址:URL,URI,
* 4)作用域
* 5)页面转发
* 响应:重定向
* ------------------------------
*
*
*/
/**
* 2023-2-2 jsp
* 1.Java特点:解耦 耦合度不能太高
* 2.java 面需对象编程:Java封装
* 3.java代码不要写页面,页面最好也不要写Java代码
* 4.在写Javabean的时候,所有的属性都要写set和get方法,如果修改一个,则很难定位到某一行代码
* 引入第三方框架:jar包 lombok
* 5.Java传递集合或者数组到前端,前端也应该进行遍历数据
* jsp怎么遍历数据?jsp的标签库,需要引入jar包
* 6.@Builder
* 7.引入工具类:工具类一般情况下调用的时候不要创建新对象
* 8.怎么才能让别人不能调用工具类创建新对象?
* 9.增加思路?
* 1.打开查询页面,点击新增按钮,跳转到新增页面
* 2.在新增页面输入品牌信息,点击提交按钮
* 3.在Java后台得到品牌信息,封装后进入逻辑层(service)
* 4.在逻辑层处理增加信息,增加到一个集合的容器里面
* 5.增加成功后应该返回成功页面:也可以直接返回到查询所有页面
* 6.如果返回查询页面,则可以直接通过注解跳转到/show的servlet进行查询
* 10.第三阶段做简单的jsp的逻辑思路
* 1)因为所有的数据属于动态数据,则数据应该从Java后台来
* 所以,第一次访问直接访问Java后台的servlet注解
* 2)在servlet里面查询出所有数据,并存入req作用域,进行页面转发
* 3)在jsp里面通过遍历显示数据
* ---------------------------------
* 对包 的解释:
* servlet:和jsp页面相关 页面控制层
* 1)处理乱码
* 2)得到前端数据
* 3)封装到model(实体类JavaBean)
* 4)调用逻辑层处理逻辑关系
* 5)处理完后,得到结果
* 6)将结果转发到jsp页面
* service:逻辑关系处理 服务逻辑层
* dao:用来存放数据的地方 数据持久层
* model:对象层 实体类 JavaBean
* util 工具存放的地方 工具层
* ----------------------------------------
* 今日任务:将案例的增加和查询按照三层架构的方式做出来
*
*/
/**
* 2023-2-3 项目改造
* 1.MVC模式
* M:model 实体类
* V:view 视图 JSP页面
* C:controller 控制层 Servlet层 接收页面数据(请求)和返回页面数据(响应)
* 2.三层架构
* 表现层:可以理解为MVC里面的V和C:页面和servlet层
* 逻辑层:处理逻辑的地方 service 层
* 数据访问层:dao 处理数据的地方(存储数据的地方)
* DB:数据库
* 3.新增思路:
* 1)有一个页面:页面上有一个新增按钮
* 2)点击新增按钮跳转到新增页面
* 3)在新增页面点击提交按钮,讲表单里面的值传递到Java后台
* 4)在Java后台servlet里面去拿到前端数据
* 1:乱码处理 因为前端和后端交互会有中文出现
* 2:得到前端的值 req.getParameter("");
* 3:封装前端的值到model
* 4:调用服务逻辑层(因为要处理一些逻辑代码)
* 5:得到处理后的结果
* 6:将结果返回给页面(跳转到查询页面)
* 5)在service里面处理逻辑关系(将得到的数据保存到数据容器里面(集合list))
* 6)在dao数据持久层 里面设置一个容器接收保存的数据
* 4.查询思路:
* 1:打开jsp页面?
* 不能直接访问页面,因为页面的数据属于静态,则数据应该从Java后台来
* 所以,只能访问Java后台,通过将查询出来的数据响应给前端(页面转发)
* 1:用户直接访问Java后台的注解地址:
* 正常情况下,这里面应该有六个步骤,
* 这里不需要得到前端的值和封装到model
* 2:其他和新增一样
* -----------------------------------------------------------
* 5.修改的思路:
* 1)点击修改按钮跳转到修改页面
* 2)将刚刚的数据放入修改页面
* 3)点击修改
* 4)返回查询页面
* -----------
* 修改数据时,需要溢出list里面的数据,然后进行添加
* 建议用Iterator<BrandModel>进行遍历
* BrandDao.brandModelList.set(1,model);这个不用移除数据,直接修改指定的数据
*------------------------------------------------------
* 第三阶段的目的:将页面上的所有静态数据转换为动态数据(Javaweb)
* 1:思考:页面上哪些数据是需要转换的?
* 2:怎么来做?
* ---------------------------
* 1)找到自己项目有哪些对象?
* 写出对应的JavaBean
* 2)将html修改为jsp页面(jsp的目的就是为了取消js而存在,所以页面上最好不要出现js)
* 最上面一句话不同
* jsp并不一定能够完全替代js(因为优缺点,而且很多不能做)
* jsp也会设计到页面之间相互引入
* 3)每一个页面对应一个Servlet
* 所有的数据应该从后台读取
* 6.返回数据到页面
* 5.将数据封装到req
* 4.数据来源于service
* 3.不用封装
* 2.不用再前端拿值
* 1.需要乱码处理
* 4)service 直接调用dao
* 5)dao 存放数据
* -------------------
* 任务:将第三阶段页面所有的数据全部存到dao,通过jsp进行页面渲染
*
*/
}
数据库 基础
package com.wanxi;
public class ReadMe {
/**
* 2023-2-7 数据库基础
* 项目制作流程
* 1.创建maven空项目
* 2.创建web项目:引入web模块
* 3.导入需要的jar包依赖:
* servlet包,
* Lombok包,
* io流包(文件上传),
* mysql数据库包
* json包
* 4.导入前端模板:x-admin(不要修改这里面的任何一个代码)
* 5.创建Java的包(三层架构的包)
* servlet
* service
* dao
* util
* model
* 6.创建web的包(web目录结构的包)
* html
* css
* js
* img
* 7.配置tomcat,启动项目
* ----------------------------------------------------
* 8.一个完整的前后端流程
* 以登录为例:
* 1.创建登录页面
* 2.修改登录页面的html和css代码
* 3.引入js文件(js和html代码不要写在一起)
* 4.所有页面数据都通过ajax传递到Java后台
* -----
* java 后台:
* 1.servlet 六大步骤:乱码,取得前端的值,封装到model,调用service,得到返回数据,传递给前端
* 2.service 处理逻辑关系,和调用dao层
* 3.dao 调用jdbc
* 4.JDBC 工具类,固定用法,
* -----------------------------------------------------------
* 数据库:
* 1.数据库是什么?
* 2.mysql优势?
* 3.MySQL的应用场景?
* 4.怎么用?
* --------------------
* 1.安装MySQL软件和配置环境变量(可不配置):
* 注意:在安装过程中,出现安装服务错误,则需要重新安装,
* 重新安装之前,需要删除注册表里面的内容
* 2.安装MySQL要安装哪些内容呢?
* 1.MySQL service 服务
* 2.MySQL workbench 桌面端(Navicat) sql yog
* 3.connector/J
* 3.连接数据库:
* 4.创建数据:CREATE SCHEMA `canyin04` ;
* 5.创建表:应该创建什么表?和第三阶段model一一对应
* 表名和类名一一对应
* 列名和类的属性名一一对应
* mysql数据类型和Java属性的数据类型一一对应(可以不用绝对对应)
* 每一个表都应该有一个主键:每一条数据保证唯一
* 数据库的列名命名规则,以下划线的形式line_phone
* 6.数据库的数据引擎innoDB和MyISAM的区别?
* 7.mysql的数据类型?
* mysql java
* int
* tinyint byte
* smallint short
* int int
* bigint long
* char String
* varchar String
* text String
* date,time,datetime date
* decimal BigDecimal
* 所有Java类型在数据库都可以用varchar
* 8.char,varchar,text的区别?
* char用于固定长度(长度差不多) 255之内的字符
* varchar用于不定长度 小于65535用varchar
* text用于很长的字符 其他用text
* char(45)和varchar(45)的区别?
* 9.数据库应该有一些共同的列名
* id 主键表示唯一 要选择三个选项:1.PK,2.NN,3.AI
* create_time 创建时间
* update_time 更新时间
* enable 数据状态
* remark 备注
* 10.创建表代码
* CREATE TABLE `company` (
* `id` INT NOT NULL AUTO_INCREMENT,
* `logo` VARCHAR(200) NULL DEFAULT '',
* `phone` CHAR(11) NULL COMMENT '手机',
* `net` VARCHAR(45) NULL COMMENT '网址',
* `address` VARCHAR(200) NULL DEFAULT '',
* `version` VARCHAR(45) NULL DEFAULT '',
* `email` VARCHAR(45) NULL DEFAULT '',
* `line_phone` VARCHAR(45) NULL DEFAULT '',
* `content` VARCHAR(45) NULL DEFAULT '',
* `create_time` DATETIME NULL DEFAULT '',
* `update_time` DATETIME NULL DEFAULT now(),
* `enable` TINYINT(4) NULL DEFAULT -1,
* `remark` VARCHAR(200) NULL DEFAULT '',
* PRIMARY KEY (`id`));
* 注意:最好创建表的时候不要出现null的情况,
* 11.修改的表列的sql语句
* ALTER TABLE `company`
* CHANGE COLUMN `logo` `logo` VARCHAR(200) NULL DEFAULT '' ,
* 12.删除表
* DROP TABLE `company`;
* 13.查询表
* show tables;
* -----------------------------------------
* 14.新增数据的sql
* INSERT INTO `company` (`logo`, `phone`, `net`, `address`, `version`, `email`, `line_phone`, `content`,
* `create_time`, `update_time`, `enable`, `remark`)
* VALUES ('1', '1', '1', '1', '1', '1', '1', '1',
* '2022-2-22', '2022-3-30', '1', '1');
* 15.查询数据
* SELECT * FROM company;
* 16.修改sql语句
* UPDATE `company` SET
* `logo` = '2', `phone` = '2', `net` = '2', `address` = '2',
* `version` = '2', `email` = '2', `line_phone` = '2',
* `content` = '2', `create_time` = '2022-05-22 00:00:00',
* `update_time` = '2022-05-30 00:00:00', `enable` = '5', `remark` = '5'
* WHERE (`id` = '4');
* 17.删除数据
* delete from company where id=3;
* 注意:删除后,数据库还保留当前数据,可以恢复
* truncate company; 删除所有数据,不能恢复
* drop company;删除表结构
* 面试:delete和truncate和drop的区别?
* -----------------------------------
* 今日学习的知识点:
* 1.数据库创建
* 2.表创建,删除,更新列,查询
* 3.表数据的创建,更新,删除,查询
* 4.数据的导入导出
* 5.数据的权限控制(连接其他人的数据库,必须分配权限才能连接)
*/
/**
* 2023-2-8 数据库查询
* 1.建表的时候,如果是两个对象,他们之间应该存在某种关系
* 一对一
* 一对多
* 多对一
* 多对多
* 怎么来分表?把经常需要修改的列放一个表,把不经常需要修改的放一个表
* 用户信息表:在用户信息表里面多写其他表的id
* user(id,password_id,public_id,private_id)
* 如果是一对多或者多对一,则在"多"的这个表里面创建一个"一“的id
* 密码表:将用户和密码单独放一个表
* 公开信息表:昵称,头像,性别
* 自己私有表:手机,身份证,email,生日
* 地址:可能会有多个,则需要另外一个表address(id,user_id);
* 爱好表:
* 更新时间信息表:update_time,remark
* -------------------------------------
* 如果不想让多个表里面有其他表的id,则可以考虑创建一个关系表
* --------------------------------------------------
* 2.以后查询的时候遇到or的时候要写括号
* 3.sql注入?
* 4.sql模糊查询可以用正则表达式?
* 5.排序
* select * from product order by id desc;
* select * from product order by id asc;-- 默认升序
* 6.分组:将相同的分成一个组,
* select is_show,enable from product group by is_show,enable;
* group by后面的列应该大于select后面的列,而且select后面的列必须在group by后面有才行
* 7.javabean里面的属性的数据类型不能写基本数据类型?
* ---------------------------------------------------
* 今日内容:
* 1.运算符
* 2.方法,函数
* 3.排序,分组,分页
* 4.多表查询:内连接,合并查询,子查询
* ---------------------------------
* 后面内容:
* 1.接口:前后端分离提供给前端接口(servlet)
* 2.逻辑:返回数据格式化(service)
* 3.数据:数据持久层(dao)--JDBC|MYBATIS
*
*/
/**
* 2023-2-9 Java后台连接数据库
* 登录的思路?
* web前端
* 1)创建一个登录页面
* 2)通过点击登录按钮获取用户信息将信息传递到Java后台
* Java后端
* 1)servlet 得到前端的数据:六大步骤
* 2)service 逻辑关系处理,验证码是否正确,用户名和密码是否正确
* 3)dao 数据持久层 将用户信息和数据库里面的数据进行对比
*---------------------------------------------------------------
* 假如前端已经做好,只做后端:必须提供给前端访问的接口:webServlet
* Java后台得到前端的值,以后封装到vo里面去
* java和前端之间相互通信时通过什么样的格式?
* 一般情况下都是以json的格式进行交互
* {
* “key":"value",
* "key":"value"
* }
* 前端可能得到Java后台的值的数据类型有
* 1.整形
* 2.字符串
* 3.对象
* 4.数组或者集合
* 前端要求Java后台能不能返回一个统一的格式?
* Java和数据库的对象一一对应 model
* 前端传递到Java后台的数据用的是 VO
* java传递到前端也应该有一个自己的对象 dto 数据传输对象
* ----------------------------------------------
* servlet 六大步骤
* service 逻辑处理
* 1)验证码判断 只有验证码正确才查询用户名和密码
* 2)查询用户名和密码
* 将vo里面的数据复制到model
* 同时,将密码加密后存入到model
* 密码加密的方式有很多种,直接用jdk自带的加密方式,md5;
* 3)将查询的结果赋值到ResultDTO
* dao 层 连接数据库
* 1)通过sql语句去数据库查询
* 2)调用连接数据库的方法
* JDBC 六大步骤
* 面试?PreparedStatement和Statement的区别?
* ------------------------------------------
* 1:流程图:
* 2:类图:rose powerdesinger
* 3:er图
* 4:时序图
* 5:用例图
* ------------
* 燃尽图
*/
/**
* 2023-2-10 Java后台的CRUD(增删改查)
* 登录逻辑思路:
* 1.登录有验证码,用户名,密码(postman测试)
* 2.servlet LoginServlet.java
* 1)乱码处理
* 2)得到前端的值
* 3)封装到VO,VO就是用于封装前端传递到后台的值
* 4)调用服务逻辑层
* 5)得到服务逻辑层传回的数据(DTO) 后端传递到前端的数据
* 6)将得到的数据转换为json对象传递到前端
* 3.service 服务逻辑层
* UserService.java
* UserServiceImpl.java 多态
* 1)判断验证码是否正确
* 2)对密码进行加密
* 3)将VO里面的数据复制到model里面
* 4)逻辑判断,传递到前端应该传什么数据
* 4.dao 数据持久层
* UserDao.java
* UserDaoImpl.java
* 1)封装sql语句
* 2)调用JDBC的查询方法
* 3)解析结果集ResultSet
* 5.JDBC 连接数据
* 1)加载驱动
* 2)得到数据库连接
* 3)编译sql语句
* 4)执行sql语句
* 5)返回得到的结果集
* 6)关闭连接
* ------------------------------------------
* 用户新增:思路
* 前端逻辑:
* 1.打开页面
* 2.输入用户信息
* 3.判断用户信息是否输入格式正确
* 4.提交信息到Java后台
* 后端逻辑:
* 1.servlet 六大步骤
* 2.service
* 1)将VO里面的数据复制到model
* 2)将密码加密
* 3)根据返回的结果判断是否返回什么ResultDto
* 3.dao
* 1)sql语句
* 2)调用JDBC
* 3)返回结果
* 4.JDBC
*----------------------------------------
* 删除用户:
* servlet 六大步骤
* service 逻辑处理
* dao sql编写
* ------------------------------------
* 今日任务:
* Java后台:所有的增删改查操作都做完
* 下节课:
* 封装 dto和文件上传
*
*
*/
/**
* 2023-2-13 后台代码封装和文件上传
* 1.菜系:思路?学会画图:流程图,类图
* 1)对象:CuisineModel
* 2)表:cuisine 多了几个固定的列
* 3)web或者Java代码的编写(不分先后:可以同时开发)
* 4)web端:
* 1:创建html页面
* 2:用户输入信息:判断输入的格式是否正确
* 3:将信息提交给后台
* 5)Java端
* 1:servlet 六大步骤
* 2:service 服务逻辑处理
* 3:dao sql语句和解析结果集
* 6)JDBC的使用
*----------------------------------------------------
* 以后查询所有的时候,不能直接写select * from 表
* 必须跟一个分页:默认显示多少条数据
* mysql 书写关键字的顺序,分页放在最后
* 查询所有的时候,最好将根据当前条件查询的总条数得到
* 很多时候,我们需要得到最后一页,则用总条数除以每一页显示的条数即可
* 查询总条数一共和查询所有的条件一模一样,只不过查询所有多了一个分页
* -----------------------------------------------------
* 正常情况下,每一个表都应该有六个操作
* 增加
* 修改
* 删除
* 根据id查询
* 根据模糊查询
* 查询总条数
* ------------------------------------------------
* 注意:BaseVO不建议大家在这里用:因为用Lombok包的时候拿不到父类
* public interface BaseService<T> 这里泛型
* 产品思路?Java端
* 1:servlet
* 2:service 将DTO封装 将dao层提到全局变量
* 3:dao
* ----------------------------------
* 上传图片的时候,应该拿到一个图片在服务器上的地址,怎么拿?
* 思路:?
* 1.需要访问服务器的地址
* 2.在服务器得到前端的数据
* 3.将前端的数据封装到某个地方?(临时目录,缓存)
* 4.将文件保存到具体地址
* 5.将保存的地址返回给前端
* 注意:默认图片保存到out里面,这里需要将图片复制到web目录下
*/
/**
* 2023-2-14 登录,用户管理
* x-admin的模板内容不要去修改,直接复制出来引用即可
* 1.复制X-admin的项目到web目录下
* 2.复制login.html文件到自己的html文件包里面
* 3.将所有的引入外部地址修改为绝对路径
* 4.将js通过外部文件引入,不要把js写在html里面
* --------------------------------
* 用户查询
* 1.复制页面,删除表格
* 2.复制layui里面的<table class="layui-hide" id="test" lay-filter="test"></table>
* 3.复制js table.render({
* 4.添加加载模板: let table = layui.table;
* 5.修改table.render({
* 6.再web端将得到的数据打印出来
* 7.用模板将需要修改的列展示出来
* ------------------------------------
* 今日知识点:
* 1.js的数据类型
* 2.js的定义
* 3.js的方法
* 4.js的数据传输 session
* 5.得到焦点
* 6.js的取值赋值
* 7.ajax调用后台
* 8.layui.msg 弹出提示信息
* 9.跳转页面
* 10.时间格式化
* 11.定时器
* 12.表单渲染
*/
/**
* 2023-2-15 用户新增修改删除
* 1.如果前端时间需要年月日,不需要时分秒,则一般情况下再数据库里面操作即可
* 2.正常情况下,以后所有的查询都不能用* 查询所有列
* 3.删除思路逻辑?
* 1:点击删除按钮需要对其进行监听
* 2:对于重要的信息删除应该给用户提示
* 3:通过ajax调用后台
* 4:根据后台代码返回的数据进行逻辑操作
* 4.新增:?
* 1:有新增页面
* 2:监听提交按钮
* 3:得到值
* 4:传递到Java
* 5:根据Java返回的值进行逻辑判断
* 5.日期框弹出:强制: trigger: "click"
* 6.对于有些输入框需要做字符格式验证:正则表达式
* 前提:
* 1)required="" 要求检测
* 2)lay-verify="email" 对于自定义验证的正则表达式
* 3)layui有一个默认的验证,自定义验证会覆盖自身的验证
* 7.对于复选框,得不到值$("input[type=checkbox][name=hobby]:checked").each(function (index, obj) {
* 8.js数组转换为字符串
* 9.点击编辑按钮,弹出编辑页面:一般情况下不要和密码一起修改
* 10:修改的思路?
* 1:点击修改按钮弹出修改页面
* 2:根据id将当前数据查询出来,显示在页面上
* 3:点击提交按钮进行修改
* 4:ajax需要添加一个id
*-------------------------------------------------
* 今日知识点:
* 删除:工具栏监听,提示是否删除,调用ajax
* 新增:表单得到里面的值,复选框难一点:数组和字符串相互转换
* 编辑:对表单进行赋值:form.render();
* 双重for循环
* js里面div对象的遍历
* js取值赋值
*
*/
/**
* 2023-2-16 产品
* 产品查询:
* 1:html页面
* 2:js文件
* 3:Java后台
* 做查询时,如果有条件查询,则对于时间和数字都应该有区间查询
* 比如:年龄
* 1)查询年龄小于5的
* 2)查询年龄大于10的
* 3)查询年龄在5到10之间的
* 在index.html里面修改产品
* ------------------------------
* 产品新增:
* 1:页面
* 页面需要得到时属于哪个菜系,菜系的数据应该来源于数据库
* 2:js 首先加载模板,然后加载菜系数据
* 3:Java 后台
* 注意:
* 1)添加的时候修改产品的路径
* 2)文件上传成功以后,将文件路径定义一个全局变量,在提交按钮时,直接得到
* -------------
* 编辑产品的思路
* 1)html页面
* 2)js文件
* 1:加载form表单
* 2:加载菜系
* 3:将需要修改的数据赋值到页面
* 4:点击提交按钮进行提交
* 3)java后台
* ---------------------------------
* 今日知识点:
* 1)对于有多个表,则需要在页面加载时先加载另一个表的数据(菜系)
* 2)文件上传:需要将图片的地址得到,设置了一个全局变量
* 3)点击修改提交按钮时,得到图片地址和id
* 4)只要涉及到页面赋值,则需要重新渲染数据:form.render();//重新渲染表单
* 5)页面赋值三种形式
* 1:input 表单赋值 $("#id").val(data.cuisineId);
* 2:div 赋值 $("#id").html(data.cuisineId);
* 3:修改div属性赋值 $("#demo1").attr("src", data.imgHref);
* 6)加载先后顺序的问题:先加载菜系,然后根据id查询,然后赋值到页面,然后渲染
*/
/**
* 2023-2-17 session安全认证和富文本
* 总结:
* 产品增加:
* 1:创建页面 如果要对输入框进行验证,则需要required="" lay-verify="username"
* 2:创建js
* 1)页面加载完成执行里面的代码 $(function(){})
* 2)加载layui的模板:layui.use([],function(){})
* 3)监听提交按钮
* form.on('submit(add)',function(data){//data拿到form表单
* data=data.field;// field 对应的是name属性
* 如果有文件上传,则另外拿
* data.imgHref=imgHref;
* 如果是复选框,则也需要单独拿数据
* 可以对复选框进行遍历(如用户新增爱好)
* 这里的data即拿到所有我们需要的数据
* 通过ajax传递到Java后台
* $.ajax({
* url:'/back/product/add',
* data:data,
* type:'post',
* dataType:'json',
* success:function(res){
* //根据res返回的数据进行逻辑处理
* }
* });
* return false;//不让刷新页面
* })
* 4)文件上传:需要得到文件上传后返回的值的地址
* imgHref = res.data;
*------------------------------------------------------
* 对前端js里面到处都在使用ajax,所以可以考虑将ajax的代码提取到公共的js
* myAjax.js一定要移到jQuery.js的后面,其他js之前
* ------------------------------------------
* 对于后台管理系统来说,不能所有人都可以访问,必须登录
* 前端:不能让用户直接访问页面?
* 当用户访问页面的时候,判断用户是否已经登录即可?
* 判断登录用js来操作,因为每一个页面都有myAjax.js文件,则直接写到里面即可
* 怎么判断是否已经登录?登录或者没有登录应该有一个标识,
* 所以在登录成功以后可以设定一个标识符,在其他页面访问的时候,查看当前标识符是否存在即可
* 在其他页面如果拿不到标识符,则直接返回登录页面即可
* 一定不要在页面加载完成执行判断用户是否已经登录
* -------------------------------
* 对于有个别用户可以直接访问后台接口,也能做相应的操作,这也是不符合标准
* 所以在后台应该有一个登录标识,判断是否已经登录,而且应该拦截所有访问后台的接口地址
* 这里需要用到过滤器
* ---------------------------
* 对于session安全认证:前后端都必须判断是否已经登录
* -----------------------------------
* 模糊查询:
* 模糊查询条件:根据查询所有的展示数据来判断应该有哪些模糊查询条件
*
*/
/**
* 2023-2-20 富文本编辑器
* 1.引入wangeditor的js代码
* 2.复制html代码
* 3.在js里面添加加载富文本的js
* 1:修改连接后台的文件地址:const editUrl = '/upload';//服务器访问地址
* 2:要将传递到前端的地址进行回显到html:insertImg(url)//回显到富文本里面
* 4.对富文本进行取值赋值
* 1:取值:editor.txt.html();
* 2:赋值:editor.txt.html(data.content);
*--------------------------------------------------------
* 第四阶段js要用到的知识点;
* 1.数据类型
* 五大数据类型:数字,字符,对象,数组,布尔
* 数字对应Java的整数和小数
* 1)随机数2)取大取小
* 字符对应Java的String
* 1)字符串拼接 2)字符转换为数组 3)替换 4)startWith,endWith,contains
* 5)indexOf length 6)不区分单双引号
* 对象对应Java的类
* JSON对象{"key":"value"},普通对象{key:"value"}
* 数组对应Java的List<Object>
* let arr=[1,"a",true,[],{}];
* 布尔对应Java的布尔 true,false
* 2.语法结构 if else for
* 3.取得对象
* $("#id") 得到一个对象
* $(".className") 得到一组对象
* $("input[type=radios][name=hobby]") 得到一组对象
* 对于不唯一的,一组对象,则需要进行遍历
* array.each(function(index,obj){
* index //索引 o开始
* obj 对象
* })
* 4.方法:和Java一样 小驼峰命名 ,可以有返回值 ,还有参数,不用写数据类型
* function methodName(pramName){
* return value;
* }
* 5.注意加载顺序:
* 1)jquery.js
* 2) myAjax.js //里面有判断是否已经登录
* 3) layui.use([],function({}))
* 4) wangEditor.js
* 6.监听table,监听按钮
* 7.table.render({
* 8.文件上传
* 9.富文本
* 10.定时器
* ---------------------------
*前后端传值:以后无论哪种语言都固定为json对象
*
*/
/**
* 2023-2-21 第五阶段redis基础
* 1.定义是什么?
* 2.为什么要学?优势
* 3.可以应用在哪些地方?应用场景
* 4.怎么做?
* -------------------------------
* 思考?如果产品做一个秒杀事件,
* 假如有十万人同时抢产品,则会由十万人同时访问产品详细页面
* 以前页面上所有数据都来自于数据库,则数据库访问连接太多直接崩溃
* 只要第一个人访问数据库后,则不让后面的人访问数据库
* 第一个人访问后给一个标识符,并存入到某个地方,并且将刚刚访问的数据存起来
* 第二个人取访问的时候直接看是否由这个标识符
* 如果有,则直接拿到刚刚的数据
* 如果没有,则直接访问数据库
* CompanyModel companyModel=new CompanyModel();
* boolean isHave=redis.exist("companyModel");
* if(isHave){
* companyModel=redis.get("companyModel");
* }else{
* companyModel=companyDao.getCompanyModel();
* redis.set("companyModel",companyModel);
* }
* -----------------------------------
* 所以,如果管理员修改了数据库里面的信息,则应该删除redis关于companyModel里面的数据
* int count=companyDao.update(companyModel);
* if(count>0){
* redis.delete("companyModel");
* }
* --------------------------------
* 删除key值可以手动删除也可以设置过期时间
* 如果再次对同一个key进行赋值,则后面的会覆盖前面的值
* 一般情况下,key,value后面的值会覆盖前面的值;
* ------------------------------------
* list集合:
* 如果这个key存在,则一致会在list的末尾进行添加数据
* list如果要删除,则应该删除所有的key
* ------------------------------
* 第七阶段redis集成
* 1.导包
* 2.复制工具类 String List<String,String>,List<Object,Object>
*
*/
}