py-01-YongHe

 


目录:

day01:业务需求+开发环境

day02:HTML网页制作+CSS样式表+二维码

day03:动态技术J2ee Servlet+JSP

day04:mysql数据库+sqlyog的使用

day05: PowerDesigner的使用+Jdbc

day06:日期格式的转换和统一

day07:项目开发设计思路

Database:永和大王数据

FAQ:没有在WEB-INF\classes中生成class文件

 

 


day01:业务需求+开发环境

1.1      培优课程体系

py-01-YongHe_第1张图片

 

 

1.2  培优的就业数据

py-01-YongHe_第2张图片

py-01-YongHe_第3张图片

1.3软件开发

拿到一个项目如何开发呢?从哪里入手呢?具体的技术点如何实现呢?这就是我们这次要让大家体会的,不为你理解每个技术细节,这些后期课程中都会详细讲到。只为你有大的格局,你有清晰的目标,你有真实的体验。有所了解后踏实学习java培优的课程,它能支持你在这个日益竞争激烈的世界里,安身立命,实现梦想,过上好日子!

1.3.1    开发岗位

py-01-YongHe_第4张图片

 

1.3.2    软件开发流程

也称为软件开发生命周期:

l  意向

l  软件项目立项,立项报告,立项审批

l  需求调研,需求评审

l  概要设计,用例图,页面原型设计

l  数据库设计,表设计

l  详细设计,类设计

l  开发编码

l  需求变更

l  测试

l  试运行,bug满天飞(加班)

l  正式上线

l  维护期

l  项目完成

1.4      学到的技术点

1.4.1    Day01

l  Jdk的使用

l  Eclipse的使用

l  创建java工程

l  创建class

1.4.2    Day02

l  创建Web工程

l  HTML静态网页

l  CSS样式表

l  二维码

1.4.3    Day03

l  Eclipse中增加jdk支持

l  配置jdk

l  Eclipse中增加tomcat支持

l  配置tomcat

l  Servlet3.0 注解开发

l  Jsp页面

l  Pojo封装传递多个值

l  Jsp的安全访问

1.4.4    Day04

l  PowerDesinger

l  单表设计

l  数据库基本操作Dos

l  数据库基本命令Dos

l  SqlYog操作客户端

1.4.5    Day05

l  数据库导入、导出

l  关联表设计

l  Pojo对象关联

1.4.6    Day06

l  综合练习

1.5      永和大王门店管理系统

1.5.1    项目背景

py-01-YongHe_第5张图片

 

《永和大王门店管理系统》实现顾客进店后选择购买的套餐,并在系统中生成订单,包括:门店名称,门店电话,订单号,并记录下订单类型及人数和收银员是谁,及下单时间和结账时间,并记录订单详情,顾客点了哪些食物,支付方式以及支付总金额等信息,最终实现打印门店小票。同时,在订单下方展示本店的二维码,方便顾客扫描二维码自助填写税务发票信息等功能。

 

py-01-YongHe_第6张图片

 

1.5.2    还能实现什么?

票据打印

1.5.2.1         医药管理系统

 

py-01-YongHe_第7张图片

 

1.5.2.2         税务发票系统

py-01-YongHe_第8张图片

 

1.5.2.3         餐厅结账单

py-01-YongHe_第9张图片

1.5.2.4         德克士

py-01-YongHe_第10张图片

1.5.2.5         加油站

py-01-YongHe_第11张图片

1.6开发工具

1.6.1    必备的开发软件

l  PowerDesinger v15.1                                  数据库表设计&UML设计

l  mysql-5.5.27-winx64.msi                      mysql数据库

l  SQLyogEnt v8.2                                     数据库客户端

l  安装双jdk1.7 & jdk1.8                                  java环境

l  Eclipse Mars.2 Release (4.5.2)              IDE 开发工具,配置jdktomcat

l  安装Tomcat                                                  Web中间件,运行web程序

1.6.2    FTP下载资料

打开浏览器访问code.tarena.com.cn   账号:tarenacode   密码:code_2017

点击CGBCODE -- > 1805 à  按阶段下载资料。

1.6.3    PowerDesinger设计工具安装

py-01-YongHe_第12张图片

语言选择中文RPC,同意协议,其他一路next即可。

py-01-YongHe_第13张图片

 

1.7      Java开发环境安装

1.1.1  安装jdk并检验

点击Window窗口,输入cmd命令,回车。

 

py-01-YongHe_第14张图片

1.1.2  检查jdk版本

py-01-YongHe_第15张图片

1.1.3  常用DOS命令:

C:\Users\Administrator>d:        切换盘符,进度d盘

D:\>cd a                        进入a文件夹

D:\a>dir                       显示a文件夹下的所有文件

D:\a>cd ..                     返回上级目录

D:\a\b\c\d>cd /                返回根目录

1.8      第一个java程序HelloWorld

1.1.4  开发环境的准备

开发工具:eclipse

1.1.5  开发步骤

1.1.5.1     创建Java工程

 py-01-YongHe_第16张图片

 

 

 

1.1.5.2     创建HelloWorld

选中src,右键,new,class,..

 

py-01-YongHe_第17张图片

1.1.5.3     创建main方法

第一个段Java代码

package cn.tedu.hello;

//这个类用来做Java的第一个小程序

/**
 * public 是类的修饰符
 * class  用来定义一个类
 * HelloWorld  是类的名字
 */
public class HelloWorld {

  

   //Java中的入口程序,定义一个main方法(函数)
   /**
    * public 是方法的修饰符
    * static 是静态的,作为方法的描述信息,
    *          表示了一个静态方法
    * void   是指定方法的返回值为空
    * main   叫做方法名字
    * (String[] args)  叫做方法的参数
    * String[]   叫参数的类型
    * args    叫参数的名字
    * */
   public static void main(String[] args){

      /**
       * System 系统指令
       * out    让系统做一个输出的动作
       * println  换行打印
       * "hello world~~"   打印一个字符串("")
       * ;   java语句结束符
       *
       * 想要运行的话:
       * 空白处右键->run as --> java application
       */
      System.out.println("hello world~~");

   }

}


day02:HTML网页制作+CSS样式表+二维码

1   HTML网页制作

1.1    概述

超文本标记语言,标准通用标记语言下的一个应用。

超文本就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。

超文本标记语言的结构包括部分(英语:Head)、和主体部分(英语:Body),其中部提供关于网页的信息,主体部分提供网页的具体内容。

1.2    如何使用

1.2.1  创建动态web工程

 py-01-YongHe_第18张图片

 

 

py-01-YongHe_第19张图片

1.2.2  创建order.html

WebContent下创建,选中WebContent,右键,newhtml,order.html





   
      
      永和大王
   

  
   
      
顾客联
      
请您留意取餐账单号
      
自取顾客联
      
永和大王(北三环西路店)
      
010-62112313
      
--结账单--
      
账单号:P000009
      
账单类型:堂食
      
人数:1
      
收银员:张静
      
开单时间:2018-04-17 07:24:11
      
结账时间:2018-04-17 07:24:22
           
            
                                                                                                                                                                                                                                                                                                                                                                               
数量品项金额
1豆浆油条套餐7.00
 1 X --非矾油条 
 1 X --现磨豆浆(热/甜) 
      
           
            
                                                                                                                                                                                                                                                                                                                                                                                                   
支付宝花呗一元早餐1-3.00
合计 4.00
支付宝 1.00
支付宝补贴 3.00
      
        
      
打印时间:2018-04-17 07:24:23
      
            
         根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,       如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引       步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持       小票平整。       
      
                
            
官网:www.yonghe.com.cn
      
         加盟热线:86-21-60769397          或 86-21-60769002       
   

 

 

2   CSS样式表

2.1    概述

层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。

2.2    如何使用

2.2.1  Html网页中内嵌css代码

缺点:使网页的结构看起来十分混乱。不易后期维护。




   
      
      永和大王
 
      
      
  
   

  
   
      
顾客联
      请您留意取餐账单号
      自取顾客联
      
永和大王(北三环西路店)
      
010-62112313
      --结账单--
      账单号:P000009
      
账单类型:堂食
      
人数:1
      
收银员:张静
      
开单时间:2018-04-17 07:24:11
      
结账时间:2018-04-17 07:24:22
                        
                                                                                                                                                                                                                                                                                                                                                                                       
数量品项金额
1豆浆油条套餐7.00
 1 X --非矾油条 
 1 X --现磨豆浆(热/甜) 
      
                         
                                       支付宝花呗一元早餐                 1                                                                                                                                                                                                                                                                                                                                                
-3.00
合计 4.00
支付宝 1.00
支付宝补贴 3.00
      
                   
打印时间:2018-04-17 07:24:23
                        根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,       如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引       步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持       小票平整。       
            
                
            
官网:www.yonghe.com.cn
      
         加盟热线:86-21-60769397          或 86-21-60769002       
   

 

2.2.2  Css代码提取到base.css文件里

HTML代码和css代码分隔。

body {
   font-size: 8px; /*设置字体大小*/
   width: 260px; /*设置网页宽度*/
   margin: 5px; /*设置内容和边框的距离*/
}

.please {
   font-size: 28px;
}

.me {
   padding-left: 60px; /*设置字和左边的距离*/
}

.note {
   text-indent: 20px; /*设置首行缩进*/
   padding-top: 15px; /*保持上边距5px*/
   padding-bottom: 15px; /*保持下边距5px*/
}

2.2.3  网页中引入外部的css文件




   
      
      永和大王
  
      
           
      
  
   
  
   
      
顾客联
      请您留意取餐账单号
      自取顾客联
      
永和大王(北三环西路店)
      
010-62112313
      --结账单--
      账单号:P000009
      
账单类型:堂食
      
人数:1
      
收银员:张静
      
开单时间:2018-04-17 07:24:11
      
结账时间:2018-04-17 07:24:22
                  
                                                                                                                                                                                                                                                                                                                                                                                       
数量品项金额
1豆浆油条套餐7.00
 1 X --非矾油条 
 1 X --现磨豆浆(热/甜) 
      
                         
                                       支付宝花呗一元早餐                 1                                                                                                                                                                                                                                                                                                                                                
-3.00
合计 4.00
支付宝 1.00
支付宝补贴 3.00
      
                   
打印时间:2018-04-17 07:24:23
                          根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,       如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引       步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持       小票平整。                    
                
            
官网:www.yonghe.com.cn
      
         加盟热线:86-21-60769397          或 86-21-60769002       
   

 

 

3   创建二维码

维码又称二维条码,常见的二维码为QR CodeQR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

3.1    导入jar

py-01-YongHe_第20张图片

 

 


 

3.2    创建QR

 

3.3    创建create方法

package cn.tedu.qr;
 
import org.junit.Test;
 
/*
 * 这个类用来创建二维码
 */
public class QR {
  
   //创建单元测试的方法create
   @Test//选中方法名,右键,run as,junit test
   public void create(){
      //指定二维码图片的宽度
      int width=150;
     
      //指定二维码图片的高度
      int height=150;
     
      //指定二维码图片的内容
      String content="www.baidu.com";
     
      //指定二维码图片的存放位置
      String path = "e:\\qr.png";
     
      //调用Google的方法,用来产生二维码
      CreateQR.create(
            width,
            height,
            content,
            path);
     
      //打印
      System.out.println("二维码生成成功!!");
   }
 
}

 

3.4    产生了二维码的图片

把指定路径下产生的二维码图片,复制到项目中。

放在WebContent/qr.png

 

py-01-YongHe_第21张图片

3.5    改造order.html



 
   
      
      永和大王
  
      
           
      
  
   
  
   
      
顾客联
请您留意取餐账单号
自取顾客联
永和大王(北三环西路店)
010-62112313
--结账单--
账单号:P000009
账单类型:堂食
人数:1
收银员:张静
开单时间:2018-04-17 07:24:11
结账时间:2018-04-17 07:24:22

数量 品项 金额
1 豆浆油条套餐 7.00
  1 X --非矾油条  
  1 X --现磨豆浆(热/甜)  

支付宝花呗一元早餐 1 -3.00
合计   4.00
支付宝   1.00
支付宝补贴   3.00

打印时间:2018-04-17 07:24:23

根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期, 如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引 步骤开具您的增值税电子普通发票。此二维码30天内有效,扫描时请保持 小票平整。
官网:www.yonghe.com.cn
加盟热线:86-21-60769397 或 86-21-60769002

 

 

3.6    改造base.css

body {
   font-size: 8px; /*设置字体大小*/
   width: 260px; /*设置网页宽度*/
   margin: 5px; /*设置内容和边框的距离*/
}
 
.please {
   font-size: 28px;
}
 
.me {
   padding-left: 60px; /*设置字和左边的距离*/
}
 
.note {
   text-indent: 20px; /*设置首行缩进*/
   padding-top: 15px; /*保持上边距5px*/
   padding-bottom: 15px; /*保持下边距5px*/
}
 
.qrimg{
   text-align:center;/*设置图片居中*/
}

3.7    效果

py-01-YongHe_第22张图片

4   Eclipse中配置tomcat

4.1    Eclipse配置tomcat插件

 py-01-YongHe_第23张图片

 

py-01-YongHe_第24张图片

4.2    展示server窗口

py-01-YongHe_第25张图片

 

 py-01-YongHe_第26张图片

 

4.3    发布项目到tomcat服务器

py-01-YongHe_第27张图片

4.4    启动服务器

py-01-YongHe_第28张图片

 

4.5    关闭服务器

 

 

4.6    测试

访问:http://localhost:8080/项目名称/资源名称

如:http://localhost:8080/day02/order.html

 

5   Eclipse中配置jdk

 py-01-YongHe_第29张图片

 

 

py-01-YongHe_第30张图片

 

 

 py-01-YongHe_第31张图片

 

 

 

 


day03:动态技术J2ee Servlet+JSP

知识回顾:

3w1h,对每个知识点要why?

静态页面技术HTML

 标识这个文件是一个HTML文件
 标识一个html文件内容开始
 头信息,
 告诉浏览器我的编码utf-8
 链接样式表
永和大王门店管理信息系统 在浏览器上显示的标题
 头信息结束
 业务的内容
 
顾客联
请您留意取餐账单号
在div属性中加入class属性,这样要在css文件中去定义这样一个样式,.please{},然后加载样式表后div就被渲染
自取顾客联
永和大王(北三环西路店)
010-62112313
--结账单--
样式表定义一个样式,多处使用,如果需要变化,修改一处即可。复用!
账单号:P000021
账单类型:堂食
人数:1
收银员:朱晓侠
开单时间:2018-04-27 07:36:05
结账时间:2018-04-27 07:38:11

hr是一根直线,线型:直线、虚线、点线 css规范中都有相应名称 直线solid,虚线dashed
表格的开始 一行 一列,style=”width:40px;” 在html规范中字符串表达,支持双引号也支持单引号 表格中某个td设置宽度后,其他对应这列的td的宽度会随着改变 align水平方向对齐left/center/right align水平对齐,valign垂直方向对齐top/center/bottom 设置水平对齐和垂直对齐这只对当前的单元格起作用!
数量品项 金额
4 香菇菜包套餐-ECS


后面的标准,换行在txt中就是换行\r \n不可见字符,HTML都是可见的 4 X --香菇菜包
4 X --现磨豆浆(热/无糖)
28.00
2 非矾油条 10.00
2 鲜肉小馄饨 20.00

合计 56.00
微支付 58.00

打印时间:2018-04-27 07:38:12

       根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天有效,扫描时请保持小票平整。
特殊字符在html中需要单独标识,如果在html有多个空格,html解析时把多的空格就删除了。特殊字符转换,空格转换 ,转换的字符&作为开始;分号作为结束 src执向图片文件
官网:www.yonghe.com.cn
加盟热线:86-21-60769397 或 86-21-60769002
html文件内容的结束位置

Table标签和div差异

  1. 早期系统table布局,自适应;现今使用div+css布局,样式更加灵活,美观

  2. Table布局造成页面加载时,如果这个table很大,只有读取到table的结束标签之后,浏览器才会把这部分展现。短暂白屏,才会全部展现。

  3. Div出现后,div结束的标签浏览器就会直接展现。

表格常用标签

                   

      直接利用别名来获取属性值

                   

                   

         

         

     合计就是el表达式

小结:

  1. 和数据库进行查询,查询3次,查询出某个订单,通过这个订单获取door_id,通过door_id获取它门店对象信息,然后在通过订单orderId去找所属的订单详情的一个集合List集合。

  2. 数据库查询后的返回值

Door door = new Door();

door.setDoorName(rs.getString(door_name));

List odList = new ArrayList();

while(rs.next()){

OrderDetail orderDetail = new OrderDetail();

orderDetail.setNum (rs.getInt(num));

。。。。

odList.add(orderDetail);

}

return odList;

Order order = new Order();

while(rs.next()){

     order.orderNo(rs.getString(order_no));

}

//关联/绑定,订单和门店关系

Door door = getDoor(order.doorId);   从数据库查询出当前订单对应门店

order.setDoor(door);

//关联/绑定,订单和订单详情的关系

List odList = getOrderDetails(order.id);

order.setOrderDetails(odList);

pojo

Door

     private Integer id;

     private String doorName;

     private String tel;

OrderDetail

     private Integer id;

     private Integer num;

     private String item;

     private Double price;

//最复杂,多一个对象关联关系

Order

     //一个订单对应一个门店,对一

     private Door door;

     //一个订单对应多个订单详情,对多

     List orderDetails;

     private Integer id;

     private String orderNo;

     .

 

 

 

 


day07:项目开发设计思路

 

知识回顾:

  1. 体现面向对象

Java面向对象开发语言,组织数据结构时和面向过程不同。

实现数学函数,1+1=?思考:x+y=结果,x=1,y=1,1+1=2。顺序思考,只考虑当前一个情况,其他的情况完全不考虑。

SQL,典型面向过程,

查询所有,x=table,y=字段

select id,name from tb_door;

只查询大钟寺门店

select * from tb_door where id=1;

面向对象,pojo组织它考虑非常多并不完全只为满足眼前的需求。

Door

private Integer id;

private String doorName;

private String tel;

面向对象不完全从需求出发,当前的需求出发。它只关心本身这个对象应该有哪些,而不关心是否立即能用到这些内容!

需求改变:

只前用户是不需要id的,但是他突然觉得想在页面上展示id信息。

如果是面向过程,修改原始代码!(pojo,rs也需求修改,页面改变)

如果是面向对象,修改量变小了(页面改变)

面向对象在思考时考虑比较多,但是这样的好处在用户需求变更下,修改的代码量非常小。

Pojo对象关联

订单和门店,多对一,pojo Order 对一      Door door;

订单和订单详情,一对多,pojo Order 对多  List orderDetails/odList

怎么完成整个流程?

  1. 从数据库查询数据,放到pojo对象中

  2. 从数据库分别查询订单,门店,某个订单详情,3次

  3. 把它们设置到对一pojo对象中

Order order = new Order();

order.setOrderNo(rs.getString(order_no));

//对一

Door door = getDoor(orderId);    //从数据库查询数据放入door pojo对象中

order.setDoor(door); //绑定,关联关系

//对多

List odList = getOrderDetail(orderId);

数据库的处理

List odList = new ArrayList();  //创建完成是一个空数组

while(rs.next()){

   OrderDetail od = new OrderDetail();

     od.setNum(rs.getInt(num));

     odList.add(od);     //把每个对象加入到数组中

}

order.setOrderDetails(odList);

  1. 把pojo传递给jsp

  2. 在jsp中以el表达式,jstl标签库(更复杂)展现

自己总结文档,

典型案例:

  1. 一对一,单个对象

  2. 一对多,多个对象关联

  3. 门店,订单,订单详情;学校,班级,学生

  4. 日期处理

  5. 合计

永和门店系统开发过程:

  1. 需求调研《需求说明书》

  2. 设计阶段,概要设计《概要设计说明书》,继续细化《详细设计说明书》,PowerDesinger表设计

  3. 开发,编码,调试(最耗时)

  4. 测试

  5. 维护

  1. 表设计

根据页面获取动态信息,静态直接写死在页面,而动态内容通过数据库维护。

py-01-YongHe_第109张图片

py-01-YongHe_第110张图片

PowerDesigner进行表设计,直观,方便修改,生成建表语句

py-01-YongHe_第111张图片

  1. 开发

开发步骤:

py-01-YongHe_第112张图片

  1. 利用表设计创建数据库和表,录入测试数据(正规)

  2. 先创建pojo对象,Door,OrderDetail,Order

  3. Pojo,3点:属性,get,set

  4. 对象关联

Order

对一,private Door door;

对多,List orderDetails

  1. 创建OrderServlet,使用jdbc访问数据库,把数据封装到pojo对象中(pojo传递数据)

  2. 创建jsp页面,直接使用美工给的样式表,在页面中通过el表达式来获取数据

  3. 对日期和c:forEach循环标签来实现日期和合计特殊处理

  4. 测试,访问servlet,获取数据后转向jsp,最终在浏览器上展现

py-01-YongHe_第113张图片

完成一个大任务时,不要一口气所有代码都写完,再运行,就会出现很多bug,太多时你就不好判断是哪里的问题?一块能独立运行就测试一块,完成后,再继续写下一块的内容。

导入jar包:

  1. 数据库mysql支持包

  2. 二维码2个文件,j2se,core

  3. jstl.jar

cn.tedu.yhmis.pojo.Order@3da94292       order内存地址

cn.tedu.yhmis.pojo.Door@50408f59        door内存地址

大钟寺北三环店


永和大王数据:

mysql:

/*==============================================================*/

 tb_door表

 

,th等价于tr,th专用于表头

HTML标签区分大小写吗?不区分

Java区分大小写吗?严格区分大小写

CSS区分大小写吗?严格区分大小写,自己写时习惯小写

  1. 样式美化CSS样式表

@CHARSET "UTF-8";       标识这个css样式字符集utf-8

body{                    全局的使用,指定标准的标签

         font-size:8px;         字体的大小,8个像素;以分号结束

         width:280px;          宽度,width:280px; width:90%;

}

.please{ font-size:28px; }

.me{ padding-left:100px; }   

py-01-YongHe_第32张图片

.line{ border:dashed 1px;} border边线,dashed虚线 1px1个像素的宽度

.note{ padding-top:15px; padding-bottom:10px; } 上边空15个像素,下边空10个像素

.qrimg{ padding-left:60px; }

样式有三种方式

  1. (系统有一个全局的样式表)全局的标准标签body,table,tr

  2. (用的最多)在页面的标签上class=me,在样式表中.me{},局部修饰,可以多次调用,重用/复用

  3. (form表单使用)在页面的标签上id=me,在样式表中#{},局部修饰,至少在这个页面中应该保证使用一次

  1. 二维码

直接应用,java培优非常好学,这些东西都是高手写出来,在市场上广泛使用。它的稳定性,性能,安全等等指标,经过千锤百炼!拿来主义,只应用!(适应初级程序员)

Nginx(c),Redis(c),mycat+mysql阿里,rabbotmq(erlang并发,爱立信出品,在银行业和电信业广泛使用)、微服务dubbo(java)阿里、docker(go并发)容器化技术

Hadoop离线分析(java)Spark(实时分析)(scala,下一代java)jdk1.8引入函数式编程

二维码应用

  1. 图片高度和宽度

  2. 生成图片路径

  3. 调用谷歌第三方jar,有两个jar包:放在WebContent/WEB-INF/lib

core-3.3.2.jar\com\google\zxing

javase-3.3.2.jar\com\google\zxing

执行程序的方式:

  1. main函数,public static void main(String[] args){},在main还有static,运行java application

  2. @Test junit单元测试,运行Junit Test,在一个类中可以写多个@Test

@Test

public void getValue(){}    普通方法

解决未知技术应该怎么做呢?

  1. 问人,问同事,问技术好

  2. 百度,推荐demo,如果技术难度比较大,不做读百文多看评论CSDN

  3. 官网,规范,严谨; 不好的地方,写文档的人还不如普通的开发者!

  4. 书,太多垃圾,断片;看补足底蕴。会讲很多理论。

今天任务:

  1. 动态技术J2ee Servlet+JSP

Servlet被SpringMVC Controller

Servlet3.0会使用注解方式 @Web 标签

JSP(用的最多的标签就是HTML标签),EL(${name})+JSTL(taglib c:forEach做循环),

2)创建JavaWeb项目,配置自己的jdk,Servlet和jsp是有运行环境的?Web中间件Tomcat

环境配置:

  1. jdk,怎么给我们的项目指定jdk?

Jdk现在有多个版本,jdk1.4,目前jdk1.7,趋向jdk1.8

jdk1.9,jdk1.10,jdk1.11,宣布废弃java

企业追求什么样的技术?

  1. 最新技术

  2. 最稳定、安全的技术(企业最喜欢)

企业技术落伍

JavaWeb项目?怎么配置jdk的?

要把jdk放在一个目录

目录要求:a.不能有空格(新版本的jdk是支持),b.不能有中文

安装版,一路next,存在系统文件夹中,它中间有空格

D:\java\env

绿色解压版,D:\java\env\jdk1.7.0_72

给eclipse配置jdk版本

py-01-YongHe_第33张图片

如果没有jdk1.7就给它添加

py-01-YongHe_第34张图片

D:\java\env\jdk1.7.0_72

点击add,选择根目录即可,它会自动填写其他的内容

py-01-YongHe_第35张图片

py-01-YongHe_第36张图片

如果项目已经存在,要使用新的jdk怎么处理?

要修改3处

py-01-YongHe_第37张图片

py-01-YongHe_第38张图片

py-01-YongHe_第39张图片

编译java保存后eclipse会自动调用编译方式就把java文件形成class文件。

还需要配置编译时的Java的版本

py-01-YongHe_第40张图片

修改第三处

py-01-YongHe_第41张图片

为什么我们要改这么多处?

Eclipse插件机制,base基础,其它公司可以在这个的基础上增加插件按它的规范编写代码,扩充它的功能。

很多公司的很多的插件。

配置Web中间件Tomcat

Eclipse做的不好用,配置非常啰嗦,

  1. 有一个单独的窗口来管理Servers

py-01-YongHe_第42张图片

  1. 主流tomcat7怎么配置它,要增加到eclipse

  2. 把tomcat7和项目yh绑定,运行Servlet就放在指定tomcat中运行

没有有效server,没有一个可用server。

py-01-YongHe_第43张图片

py-01-YongHe_第44张图片

py-01-YongHe_第45张图片

py-01-YongHe_第46张图片

py-01-YongHe_第47张图片

py-01-YongHe_第48张图片

配置当前项目到tomcat中

py-01-YongHe_第49张图片

先选中项目yh,点击add按钮,把项目添加到tomcat中,

这样在tomcat运行时就会自动启动yh项目,这样可用执行Servlet和JSP。

py-01-YongHe_第50张图片

py-01-YongHe_第51张图片

如果已经有tomcat启动,就会报端口冲突

py-01-YongHe_第52张图片

py-01-YongHe_第53张图片

Eclipse给我们提供了更加方便的修改server.xml的方式

py-01-YongHe_第54张图片

修改3个端口8005,8080,8009,一般加10

访问文件的方式:

file:///D:/java/ws/jt/yh/WebContent/HelloWorld.html

通过网络的方式:

http://localhost:8090/yh/HelloWorld.html

http网络协议

localhost本机,测试,ip地址,域名

8090端口号,找到tomcat

yh是项目名称

HelloWorld.html 在WebContext下

py-01-YongHe_第55张图片

http://localhost:8090/yh/img/qr.png

http://localhost:8090\\yh\\img\\qr.png(不要使用)

它们之间怎么隔开的,用户/

开发步骤:

  1. 保证你有一个绿色解压版的Jdk

  2. 解压到硬盘D:\java\env\D:\java\env\jdk1.7.0_72

  3. 把jdk和eclipse关联起来

  4. 把配置的jdk和项目关联起来

把tomcat配置开发步骤:

  1. 把绿色解压版解压apache-tomcat-7.0.59

  2. 把tomcat和eclipse关联

py-01-YongHe_第56张图片

  1. 把tomcat和yh项目关联

运行环境Servlet,JSP

  1. Servlet2.3,SpringMVC Controller

  2. Servlet3.0 注解方式(京淘)@Web

  3. 利用eclipse创建Servlet

py-01-YongHe_第57张图片

py-01-YongHe_第58张图片

py-01-YongHe_第59张图片

如果有错,是不能运行的,意味着必须先把所有的错误解决。

错误分为两种:

  1. 编译错误,保存文件时,自动去进行编译

  2. 运行时错误,运行时访问、调用才出错

py-01-YongHe_第60张图片

Javax,jdk,j2ee中规定它行为,没有具体去实现,

交给第三方的Web中间件厂商去实现。

是第三方的就需要导入jar包。

py-01-YongHe_第61张图片

怎么和我们的项目yh关联?

如果把servlet-api.jar直接放入到WebContent/WEB-INF/lib下

在tomcat启动后它就会发现有两个这个jar包,一个在上面项目中,一个在自己的lib目录中,它该调用谁?

它无法解决,就报错。

正确的姿势:

py-01-YongHe_第62张图片

py-01-YongHe_第63张图片

py-01-YongHe_第64张图片

  1. 在控制台上打印Hello Servlet字符串

py-01-YongHe_第65张图片

         protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                   // TODO Auto-generated method stub

                   response.getWriter().append("Served at: ").append(request.getContextPath());

                   System.out.println("Hello Servlet");

         }

  1. 在浏览器上怎么访问

保证项目发布到tomcat中

启动tomcat服务,手动启动(推荐:debug模式)

在浏览器上访问

http://localhost:8090/yh/HelloServlet

注意Servlet它特殊,它就不需要后缀

py-01-YongHe_第66张图片

py-01-YongHe_第67张图片

py-01-YongHe_第68张图片

什么样的第三方jar使用拷贝jar到WEB-INF/lib下?

什么样的第三方jar使用项目的引用新增额外jar包?

Servlet.jar引用lib下,是不会被拷贝到最终的tomcat中,它只在eclipse中使用。

二维码,tomcat中有吗?没有,必须放在WEB-INF/lib

剖析servlet3.0结构:

1)@WebServlet("/HelloServlet") 注解

@WebServlet规范中的,目的就是把后面的字符串作为,在浏览器访问时路径值

http://localhost:8090/yh/HelloServlet

py-01-YongHe_第69张图片

2.JSP

最早j2ee规范中只有servlet,

简化 HTML标签这种内容

py-01-YongHe_第70张图片

http://localhost:8090/yh/HelloServlet

jsp访问地址

http://localhost:8090/yh/helloWorld.jsp

http://localhost:8090/yh/WEB-INF/helloWorld.jsp

放在WEB-INF下的文件不能浏览器直接访问

在外面WebContext这个文件能否直接访问?能

jsp对于html,通吃!html内容在jsp中完全通用。

需求:在jsp中店名变成动态

开发步骤:

  1. 准备数据(准备店名)

  2. 在jsp中获取并展现这个信息

比较

  1. Html 纯静态,不可改变

  2. Servlet 后台运行,访问数据库获取数据

  3. Jsp 负责展现,把html都拿过来,然后加动态支持el表达式(${name})

小结:

  1. HTML静态网页,通过很多预定义标签

    ,展示了一个网页,和txt纯文本?txt是只是数据没有修饰,静态网页,可以通过标签+css样式修饰实现页面更加美好,txt不支持图片,HTML图文并茂

  2. HTML缺点,一旦写死就不能变化。出现动态页面技术纯Servlet,里面使用的java语句。

  3. Servlet它要加html标签,代码太混乱,工作量大,重复代码。出现jsp技术

  4. Jsp页面全部包容html标签,额外增加了一些el表达式${doorName}

Servlet中:

String doorName = 大钟寺店;

request.setAttribute(doorName,doorName);

转向Order.jsp

Jsp中:

Jsp页面可以获取到request对象,这个中放置doorName

Order.jsp加载时看${doorName}

这个内容就会找request中有没有doorName,就把对应值获取到。

内容就可以动态来实现

总结:servlet加工获取数据(业务逻辑)

环境配置:

在eclipse中配置jdk和tomcat

  1. jdk安装版1.8

1.7 add(arg01,arg02)

1.8 add(arg01,arg02,arg03)

1.7 update()  删除线,过期,在后期版本中就可能删除掉

1.8 没有update方法了,

在实际开发中,会规定项目的版本

在实际开发中,项目的jdk版本能升级吗?dubbo

  1. 怎么指定eclipse对应的jdk版本?

  1. 在eclipse环境中配置jdk1.7

  2. 把配置的jdk和项目yh关联

C:\programe files\java

Java代码解析,c:\\programe%20files\java

  1. 怎么指定eclipse对应tomcat版本?

Tomcat称为web中间件,支持servlet和jsp运行。不管旧三大框架struts2+spring+hibernate,新三大框架springmvc+spring+mybatis都是在servlet和jsp技术上发展起来的。

  1. 给eclipse配置一个tomcat

  2. 把tomcat和项目关联

  3. 访问

http://localhost:8090/yh/Order

http://127.0.0.1:8090/yh/Order

  1. 创建Servlet3.0 引入注解@WebServlet(/Order

  2. Servlet就按java代码来编写,写业务逻辑(加工过程)

py-01-YongHe_第71张图片

py-01-YongHe_第72张图片

作业:

  1. 再安装一个jdk1.9

  2. 再安装一个tomcat8

  3. 写一个servlet3.0

  4. 写一个order.jsp

  5. 把html和servlet+jsp请求过程画图

 

 

 


day04:mysql数据库+sqlyog的使用

知识回顾:

  1. Jdk 一台机器上可以安装多个版本的jdk。企业中有很多项目,旧的项目需要维护jdk1.6;开发新的项目jdk1.7。配置eclipse指定jdk。项目在开发时就会使用我们指定版本。

在eclipse怎么项目的jdk环境?

javaWeb配置3处:a.Build Pach,b.Compile编译,c. facets(每个功能是不同厂家完成,每个厂家的工具(eclipse 插件)都有自己的配置)

  1. Tomcat web中间件,支持servlet和jsp的运行环境。

Javax,java扩展,很多就不是java自己实现,java只是定义规范,其他厂商为了使用这个东西,就要按照规范来写一个实现。

Tomcat就实现Servlet规范

  1. 把它在eclipse中创建

  2. 我们要把tomcat和项目关联

  3. 启动tomcat,tomcat就会运行相关项目(部署、发布)

  1. Servlet

动态,可以执行业务逻辑,加工处理

利用eclipse来创建一个Servlet3.0类,利用eclipse提供模板

特点:

  1. 在它的类上有一个标识,称为一个注解@WebServlet,注解中有一个字符串,和类名完全一致,但是/HelloServlet。

  2. 类有doGet(直接在浏览器上输入地址),doPost(表单,登录)

  3. 总有两个参数HttpServletRequest request请求,HttpServletResponse response响应

  4. 返回request.getRequestDispatcher("Order.jsp")

            .forward(request, response); 通过request和response对象给jsp传递值

  1. 传值 request.setAttribute(key,value); key唯一,value随便

  1. Jsp

负责数据最后展现

  1. 完全兼容所有的html标签+css

  2. 它可以通过servlet准备数据,在jsp中利用EL表达式${doorName},它内部就去遍历request,找key 为doorName的,如果有就返回它里面的值,如果没有就不抛出错误,直接显示空。

  3. 特点就是动态,它的值可以变化。而html写死。

扩展:

Jsp文件放入到WEB-INF目录下,还能直接访问吗?

http://localhost:8090/yh/WEB-INF/Order.jsp j2ee Servlet规范放在WEB-INF下的文件不允许用户直接在浏览器上访问!保证某些信息不对外公开,安全性。

利用这个目录的特性把一些不需要对外直接展示jsp就放在其中。(工资条)主流项目都是这样。

改造让jsp不允许直接访问,根据安全!

Servlet可以访问WEB-INF下的jsp资源,因为进入Servlet中,如果需要可以进行权限校验。

开发步骤:

a.)servlet中修改,修改路径:/WEB-INF/views/Order.jsp

b.)把jsp扔到上面目录中

servlet中如果数据写死,还没有html写死方便呢?

怎么体现servlet动态呢?

Servlet是可以做到的,但是它自己不能独立完成,需要数据库来管理数据,它从数据库获取数据。

今日任务:

  1. 数据库,主流数据库mycat+mysql免费(开源),Oracle(性能最好的,收费),sqlServer(最好用好,性能,安全性都一般,闭源)

  2. Mysql基础操作,CRUD,信息维护,增删改查

  1. 数据存储的地方,数据库

概念:

a. 数据库database简称db,存放数据,创建store-yh

b. 表 table,门店信息tb_door,订单信息tb_order

c. 字段(列)colume

     大钟寺店        doorname,类型:varchar;长度:200

     086-010-48428920        tel,   类型:varchar;长度:20

1    大钟寺店    010-48428920    

2    火车南站店  010-48428920

d. 主键 primary key,记录唯一性,或者唯一代表这条记录

自增1,2,3,有唯一性

Mysql数据库,维护数据

开发步骤:

  1. 有mysql数据库程序服务端

  2. 创建一个数据库store-yhmis,乱码utf-8

  3. 创建一张表tb_door(设计习惯tb_前缀),创建时指定字段,类型,长度,主键

  4. 新增数据Insert

  5. 修改数据(修改电话)Update

  6. 信息无用,删除 Delete

  7. 查询 Select

常用dos命令:

1)cd .. 向上退一层

    cd . 查看当前目录

2)cd tony 进入到tony目录中

    进入有空格的目录C:\>cd "Program Files"

3)cd / 从任何目录直接返回到根目录c:d:e:

4)切换盘符d:(只在window中,linux root)

5)dir列当前目录下子目录和文件

6)mkdir创建目录

py-01-YongHe_第73张图片

如果机器上有mysql怎么知道呢?

mysql -uroot -proot

mysql代表mysql.exe执行程序,数据库给我们提供客户端工具

-u参数,username用户名,后面紧跟用户名,当mysql安装时默认用户名,叫root

-p参数,password密码,设置密码

常用数据库命令:

数据库中命令是以分号结尾

  1. exit;        退出mysql数据库环境

  2. mysql中有哪些数据库?

py-01-YongHe_第74张图片

怎么创建自己的数据库呢?解决乱码问题?

create database yh; 

创建完数据库是有问题的,中文存入会乱码。

创建数据库时要设置字符集

create database yh default character set utf8;

创建一个yh数据库,并且设置它的字符集为utf8;

不设置字符集,mysql默认它的字符集lantin1,相当于网页ISO-8859-1

打开要使用的数据库

打开yh数据库,后面的操作就都针对这个数据库

use yh;

创建表table(复杂),指定字段,类型,长度

create table tb_door(id int,door_name varchar(200),tel varchar(20));

创建tb_door表,表有3个字段,id主键字段类型int,door_name字段类型varchar(200),tel varchar类型,20长度。

展现当前数据库中所有表

show tables;

删除数据库

drop table tb_door;  

 展示表的结构

desc tb_door;  

创建表,并且设置主键

create table tb_door(id int,door_name varchar(200),tel varchar(20),primary key(id));

show tables;

desc tb_door;

py-01-YongHe_第75张图片

create table tb_door(id int auto_increment, door_name varchar(200), tel varchar(20), primary key(id));

设置id列为自增和主键

插入数据

insert into tb_door(door_name,tel) values(‘dzs’,’110’);

insert into关键字 values关键字

tb_door表

(字段)

values(多个值,用逗号隔开)

如果是字符串,必须用单引号包括起来

常用SQL语句

SQL语句不区分大小写。

习惯:

关键字大写,其它内容小写

SELECT * FROM tb_door           sqlserver/mysql

关键字小写,其它的内容大写

select * from TB_DOOR           oracle

习惯:

都小写

1.创建数据库

create database yh; 

默认是lantin1字符集和网页ISO-8859-1

create database yh default character set utf8;

设置创建数据库时指定编码,支持中文了。

2.查询mysql中所有的数据库

show databases;

3.打开指定数据库

use yh;

4.创建数据库表

create table tb_door(id int,door_name varchar(200),tel varchar(20));

tb_作为前缀,标识它是一个table

create table tb_door(id int,door_name varchar(200),

tel varchar(20),primary key(id)); 

指定id为主键

自增主键,int整形,数据库底层它会记录下当前值

每次用户新增记录,加+1,返回当主键(非常多,电商表)

流水号

create table tb_door(id int auto_increment,door_name varchar(200),

tel varchar(20),primary key(id));

5.插入数据

insert into tb_door(id,door_name,tel)

values(10,’大钟寺门店’,’110’);

字段名称和java不一样,要大写都大写oracle,要小写都小写mysql

多个单词之间下划线隔开

5.查询数据

查询所有的数据

select * from tb_door;

7.特殊SQL

drop database yh;    删除yh数据库

drop table tb_door; 删除表tb_door

show create table tb_door; 查看创建表的sql语句

desc tb_door;    查看表的结构

修改信息

把tb_door中id=1数据它的电话修改为112

update tb_door set tel=’112’ where id=1;
  1. 备份数据,测试库

  2. 写update SQL时先写where条件

update tb_door set tel=’110’ where id=1;

update tb_door set tel='119',door_name='火车南站' where id='1';

设置多个字段,用逗号隔开

update tb_door set door_name='大钟寺',tel='110' where door_name='dazhognsi' and tel='112';

多个字段用逗号隔开

如果在where条件中多个条件并列使用and

火车票订票12306

Ticket 1张

用户1,1,支付,支付成功买到了票,总票数=0

用户2,0,不能买

高并发情况下,同时很快去操作

用户1,1,支付,啰嗦,密码试了几次,终于找到了,

在用户1尝试过程中,用户2查表,1,动作快,直接支付,总票数1-1=0

用户1密码成功了,开始支付,但是它会没票

多限定了一个where条件,把要修改的旧的值作为一个where条件

Where id=1 and tel=001,当其他用户提交,它再提交

但是数据已经发生变化,所以执行SQL成功,但是没有数据发生变化。

删除

更要先写where条件

delete from tb_door;        删除tb_door表的所有数据

delete from tb_door where id=1;    只删除id=1的记录

delete from tb_door where id=1 and tel=’003’; 并列删除条件id=1和tel是003的

对于null有特殊的语法,is null

delete from tb_door where tel is null;

删除门店为dzs的或者电话为119的

delete from tb_door where door_name='dzs' or tel='119';

排序:

select * from tb_door order by tel desc;按电话号码倒序,null最后

select * from tb_door order by tel [asc];   默认正序,null排第一

Dos窗口方式

在生产环境中,不允许使用其他的软件从远程接入

也不允许在生产环境中的机器上随便安装软件

需要安装mysql

只能mysql客户端mysql.exe,它可以本地访问。

在实际开发过程,安装测试服务器上,测试库。

Mysql数据库客户端程序,sqlyog/navcat第三方工具

py-01-YongHe_第76张图片

py-01-YongHe_第77张图片

常见问题:

  1. 端口号,安装时配置,别人要告诉你(系统管理员)

  2. Mysql服务没有启动

py-01-YongHe_第78张图片

查看服务,如果未启动,手动启动即可

  1. 删除数据库

py-01-YongHe_第79张图片

py-01-YongHe_第80张图片

注意创建数据库时,如果有中文,必须设置字符集为utf-8;

创建数据库

py-01-YongHe_第81张图片

创建表

py-01-YongHe_第82张图片

py-01-YongHe_第83张图片

py-01-YongHe_第84张图片

查看数据

py-01-YongHe_第85张图片

新增数据

py-01-YongHe_第86张图片

py-01-YongHe_第87张图片

py-01-YongHe_第88张图片

小结:

  1. why?为什么需要数据库?

CRUD操作,如果有1个月的永和大王大钟寺门店订单。

数据挖掘:(统计查询)

  1. 这个门店中这个月的销售额

  2. 畅销产品 order by desc,滞销产品 order by

  3. 优秀员工,谁卖的多,每个订单收银员,单数和总金额

  4. 工作效率,结账时间-开单时间,时间越小越好

  1. 概念:

  2. 数据库 database

  3. 表 table

  4. 字段 colume/field

  5. 类型 datatype int/varchar(n)/double/timestamp时间戳

  6. 主键 primary key,唯一标识一行数据

  7. 自增 auto_increment +1,底层自动管理

  8. 数据库database

数据一个集合,数据会存储下来。Mysql底层是文件。

py-01-YongHe_第89张图片

Mysql就是默认数据库

Mysql中数据库本质就是file文件。最终保存在磁盘上。

字符集问题,创建库时候指定,默认lantin1=ISO-8859-1,如果存中文就乱码???。

指定数据库

一个项目一个数据库

  1. 表table,一个数据库中隔离业务

create table

注意字段+类型+长度

  1. 主键+自增 

  2. 常规操作

CRUD增insert删改查

insert into tb_door(id,name) values(1,’tony’);

delete from tb_door where id=1;

update tb_door set name=’hell’ where id=1

select * from tb_door;

select * from tb_door where id=1;

select * from tb_door where name=’tony’;

数据tony tony2

要求:tony开头

select * from tb_door where name like ‘tony%’;(常用)

通配符%,匹配任意多的字符

要求:包含tony字符串

select * from tb_door where name like ‘%tony%’;(常用)

去掉name为null的记录

select * from tb_door where name is not null;

只查询name为null的记录

select * from tb_door where name is null;

按名称排序

正序 select * from tb_door order by name [asc];

倒序 select * from tb_door order by name desc;

查询记录总数

SELECT COUNT(*) FROM tb_door;

select count(id) from tb_door;

6)特殊SQL

删除数据库 drop database yh;

删除数据库表 drop table tb_door;

查看创建表的sql语句 show create table tb_door;

查看数据库中有哪些数据库 show databases;

打开某个数据库 use yh;

某个数据库有哪些表 show tables;

查看表结构 desc tb_door;

 


day05: PowerDesigner的使用+Jdbc

知识回顾:

  1. 数据库,因为数据方便存储,通过SQL结构化查询语言Struction Query Lanuage。不光完成数据维护(新增、修改、删除),查询(统计查询)

  2. 关系型数据库Oracle、MySQL、SqlServer,非关系型数据库no sql Redis(key,value)KV数据,mongodb(json带格式的一个字符串 {abc}),hbase(列式存储)

  3. 概念:

  4. 数据库database, mysql,隔离不同的项目,yhdb,jtdb

  5. 表table,在一个项目中有很多的业务:购物车表,订单表

  6. 字段column,field,一个表中有很多信息,可以划分成很多的字段,字段最小单位不能分拆

  7. 类型datatype,数据库对不同类型的数据要进行存储

int/tinyint/double/varchar/timestamp

    1. 主键 primary key,唯一的标识这一条的记录

    2. 自增 auto_increment(mysql独有的)+1,数据库底层会记录这个表的主键的最大值

  1. 基础的SQL语句

  2. create database yhdb;   默认的字符集lantin1,相当于iso-8859-1

  3. create database yhdb default character set utf8;

  4. create table tb_door(id int not null auto_increment,door_name varchar(200),tel varchar(20), primary key(id)); 创建表,3个字段,类型,主键,自增

  5. show databases;     展示所有的数据库

  6. show tables;        展示某个库的所有的表

  7. use yhdb;           打开某个数据库,它就作为当前数据库

  8. show create table tb_door;      展现表的创建的sql语句

  9. desc tb_door;  展现表的结构

  10. drop table tb_door;     删除表,自增管理也被删除了

delete from tb_door;    只删除内容,不会把自增删除。

  1. drop database yhdb; 删除库,所有的数据都丢失

5)最常用SQL语句

    CRUD操作,新增,修改,删除,查询

insert into tb_door(door_name,tel) values(‘大钟寺店’,’110’);

insert into tb_door(tel ,door_name) values(’110’,‘大钟寺店’);

insert into tb_door(price) values(110.00);
update tb_door set tel=’119’ where id=1

update tb_door set door_name=’dzs’,tel=’119’ where id=1
delete from tb_door where id=1;

查询所有数据

select * from tb_door;

select tel from tb_door;

select tel from tb_door where id=1;

select count(*) from tb_door;

底下性能比上面的高

select count(id) from tb_door;

 

  1. 使用客户端sqlyog

把门店信息表实现

  1. 表设计,在概要设计时就开始表设计,在详细设计中继续细化,在详细设计完成,表设计就完全完成了。在实际开发中也会局部修改。

  2. 表名tb_door,字段们id,door_name,tel,字段类型,长度

  3. 实现建表SQL语句

在业界有标准表设计工具,PowerDesigner,以图形展现,看着方便直观,可与直接产生建表SQL语句。

安装PD

  1. PowerDesigner15.1汉化破解版.rar

py-01-YongHe_第90张图片

破解

所有的文件覆盖下面目录即可

C:\Program Files (x86)\Sybase\PowerDesigner 15

然后运行就可以。汉化不彻底。

安装时选择语言(下拉框)选择PRC中文(最长的那个)同意协议,

然后一路next

    

  1. 录入数据

  2. 查询数据

在实际开发中怎么使用PD表设计?(了解,会看,会用)

表设计,非常关键,对业务了解,开发团队资深系统分析师

py-01-YongHe_第91张图片

工具栏中就注意2个按钮,

上面的叫表,下面的是表之间关系

py-01-YongHe_第92张图片

py-01-YongHe_第93张图片

py-01-YongHe_第94张图片

把页面中所有的表放在一个页面

产生建表语句,拿到sqlyog中执行

create table tb_door
(
   id                   int not null auto_increment,
   door_name            varchar(200),
   tel                  varchar(20),
   primary key (id)
);

最后一步:

怎么从数据库获取数据?

JDBC java database connect java访问数据库jar工具包

JDBC j2ee规范,数据库厂商oracle(ojdbc.jar),mysql(mysql-connector-java-5.1.10-bin.jar

  1. 导入jar

py-01-YongHe_第95张图片

这些对象都选择java.sql下的

No suitable driver found for jdbc:mysql231://localhost:3306/yh

没有匹配驱动,

错误原因:url写错了

解决方案:修改成正常的

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Caused by: java.net.UnknownHostException: locathost

错误:第一首先看最前面,最前面的不够定位准确,再看最后

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:

Unknown database 'yhdb'

错误:不认识数据库yhdb

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:

 Table 'yh.tb_door123' doesn't exist

错误:table tb_door123表不存在

程序高手!

故意搞破坏!

java.sql.SQLException: Invalid value for getInt() - '大钟寺北三环店'

抛出SQLException,无效的值

问题:

  1. 有两次数据库访问

  2. 大量的代码重复

优化:

String doorName,String tel

Door对象,有两个属性doorName,tel

开发步骤:

  1. 创建Door对象,有两个属性doorName,tel,一次数据库访问

  2. 可以分别设置doorName和tel。setDoorName,setTel,对象就能保存两个值

  3. 可以从Door对象中获取 getDoorName,getTel

特性:这种对象pojo对象(传递数据)

  1. 它有属性字段

  2. 每个属性有set方法

  3. 每个属性有get方法

py-01-YongHe_第96张图片

py-01-YongHe_第97张图片

解决2个问题:

  1. 不能多次访问数据库,合并一次

  2. 方法要返回多个值

解决方法:

不能用普通对象String一次只能一个值

使用java中pojo对象

Pojo对象特点:

  1. 多个属性值 private Integer id/private String doorName/private String tel

  2. 设置这个属性值,通过给每个属性设置set方法

  3. Servlet中获取这个值,给每个属性增加一个get方法

鼠标右键,source菜单,选择生成get和set方法项,会自动生成相应代码

使用:pojo对象传值,步骤:

1)创建pojo对象 Door door = new Door();

2)调用这个对象set方法给它设置值 door.setId(rs.getInt(id));

3)在servlet中获取

对象是有作用域,方法内部创建的对象,出了这个方法就不能用了。

while(rs.next()){

}

py-01-YongHe_第98张图片

方法调用过程

py-01-YongHe_第99张图片

小结:

  1. PD powerdesinger设计工具,主要用来表设计

文件保存pdm物理数据模型

对初级程序员,会看,会找到建表sql语句

  1. 程序就要从数据库中获取数据

  1. 写3个参数

url=jdbc:mysql://localhost:3306/yh

jdbc:mysql:// 协议头

localhost找到数据库所在服务器

3306 mysql服务的端口,找到mysql服务

yhdb数据库

    b)创建链接

new Driver();

Connection cn = DriverManager.getConnection(url,user,password);

    c)创建执行者(语句)

Statement stat = cn.createStatement();

    d)ResultSet rs = stat.executeQuery(select * from tb_door);

    e)循环数据

while(rs.next()){

    Integer id = rs.getInt(1);

    String doorName = rs.getString(door_name);

。。。。

}

    f)释放资源

最早声明对象,最后释放

rs.close();

stat.close();

cn.close();

在项目中获取数据库的数据

  1. 在servlet中增加一个获取数据库的方法

public String getDoorName();    //获取数据库的表中的门店数据

public String getTel();      //获取电话

访问数据库的次数太多,重复的代码也太多了。

  1. 改造优化下

多个数据库访问合成一个

把内容一次查出,放入一个对象中,一个对象可以有多个属性

在java世界中把这个对象就称为pojo对象。对象就是传递数据的。

Public Door getDoor(){

     Door door = new Door(); //在方法内存储数据,出了方法外这个对象就失效,不能访问了;

     查询数据库,把数据通过set方法设置到door

     反 return语句,  return door;

}

遇到return它就范围调用者

Door door1 = getDoor();  door1和door是一个类型Door,那就把door的每个属性值赋值给door1里面每个的值。

可以从door1中获取信息

door1.getDoorName()

door1.getTel()

一次可以传递多个值

HTTP Status 500

内部错误,servlet里面有错误

java.lang.NullPointerException(空指针错误)

        cn.tedu.yh.servlet.Order.doGet(Order.java:33)

Order servlet中33行错误

声明一个变量,变量没有给他设置值,默认值null

Pojo对象特点:

  1. 多个属性,private修饰符

  2. 对应每个属性设置方法setXxx

  3. 对应每个属性获取方法getXxx

Jdbc淘汰,不会直接写这些代码,框架封装,Mybatis

 


day06:日期格式的转换和统一

课改:

学习方式:

  1. 按部就班一步一步踏实脚印走(太多啰嗦地方)java面向对象,封装,继承,多态

  2. 另辟蹊径(拔苗助长,我还不会走,老师就让我跑)

田忌赛马

 

我们学员

资深的技术人员:项目经理,技术经理,架构师,技术副总

弱项:java基础、javaWeb、3大框架

(面试技巧,最重要是表现自己好学和渴望进入这家公司态度)

强项:

Java1991年17年了,市场上企业中有大把java程序员,在企业中通过非常多的项目来真实锤炼,周期3-20年。真实企业环境。

 

在培优课程中优势:

  1. 互联网架构为核心

Docker容器化,1s启动一个服务,瞬间达到百万级别(阿里双11,2017,2018都是运行在docker之上)

Nginx+redis(x)+mycat

Rabbitmq+docker+dubbo

Jsoup 爬虫,薪资9k+

Lucene+solr/es 10K+全文检索工程师,自己百度

2)大数据项目

Hadoop,HDFS,flume,hive,storm,zookeeper,kafka

真实项目网络流量日志分析PV,UV,VV

弱项:在工作中接触的技术的面小!越大公司越窄。跳槽!

对新技术消化能力差,(为了现有系统稳定,不可能直接把新的技术引入)但是它渴望,企业渴望!

技术变化非常快!它虽然很难实质推动企业技术变更,但是他希望有人来做这个事情,

大多企业:

大型,互联网架构+大数据

中型,dubbo互联网架构+ssm(springmvc+spring+mybatis)三大框架

小型,ssh(struts2+spring+hibernate)

 

Jsp动态网站,和服务器可以交互。

传递参数,活动,和数据库一结合,这些数据就能从数据库获取。当数据库修改了,这些页面的数据重新加载页面时,就变化成新的内容。

Servlet负责数据准备,传递给jsp页面。

    从数据库获取数据jdbc,数据返回值给变量

    String doorName = getDoorName(去访问数据库返回店名)

    Servlet是如何把信息传递给jsp(request)

request.setAttribute(key,value);

request.setAttribute(doorName,doorName)

//把请求转发到order.jsp页面,把参数对应值都传递给jsp页面

request.getRequestDispatcher(/WEB-INF/views/Order.jsp, ).forward(request,response);

Jsp负责页面的展现

    展示html标签,tomcat直接翻译,静态页面

    动态的信息doorName,在jsp中如何获取呢(el表达式)

    ${doorName}内部回去request找,key=doorName,如果找到把value值进行返回。如果没找,就返回空,在页面上就什么也不展示。

py-01-YongHe_第100张图片

Rs.getInt(id

getInt而不叫getInteger

在于作者的目的。返回int

在java中两类变量:

  1. 基础变量int,double,long,char,boolean

  2. 对象变量 Integer,Double,Long,String,Boolean

最大的差异:基础变量都有默认值,而对象变量的默认值都是null

int=0;double=0.0

需求:考试,一个学员考试,有成绩。

int =0,(int i=-1)

Integer =null

    基础变量存储的空间小,对象变量存储空间大!内存

Java中尽量使用对象变量(面向对象编程)

如果是在做通信程序,推荐使用简单变量

Mysql数据库实质文件类型。

早期的mysql是直接和mysql/test默认的数据库放在一起的。

现在版本换地方,从一个文件中看到,全局mysql配置文件mysql.ini(ini微软习惯配置信息的一个文件)

Mysql提供数据库所在位置

C:\Program Files\MySQL\MySQL Server 5.5\data\mysql

py-01-YongHe_第101张图片

这是一个隐藏目录!

数据库包括表其实mysql本质文件,它把这些信息组织后,存储成二进制文件。Mysql数据库自己来维护。

String doorName = 大钟寺门店;     单独进行数据库访问写成一个方法(函数)getDoorName(jdbc,返回值string)

String tel = 110; 单独进行数据库访问,把上面的方法拷贝,然后修改获取值的地方

缺点:

  1. 大量重复代码

  2. 数据库进行多次链接

解决方案:

  1. pojo对象,因为这个做后,可以支持返回多个值

  2. 查询数据库就合成了一个方法(一次查询),

  3. 返回值就变成pojo,代码怎么设置pojo? Door door = new Door();利用pojo对象每个属性的set方法去设置即可

  4. 需要属性怎么获取,就利用pojo的get方法获取。

找出需求中的动态数据,这些数据就需要放在数据库中,方便维护!

py-01-YongHe_第102张图片

py-01-YongHe_第103张图片       

特殊的表名,列名

SELECT * FROM `order`;

''

` 刀秋

创建表的主键

尽量的和业务无关,如果业务唯一性不能保证,我们的表丝毫不受影响!

Char和varchar有什么区别?

py-01-YongHe_第104张图片

Char固定长度,查询的性能高,但是不宜太长,会浪费我们的存储的空间

Varcar变长,长度变化,查询的性能低,存储不会浪费空间

Fk  外键 forgein key

表设计

如何从用户原始需求中提炼数据库表?

  1. 原始界面中逐字分析

  2. 把信息分成几类:静态内容和动态的内容。把静态内容就排除在外。

  3. 怎么把信息拆到不同的数据库表中

  4. 从上向下分析,如果遇到动态内容,第一遇到先创建一个表

  5. 店名这个信息是描述什么的,一般就会以关键信息点作为表名tb_door

  6. 遇到电话,首先判断是否属于当前这个表的内容,电话就是属于描述门店信息的,所以就成为这个表的字段。

  7. 遇到账单号,也是判断是否属于当前这个表,不属于描述门店的信息,创建新的表。创建订单表。tb_order

  8. 账单类型看它从属我们哪个表,明显属于订单表

  9. 订单数量判断是否从事现有的表,它描述的和上面的表的分类都不相同,又创建新表tb_order_detail。如果感觉它也可以属于订单表,可以先放放试试,如果把这个内容放入到订单,其它字段内容,而且大多的字段,内容都重复。如果其中一个修改,这多条数据都有随之修改。如果发生这样的事情,表就设计的有问题,不能大量重复,就把信息拆开,形成了新表。

  10. 合计不能放入,要求:如果这个字段的内容可以由其它字段加工而成,这样的内容不能放入到数据库中。合计=数量*单价,累加

  11. 微支付要同时多看几张订单,就可以拆除,这个内容含有两个信息,只是表达的比较隐晦。它的值有:微支付和支付宝支付,现今支付。拆成两个字段:支付类型,和支付金额。

  12. 打印时间可以放入数据库表(后期对打印时间做统计),也可以不放入(不去统计时,不用放入表)。

py-01-YongHe_第105张图片

 

 

py-01-YongHe_第106张图片

 

/*==============================================================*/

create table tb_door
(
   id                   int not null auto_increment,
   door_name            varchar(200),
   tel                  varchar(20),
   primary key (id)
);

/*==============================================================*/

 

py-01-YongHe_第107张图片

/*==============================================================*/

create table tb_order
(
   id                   int not null,
   door_id              int,
   order_no             varchar(20),
   order_type           varchar(30),
   persion_num          tinyint,
   cashier              varchar(30),
   crate_time           timestamp,
   end_time             timestamp,
   payment_type         varchar(10),
   payment              double(8,2),
   print_time           timestamp,
   primary key (id)
);

alter table tb_order add constraint FK_Reference_1 foreign key (door_id)
references tb_door (id) on delete restrict on update restrict;

 

/*==============================================================*/

py-01-YongHe_第108张图片

 

/*==============================================================*/

create table tb_order_detail
(
   id                   int not null,
   order_id             int,
   num                  varchar(200),
   item                 varchar(300),
   price                double(8,2),
   primary key (id)
);


alter table tb_order_detail add constraint FK_Reference_2 foreign key (order_id)
references tb_order (id) on delete restrict on update restrict;

/*==============================================================*/

 

Mysql+sqlyog在处理日期时不够严谨,有默认值0000-00-00 00:00:00这样的格式值直接放在字段中,如果查询数据库时含有这样的内容,将来java中就会报错。它不是一个正确日期格式。

完成这个订单信息

--查询某个订单所对应门店信息

SELECT * FROM  tb_door WHERE id=1;

带3个字段返回,Door pojo

--查询某个订单的信息

SELECT * FROM tb_order WHERE id=1;

返回n个字段,Order pojo

--查询某个订单下订单详情信息

SELECT * FROM tb_order_detail

WHERE order_id=1;

返回3个字段和3条记录,

数组

解决一条OrderDetail pojo

List 数组<泛型>,泛型是告诉我们数组里每个元素的值的类型是谁

Jsp最终获取数据不想去3个对象中获取,就像直接从一个对象中取获取

Order有两个特殊属性标识对象之间关联

    对一:门店 Door door;

    对多:订单详情List

在jsp页面中遍历集合,使用JSTL java支持标签库

开发步骤;

  1. 引入jar

/yh/WebContent/WEB-INF/lib/jstl-1.2.jar

  1. Jsp中先引入taglib

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  1. 在Jsp引入 c:forEach

Items填写request集合元素,必须el写法

var起每行别名

日期处理

  1. 修改pojo返回参数类型String printTime;

rs.getDate("print_time")            只返回日期部分

rs.getTimestamp("print_time")   返回时间戳,会多毫秒数

利用格式化函数SimpleDateFormat函数

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

order.setPrintTime(sdf.format(rs.getTimestamp("print_time")));

合计

            设置变量,变量名total,设置一个初始值为0

    相当于java中的while,遍历一个集合List集合,var设定一个别名,访问方便

         

    设置一个total进行累加

         

         

${o.num} ${o.item} ${o.price}
${total}

id

door_name

tel

1

大钟寺北三环店

010-47472723

2

火车南站店 

010-83838718

3

永和大王(北三环西路店)

010-62112313

py-01-YongHe_第114张图片

 

/*==============================================================*/

 

tb_order表

 

id

door_id

order_no

order_type

persion_num

cashier

create_time

end_time

payment_type

payment

print_time

1

1

P000021

食堂

5

朱晓霞

2018-06-05 11:25:07

018-06-05 18:38:11

微支付

58

2018-04-27 07:38:11

py-01-YongHe_第115张图片

 

 

 

/*==============================================================*/

tb_order_detail表:

id

order_id

num

item

price

1

1

4

香菇菜包套餐-ECS
4X --香菇菜包
4X --现磨豆浆(热/无糖)

28.00

2

1

2

非矾油条

10.00

3

1

2

鲜肉小馄饨

20.00

py-01-YongHe_第116张图片

 

 

/*==============================================================*/

 

 


 

没有在WEB-INF\classes中生成class文件

1.首先确定project->Build Automatically是否勾选上: 

py-01-YongHe_第117张图片

2.然后,再进行测试,能不能进行编译,如果还是不能,则进行手动编译: 

project->clean 

py-01-YongHe_第118张图片

3.进入clean对话框,选择Clean projects selected below,然后选择OK 

 py-01-YongHe_第119张图片

4.再次进行测试,如果还是不能编译,那就是项目设置出了问题。项目右键->properties->Java Build Path->Source 

将Default output folder设置为Test/WebContent/WEB-INF/classes,点击OK。 

 py-01-YongHe_第120张图片

5.又再次的进行测试,如果还是不能编译,就检查项目有没有报错,如果报错了,修改掉错误。 

6.再次进行测试,如果还是不能编译,就查看其引用的jar包是否报错,如果报错,就remove掉,重新添加即可! 

以上几个方法,总有一款适合你!

方法二:

 

在开始之前,查看Eclipse的problems view,里面可能会告诉相关的错误的原因,一般来说,可能有如下几种情况:

 

    1). 确保 project->build automatically已经被选上.

 

    2).  project->clean..->选第2个clean select project, 勾上start build immediatelly

 

    3).删除现在的项目, 重新导入源文件,设置eclipse为保存时编译,然后在保存的时候就可以自动编译了

 

    4).如果项目里引了某个不用的jar包,而那个包又被你删了,就会出现不报错但怎么也编译不出来class文件的情况,可以把所有包都删除,然后一个一个的再引入(需要的),不要一下子把所有包都引入来,没用的可能会引起不良后果.

 

     5). 想删掉某个class文件重新生成,删除class文件后,但classes目录下的文件夹被其它程序打开,比如SublineText。此时编译也不会 通过,在problems下可能会提示“con''t delete classes ……”。关掉其它程序重新编译即可。

 

     6).remove掉 JRE System Library,重新导入即可编译。

 

     7).把build path中所有包都remove掉。然后又add jars,add libraries把需要的加进去。

 

     8).project->properties->java build path->source->.../WEB-INF/src的output folder不要默认,编辑让它指向../WEB-INF/classes然后重新点击build工程即可自动编译。

 

     9).如果你的项目是CVS进行版本控制的项目,查看工程下面是否缺少了work目录,由于CVS控制时不把work加如版本,所以 checkout后没有这个目录,要手工加上有的工程就能自动编译了

 

 

 

 


 

作者:Darren

电话:15110448224

QQ:603026148

以上内容归Darren所有,如果有什么错误或者不足的地方请联系我,希望我们共同进步。


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(java-py,py-01-YongHe)