从JavaBase到easyui

目录:
Javabase:
基本数据类型
逻辑运算符

OOP:
类与对象
封装、构造、重载
oop知识点汇总

SQLServerlet:
数据库连接
数据库单词
数据库六大约束

API:
基本数据类型的封装类
Java中int和Integer区别
StringBuilder
Date、DateFormat、Calendar类
API-集合框架
dao模式

Swing:
Swing概述
Swing主要容器
Swing实例
网袋布局
事件
菜单栏&工具栏&选项卡&失焦事件

高级API:
File类
缓冲流
字符流
TCP协议与UDP协议
线程Thread(线程的操作与状态)
线程的继承方式和实现方式有什么区别?
死锁与多线程的安全性

Oracle数据库:
Oracle基本介绍
PL/SQL
数据类型
SQL操作符
循环语句
异常
数据库对象

HTML:
什么是HTML
HTML单词
特殊符号
内间距

JavaScript:
JavaScript
函数和windows对象
通过js修改元素的样式

jQuery:
了解什么是jQuery以及其基本语法
工具方法
jQuery属性和CSS
事件

javaweb:
javaweb思维导图

Bootstrap:
Bootstrap思维导图

easyi:
easyui思维导图

                         javaBase:

java的8种基本数据类型:

数据类型 数据大小 取值范围
byte 1字节 -128 ~ 127
short 2字节 -32768 ~ 32767
int 4字节 -2147483648 ~ 2147483647
long 8字节 -9223372036854775808~ 9223372036854775807
float 4字节 1.4e-045~3.4e+038
double 8字节 4.9e-324~1.8e+308
char 2字节 0 ~ 65535
boolean 1字节 true/false

使用变量的步骤:

第一步:声明变量,即“根据数据类型在内存申请空间”

int money;

第二步:赋值,即“将数据存储至对应的内存空间”
money = 100

第一步和第二步可以合并

第三步:使用变量,即“取出数据使用 ”

int money = 100

逻辑运算符 说明
& 逻辑与
| 逻辑或
^ 逻辑异或
|| 短路或
&& 短路与
! 逻辑非
&= 逻辑与赋值
|= 逻辑或赋值
^= 逻辑异或赋值
= = 等于
!= 不等于
?: 三元运算(if-then-else)

if ( 条件 ) {
//代码块1
}else {
//代码块2
}

switch (选择变量)
{
case 值1:

break;

case 值2: …break;case 值3: …break;......
default : …

}

Switch…case的其他特性:

各个 case 标签不必连续,也不必按特定顺序排列
default 标签可位于 switch…case 结构中的任意位置
default 标签不是必选的,但使用 default 标签是一个良好的编程习惯
每两个 case 标签之间的语句数不限

随机数
Random rm = new Random();
int n = rm.nextInt(3); / /产生一个随机数

while ( 循环条件 ) {

   循环操作

}

先执行一遍循环操作:再判断符不符合条件:do {

 循环操作

} while ( 循环条件 );

for (int i = 0; i<10; i++) {
跑400米; if ( 不能坚持 ) {
break; //退出比赛
}

}

声明数组并分配空间:

数据类型[ ] 数组名 = new 数据类型[大小] ;

赋值:
数组名[0] = 89;

数组名[1] = 79;

数组名[2] = 76;

         <a name="b">OOP:</a>

类与对象:
类是Java程序的核心,它定义了对象的形状和本质,可以用类来创建对象。当使用一个类创建了一个对象时,通常说给出了这个类的一个实例。

Java的类声明是创建类时必须对类的一些性质进行描述。包括类名、类的父类、类所实现的接口及类的修饰符。它的一般格式为:

1.[public][abstract|final] class ClassName [extends superclassName]
2.
[implements interfaceNameList]

关键字class前面是可选修饰符的,其中:

1.public:访问权修饰词,允许所有的类访问它,如果某个类以public做修饰词,那么这个类的类名必须和Java文件名(*.java)相同。
2.abstract:对父类的修饰词,当这个类声明为抽象类时,该类就不能被实例化。

3.final:对子类的修饰词,当这个类被声明为最终类时,它不能再有子类。

如果这个类上面还有父类,那么就需要用到extends修饰词,在之后跟父类名。如果要实现某个接口,就需要用到implements修饰词,后面跟接口名。

方法的返回类型为void,方法中不能有return返回值:

public class Student{
public void showInfo(){
return “我是一名中国人";
}
}

为什么需要包:
1.文档分门别类,易于查找

2.易于管理
3.不同内容的文档可以放在不同的
袋子中,拥有相同的名字,避免冲突

封装、构造、重载:
public 构造方法名( ) {
//初始化代码
}

一个类是否可以有多个构造方法?

方法重载,指同一个类中多个方法:
方法名相同
参数列表不同

面向对象三大特征之一——封装

封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

继承:
子类访问父类成员
: 使用super关键字
访问自己的成员:使用this关键字

为什么使用继承:
1.方便修改代码
2.减少代码量

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

方 法 名 说 明
Exception 异常层次结构的根类
ArithmeticException 算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问 null 对象成员
ClassNotFoundException 不能加载所需的类
InputMismatchException 欲得到数据类型与实际输入类型不匹配
IllegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把"abc"转换成数字

在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行

                                     <a name="bc">  oop知识点汇总:</a>

一、面向对象:
1、OOP 即面向对象编程,java就是面向对象编程的语言。
世界由万物组成,万物都是对象(世界万物皆为对象)
面向对象思想:
第一步:发现类;
第二步:发现类的属性;
第三步:发现类的方法;

2、对象:客观的存在在这个世界上的每一个事物;万事万物皆为对象;
3、类:从具有相同属性和方法的多个对象中抽取出来的;类里面有且仅有属性与方法;(学会把类看做一种数据类型)
4、区别:对象是实实在在存在的具体的概念 ;类是一个抽象的概念;
5、属性---本身所具备的特征;方法---会的行为(功能);

二、方法:
1、方法构造:修饰符 返回类型 方法名(参数){方法体}
2、属性构造:修饰符 数据类型 变量名
3、方法有无返回类型:方法按照返回类型可以分为以下两种:
a、有返回return : 在方法名前面接一个数据类型 ,
且方法体内部最后一行必须接return ,
而且返回的数据类型必须和前面的数据类型保持一致!

b、无返回void  : 在方法体内部不需要接return ,4、方法有无传参:
a、无参
b、有参实参和形参的参数个数、数据类型、顺序一致

5、构造方法的特点:
1、构造方法名必须与类名保持一直
2、构造方法无返回类型,无void
3、构造方法可以根据实际情况带参
4、构造方法可以多个,方法可以重载
5、构造方法在对象被实例化时调用,不能用对象名或类名调用
6、每一个类都自带一个无参构造方法,一旦自定义了构造方法无参构造方法则无效

6、局部变量和成员变量区别:
1.局部变量没有初始值,而成员变量有
2.同名时,局部变量具有更高的优先级
3.作用域:局部变量只能在本方法中使用,成员变量可以在本类的所有方法中使用
4.同一个方法中,局部变量不允许重名

三、对象数组:
1、学会把类看作是一种数据类型!
2、对象数组三部曲:
定义类
声明并实例化一个对象
初始化(赋值)
3、封装两步:私有化属性 公开方法(可以根据实际情况考虑是否公开读写方法
4、this 这个 指代自己本类

四、重载与构造:
1、方法的重载 :同名不同参(参数类型 、个数不一致)
2、构造函数
a.方法名必须跟类名相同
b.没有返回类型 ,也不需要void
c.根据实际情况决定参数个数
d.在对象被实例化的时候被自动调用 ,不能手动用对象名去
e.可以有多个(重载)
f.所有的类都自带一个无参的构造方法 ,一旦自定义了一个构造函数,系统自带的无参的就没有了

五、this static 单例模式:
1、this 这个 指代自己本类;
构造函数链: 将所有对象的实例化全部归结到一个方法中
用this可以在构造函数内部调用其他的构造函数 ,但是它只能放在方法体的第一行;
2、static静态与非静态的区别:
a、非静态的只能用对象名调用, 静态的既能用对象名来调用,
又能用类名来调用
b、静态的只能调用静态的 ,非静态的都能调用
c、静态的在对象中间是共享的,只占用一份内存空间
d、代码块:分为静态代码块和非静态代码块,静态的只占有一份空间,都是在对象被实例化的时候自动调用 先静后非静
3、单例模式:
该类只能被实例化一次(设计模式);

六、继承:父类中公开的方法或者属性子类都可以无条件拿到(继承到)
1、继承的好处:
a.少写一些共有的代码
b.提供另外一种形式的分类
c.代码重用
2、语法:
子类 extends 父类
3、super用法:
super.属性可以显示调用父类属性;
super.方法可以显示调用父类方法;
4、子类可以直接拿到父类的公有的
但是父类不能拿子类的
继承的单方向
一个类只允许有一个父类
继承也是单继承
5、子类在实例化的时候 会先调用父类的构造函数

七、重写与抽象:
1、重写:
a、子类对于父类的不满意,可以补充,则直接重写父类的方法。
b、删除重写中的super.方法();就是全部推翻父类写法。
c、注意:子类的方法名字、返回值、参数必须要与父类保持一致
d、修饰符只能比父类的要高或者相等
e、重写的方法是否可以重载?可以

2、抽象:
抽象类:不能被实例化 但是可以作为其他类的父类
抽象方法特点: * 没有方法体;* 必须在子类中实现(重写),除非子类也是一个抽象类;* 抽象方法必须在抽象类中

八、final与多态:
1、多态:同样一种行为,在不同的对象中(不同的环境下)会产生不同的形态【关键在于将父类作为形参】
2、final特点:
1.放在类前面,则该类不能被继承
2.放在方法前面,则该方法不能在子类中被重写
3.放在属性(变量)前面,则为常量,必须有初始值且不能被修改

九、instanceof:判断运算符

十、接口:
1、接口表示的其实是一种能力
对象是对现实世界物体的抽象
类是对对象的抽象
接口是对类的抽象
2、语法:public interface 接口名
如果一个类要实现这些功能:
语法是 public class 类名 implements 接口名1,接口名2…
3、接口与抽象类的区别:
a:抽象类是类所以只能单继承,而接口(interface)可以多实现
b:抽象类继承用extends,而接口用implements
c:抽象类可以有构造,接口不能
d:抽象类可以有一般的属性,接口中的属性只能是静态常量
e:抽象类中可以有抽象方法,也可以有一般的方法,而接口中只能有抽象方法
f:抽象类中抽象方法可以被除private以外的修饰符修饰,但是接口中只能是public
4、常量一定是全大写

十一、异常:
1、异常:就是在程序中有可能发生的问题。
2、语法是:try{//监视
有可能出现问题的代码
}catch(异常的类型 异常信息所封装成的对象){
处理异常的代码
}finally{
最后会被执行的代码(有无异常都会被执行)
}
3、自定义异常 throws
4、抛出异常throw

十二、里氏替换原则:用子类实例化的对象来覆盖父类声明的对象

十三、修饰符:
private:私有化,最小气的,只能在自己的类中访问;
friendly:默认,友好的,只能在自己的类中、同包的类中访问;
protected:受保护的,只能在自己的类、同包的类、子类中访问;
public:公共的,最大方的,当前项目中所有的类都可以访问。

                      <a name="c"> SqlServerlet数据库:</a>

1、启动数据库服务 (2个)

2、进入sql Server建库 建表 新建Java项目

3、导入驱动包(注意路径问题)

4、加载驱动

5、定义连接字符串url

6、创建连接

7、定义sql字符串

8、获得执行对象

9、开始执行
–增删改
–查

10、关闭连接 (注意判断)

******数据库连接的常见错误:

  1. 显示“到主机的TCP/IP连接失败” 原因可能如下:服务器未启动IP地址错误端口号错误或端口未启用2. 显示“ClassNotFoundException”未添加驱动/驱动类名写错3. 显示“用户 'sa' 登录失败”帐号错误/密码错误

create 创建
database 数据库
drop 删除
master 核心系统数据库
mode 模型数据库
msdb 警告信息数据库
tempdb 临时数据库
table 表

分类 备注和说明 数据类型 说明
二进制数据类型 存储非子符和文本的数据 Image 可用来存储图像
文本数据类型 字符数据包括任意字母、符号或数字字符的组合 Char 固定长度的非 Unicode 字符数据
Varchar 可变长度非 Unicode 数据
Nchar 固定长度的 Unicode 数据
Nvarchar 可变长度 Unicode 数据
Text 存储长文本信息
Ntext 存储可变长度的长文本
日期和时间 日期和时间在单引号内输入 Datetime 日期和时间
数字数据 该数据仅包含数字,包括正数、负数以及分数 int
smallint 整数
float
real 数字
货币数据类型 用于十进制货币值 Money
Bit数据类型 表示是/否的数据 Bit 存储布尔数据类型

六大约束有哪些:
primary 主键
default 默认
check 检查
unique 唯一
not null 非空
foreign 外键

IN 子查询:
SELECT stuName FROM stuInfo
WHERE stuNo IN
(SELECT stuNo FROM stuMarks
WHERE writtenExam=60)

使用T-SQL语句创建视图的语法:
CREATE VIEW view_name
AS
<select语句>

                          <a name="d">  API:</a>

基本数据类型的封装类:
基本数据类型 封装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

Java中int和Integer区别如下:
1.int是基本的数据类型,默认值可以为0;

2.Integer是int的封装类,默认值为null;

3.int和Integer都可以表示某一个数值;

4.int和Integer不能够互用,因为他们两种不同的数据类型;

StringBuilder:
StringBuilder是一个可变的字符序列。
此类提供一个与 StringBuffer 兼容的 API,但不保证同步。

建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

将 StringBuilder 的实例用于多个线程是不安全的。
如果需要这样的同步,则建议使用 StringBuffer。

一、 什么是正则表达式。

正则表达式是由普通字符(如英文字母)以及特殊字符(也称为元字符)组成的文字模式。该模式对文本查找时需要匹配的一个或多个字符串描述,给出一个匹配模板。

二、为什么要使用正则表达式:
正则表达式可以大大简化文本识别工作,现已超出了某种语言或某个系统的局限,成为被人们广为使用的工具。

Date、DateFormat、Calendar类:
Date类:

Date 类表示日期和时间(该类大部分方法已过时)

提供操纵日期和时间各组成部分的方法
Date 类的最佳应用之一是获取系统当前时间
获取系统当前时间是一个长整型数据Long,
Date 类实际上只是一个包裹类, 它包含的是一个长整型数据,表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.

DateFormat:

DateFormat日期格式化类(抽象类)
String format(Date date)
方法用于格式化时间
static DateFormat getDateInstance()
获取日期的DateFormat 对象
static DateFormat getDateTimeInstance()
获取日期-时间的DateFormat 对象
static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle)获取给定 日期和时间格式化风格 DateFormat 对象 (可选参数 short,full, long, medium ,)

SimpleDateFormat:

功能:完成日期的显示格式化
只要通过向SimpleDateFormat 的构造函数传递格式字符串“EEEE-MM-dd-yyyy",

我们就能够指明自己想要的格式. 然后调用DateFormat(Date date)方法,得到想要的格式。

EEEE是星期, MM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yyyy"会显示 星期五-02-27-2009
public Date parse(String source) ( DateFormat类中 )解析格式化一个字符串时间,
将一个字符串转换成时间
例如:Date d = sdf2.parse(“2008/10/28 13:20:22”);//注意字符串的格式必须和设定的格式(sdf2)一致

Calendar 类:

我们现在已经能够格式化并创建一个日期对象了, 但是我们如何才能设置和获取日期数据的特定部分呢, 比如说小时, 日, 或者分钟? 我们又如何在日期的这些部分加上或者减去值呢?

答案是使用Calendar 类。Calendar 类也是一个抽象类,它有一个子类GregorianCalendar,接下来我会利用这个子类来演示这个过程,请看以下代码

使用GregorianCalendar类获取时间相关信息
calendar.get(Calendar.YEAR) 获取年
calendar.get(Calendar.MONTH) + 1) 获取月

Calendar(GregorianCalendar)操作方法:

cal.add(Calendar.YEAR, 2); //年上加2年

=API-集合框架=

*为什么需要集合框架?
数组的长度固定,增加新的值时不适用
*什么时候使用?
当数据量不确定的时候

*集合框架是什么?
动态的数组

*ArrayList方法:
1、获取集合长度 size()
2、增加数据 add()
在指定位置增加指定元素 add(下标,元素)
3、根据下标找元素 get(下标)
4、根据下标移除元素 remove(下标)
5、判断是否包含某元素 contians(元素) 重写equlas方法
6、直接移除某元素 remove(元素)

*如何解决集合内元素过杂问题?默认是?
<> 只能放引用数据类型,不能放值类型 Object

*List与Set的区别?
list:三有 有下标 有顺序 有重复
set :三无:无下标 无顺序 无重复

*什么时候用LinkedList?ArrayList?
当查询比较频繁使用Arraylist
当增 删改 比较频繁使用Linkedlist

*如何遍历集合?foreach可不可以?
for 可以

(了解)Set
1、增加 add()
2、遍历(迭代)
iterator

*** dao模式 ***

com.util 公共的属性和方法 DBHelper
com.entity 有多少个表就写多少个实体类 Student
com.ui 界面 Test
com.dao 与数据库相关的操作【增删改 查】StuDao

                         <a name="e">  SWING:</a>

Swing概述:
Swing是一个用于开发Java图形界面应用程序的工具包(集),以抽象窗口工具包(AWT)为基础,使跨平台的应用程序能使用任何可插拔(定制)的外观风格。
开发人员只需使用少量代码,即可利用Swing包中丰富、灵活的“功能”和“模块化的组件类”,开发出令人满意的用户界面。

Swing主要容器:

JFrame(一般操作的窗体),

JPanel(放在其它容器中[桌布]),

JDialog(模式窗体),(关闭时一般使用dispose选项)

JOptionPane(做提示)

a:消息对话框(只有确定)

b:确认对话框(有是否取消)

c:输入对话框(有是否以及接收输入值)

setTitle 设置标题
setSize 设置大小
setLocationRelativeTo 设居中置
setDefaultCloseOperation 设置关闭窗体
setVisible 设置是否显示
setBackground 设置背景颜色
1、JFrame窗体基本属性设置:
标题、大小、默认关闭模式、居中、可见

2、JDialog窗体
提示对话框
----JOptionPane.showMessageDialog(null,String);
询问对话框
----JOptionPane.showConfirmDialog(null,String);
输入对话框
----JOptionPane.showInputDialog(null,String);

3、窗体基本控件:
2.1–容器 JPanel
2.2–按钮 JButton
2.3–标签 JLabel
2.4–文本框 JTextField
2.5–密码框 JPasswordField
2.6–单选框 JRadioButton && ButtonGroup
2.7–复选框 JCheckBox
2.8–下拉框 JComboBox
2.9–文本域 JTextArea
3.0–滚动面板 JScrollPane
3.1–文件选择器 JFileChooser

=====将控件依次加到容器里,将容器加到窗体上!!!

Swing实例:
public class MyFrame extends JFrame{

public MyFrame() {

//设置窗体的标题

this.setTitle(“我的第一个窗体”);

//设置窗体的大小

this.setSize(200, 300);

//设置窗体出现的位置在屏幕中间

this.setLocationRelativeTo(null);

//设置窗体不允许改变大小

this.setResizable(false);

//设置窗体在关闭时退出整个程序

this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

//设置去掉边框

this.setUndecorated(true);

//设置窗体(面板的)背景颜色(蓝色)

this.getContentPane().setBackground(Color.GREEN);

//设置窗体可见

this.setVisible(true);
}
}

网袋布局:

1、给容器进行布局
//给容器布局: 实例化一个网袋布局对象
GridBagLayout gbl = new GridBagLayout();
//给容器设置布局
jpa.setLayout(gbl);
//给网袋布局设置约束
GridBagConstraints gbc = new GridBagConstraints();

2、设置标签及文本框的位置,并将添加到容器中的位置进行移动,如下
//用户名标签
JLabel jlbu = new JLabel(“用户名”);
gbc.gridx=0;
gbc.gridy=0;
gbl.setConstraints(jlbu, gbc);
jpa.add(jlbu);

3、调整行间距,

再密码标签增加
gbc.insets=new Insets(10, 0, 0, 0);

调整按钮的距离 确定按钮后
gbc.insets=new Insets(10, 40, 0, 0);

事件:

1、点击事件addActionListener

2、键盘事件addKeyListener
keyTyped 键盘选择
keyReleased 键盘松开
keyPressed 键盘按压

3、鼠标事件addMouseListener
mouseReleased 鼠标松开
mousePressed 鼠标按压
mouseExited 鼠标退出
mouseEntered 鼠标移入
mouseClicked 鼠标点击

鼠标移动事件addMouseMotionListener
mouseMoved 移动
mouseDragged 拖拽

4、窗体事件WindowListener
windowOpened 窗体打开事件
windowIconified 窗体缩小
windowDeiconified 窗体缩小还原
windowDeactivated 窗体失去焦点
windowClosing 窗体关闭中
windowClosed 窗体已关闭
windowActivated 获取交单

菜单栏&工具栏&选项卡&失焦事件:

一、菜单栏
–JMenuBar
–JMenu
–JMenuItem

二、工具栏
–JToolBar
【ImageIcon与Image之间的转换:】
*-ImageIcon—>Image
icon.getImage()

*-Image--->ImageIcon
new ImageIcon(ii)如何给按钮设置图片
--ImageIcon ia = new ImageIcon("f:\\图片\\1.gif");
如何在java中处理图片
--Image ii = ia.getImage().getScaledInstance(30, 30, Image.SCALE_DEFAULT);
--jba.setIcon(new ImageIcon(ii));【main方法里】设置窗体的风格与当前系统风格保持一致
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

三、选项卡
–JTabbedPane jtp = new JTabbedPane(JTabbedPane.BOTTOM,JTabbedPane.SCROLL_TAB_LAYOUT);

四、文本框的焦点事件
–jtfa.addFocusListener(new FocusListener(){})

五、下拉框的改变事件
–jcb.addItemListener(new ItemListener(){})

Swing皮肤包的用法:
try {
UIManager.setLookAndFeel(“org.jb2011.lnf.beautyeye.BeautyEyeLookAndFeelCross”);
} catch (Exception e) {
e.printStackTrace();
}

 <a name="f">高级API:</a>

文件的操作包io

input 输入
output输出

------------------------【File类】---------------------------
在java中,不管是文件还是文件夹都用File来表示!

1.isFile 判断是否是文件

2.isDirectory 判断是否是目录(文件夹)

3.isHidden判断是否是隐藏文件

4.exists 判断所关联的文件是否存在

5.createNewFile 创建一个文件

6.mkdir 创建一个文件夹

7.getPath 获得文件的路径
getName 获得文件名
getParent 获得文件的上一次父目录的名字(父路径)

8.length 获得文件长度,以字节为单位

9.lastModified 获得文件的最后修改时间 返回类型为long

10.delete 删除指定路径的文件

11.list 获得文件夹下面所有文件的名字
listFiles 获得文件夹下面的所有文件对象

12.listRoots 获得当前系统的盘符

1. 缓冲流:BufferedInputStream && BufferedOutputStream

BufferedInputStream的基本用法和FileInputStream是差不多的
但是缓冲流会减少磁盘IO的开销,它的性能高于FileInputStream和FileOutputStream

因此,以后用到FileInputStream时尽量用BufferedInputStream包装一次
用到FileOutputStream时尽量用BufferedOutputStream包装一次

  1. 序列化and反序列化
    –序列化:将从内存当中转换到介质(存在硬盘上的介质)的过程。
    【对象–转换成–介质】 导出

–反序列化:将对象从介质转换为内存里面的对象的过程。
【介质–还原成–对象】 导入

常用场景:数据的导入导出

一、字符流:

Reader类|---FileReader类|---BufferedReader类
Writer类|---FileWriter类|---BufferedWriter类

二、网络(.net包)
1.获取自己电脑:
–InetAddress.getLocalHost()
2.获取局域网中别人的电脑
–InetAddress.getByName(“ip地址”);

3.***获取互联网中的电脑***
--URL url = new URL(例如百度);
InputStream is = url.openStream();
思路:先从对应服务器中读取数据 再将数据写入到本地文件中(边读边写的原则)

三、将字节流转换为字符流
–利用桥梁:InputStreamReader

注意:将字节流转换为字符流的过程中,可能会发生乱码的情况,需要设置编码方式,支持中文的编码方式只有3种,分别是:gbk utf-8 gb2312

一、回顾以下正则表达式
\d:0-9
\w:A-Za-z0-9
\s:空格
[abc]{5}:从abc中任意取重复5次 abc abcab abbbc abdcd
[a-f]{2,5}:从a-f中任意取 重复 2到5次
[a-c]{5,}: 从 a-c中任意取重复5次及以上

  • :至少出现1次 >1
    ? :出现0次或1次
  • :任意次数
    ^ :[^abc] 除abc以外的任意字符

===============================================================================
二、认识两个类
1.Pattern 正则表达式的编译表示形式
2.Matcher 执行匹配操作的引擎

初识核心代码:

int c = 0;//计数器

Pattern p = Pattern.compile(“<img\ssrc=”([^>“]+)”\s\s/>");

Matcher m = p.matcher(sb);

while(m.find()){如果有 则返回true 否则返回false

c++;//计数器+1System.out.println(m.group(1));//打印出第一个()中的内容

}

===============================================================================

三、实现简单的客户端与服务器之间的对话

—什么是TCP协议与UDP协议?
TCP协议分4层: 应用==>传输==>网络==>数据链路
UDP协议:无连接(不管三七二十一往对方客户端丢东西,至于接不接得到我不管)

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。
当客户端和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。
TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等。 UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。
UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
使用这个协议的常见服务有DNS、SNMP、QQ(2003版本之前)等。

—两者的区别?
TCP:连接 == 打电话 == 双方建立通道,信息在通道中传送,双方响应,信息传递可靠性高,但资源开销大,独占一个通道,在断开连接前不能建立另一个连接(两人打电话,第三人不能打入)。
UDP:无连接 == 寄信 == 就是发送信息,没有开始与结束,一次性传递,也不需要接受方响应,无法保证信息传递的可靠性(寄了,但不一定能收到)。

================================================================================
套接字 Socket:(面向TCP)
源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。

其用于标识客户端请求的服务器和服务。
可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定。
TCP和UDP的网络通信的基本操作单元。

inputStreamReader:将字节的读取流–>字符的读取流
outputStreamWriter:将字节的写入流–>字符的写入流

客户端:Client
服务器:Server

一、文件的下载
文件的下载是指客户端从服务器端下载一个文件到客户端;
比如LOL的客户端,是要去LOL的官方服务器上把客户端的安装包下载到本地后再安装。

-------------【总思路】--------------
/**
* 1.启动服务器并且等待客户端上线
* 2.客户端连接服务器
* 3.客户端告知服务器要下载的文件名
* 4.服务器接收文件名并在本地找到对应文件
* 5.服务器将该文件从硬盘读到内存中,再写入网络中
* 6.客户端从网络上下载该文件,并保存到本地
* 7.关闭连接
*/

线程Thread

明确:
1.了解进程与线程之间的概念
2.线程的好处
3.创建线程(Runnable和Thread)
4.线程的操作
4.1 Runnable接口
4.2 Thread类
5.线程的缺点,如何防范。

===========================================

为什么需要多线程?
现代大型应用程序都需要高效地完成大量任务,其中使用多线程就是一个提高效率的重要途径。

知识点:
1.线程简介
2.线程的创建和启动
3.线程的状态及转换
4.线程的调度和优先级
5.线程的同步
6.集合类的同步问题
7.java.util.Timer类调度任务

===========================================

一、概念

  1. 进程与线程
    a. 进程—就是正在进行的程序。
    CPU在某一时间段只处理一个程序。
    程序也是一个进程,当程序结束,进程消失。

    b. 线程—就是程序中的一个执行路径(控制单元)
    线程在控制着进行的执行;
    它是真正的执行者。

进程与线程的关系:一个进程中至少包含有一个或多个线程。

示例:得到当前线程名
System.out.println(Thread.currentThread().getName());

示例:创建一个线程,测试主线程与其他线程
效率高是因为利用了程序间进入CPU的时间差

  1. 多线程存在的意义
    多线程可以让我们的程序部分可以产生同时运行的效果,各玩各的。
    提高效率是其次,主要是能让多段代码同时执行。

  2. 多线程的目的:
    为了最大限度的利用CPU资源。

  3. 线程调度:
    按照特定的机制为多个线程分配CPU的使用权。

调度的模式有两种:
(1) 分时调度:所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;
(2) 抢占式调度:根据线程的优先级别来获取CPU的使用权。
JVM的线程调度模式采用了抢占式模式。总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的。

====================================================

在Java中,多线程的实现有两种方式:
继承java.lang.Thread类
实现java.lang.Runnable接口

====================================================

二、线程创建方式一:继承Thread类

关键词:Thread、run()、start()

  1. Thread类创建,分两种写法:
    步骤:
    第1步:定义类继承Thread类;
    第2步:子类中重写Thread类中的run()方法;
    第3步:调用线程的start()方法

写法一:
子类:-------------------------------------------------
public class Person extends Thread{
@overriad
public void run(){
System.out.println(“这是个线程”);
}
}

测试类:------------------------------------------------
Person ps=new Person(); //初始化线程
ps.start(); //启动线程并调用run方法

写法二:
测试类:------------------------------------------------
new Thread(){
@overriad
public void run(){
System.out.println(“这是个线程”);
}
}.start();


  1. 为什么要重写run方法?
    目的:将自定义的代码存储在run方法中,让线程运行(也就是将同时要运行的代码写在run()方法中)。
  2. 通过对象.run()调用,不用start()方法调用也可以吗?
    可以,但run()就变成主线程中的方法,与线程没关系。
    因为线程没有开启,你只执行了调用。
  3. run()方法中仅仅是封装多线程运行的代码,而start()则是开启多线程的钥匙。
  4. start()方法是开启多线程,并执行run()方法。
  5. 多线程的一个特性:随机性(谁抢到谁执行,至于执行多长,CPU说了算)

===================================================================

三、线程的操作

  1. 获取线程的名字
    Thread.currentThread().getName();

  2. 设置线程优先级
    (1)每个线程都有一个优先级;
    (2)高优先级线程的执行优先于低优先级线程;
    (3)每个线程都可以或不可以标记为一个守护程序。
    (4)当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。

setDaemon(true)
//标识将该线程设置为后台线程,或者叫守护线程,或者叫精灵线程
例:对象.setDaemon(true)setPriority()
//设置的优先级一定要足够长时间才会有效果
例:对象.setPriority(Thread.MAX_PRIORITY);  //设置最高级别10对象.setPriority(Thread.MIN_PRIORITY);  //最低级别1对象.setPriority(Thread.NORM_PRIORITY);  //值为5注意:
(1)设置线程优先级的代码,要放在.start()前面。
(2)优先级高不一定代表该线程就先抢到执行权,理论是是可以,但实际情况不一样。

=================================================================

四、线程的状态

              ||===> 阻塞(临时状态)||         (有执行资格,没执行权)||start()   ||   sleep(time)

新建 ========> 运行 =============> 冻结(睡眠|等待)
|| wait()/notify()
stop() ||
||
消亡(真死了)

1.新建:刚new出来在内存中
2.就绪:start表示该线程有资格抢CPU!
3.运行:抢到了CPU,会执行run方法
4.冻结:放弃了执行资格,醒了获得执行资格,但不一定马上执行。
4.死亡:执行完run方法
5.阻塞:调用了sleep方法或其他阻塞的方法

执行资格与执行权
没执行资格的情况下,是冻结状态;
有执行资格的是临时状态;
既有执行资格又有执行权的是运行状态。

友情小知识点:
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:

五、实例:

  1. 卖票程序:多个窗口卖票,1号窗口卖票,2号窗口也能卖……,多个窗口同时间都能卖,而且不出相同的票号。

为什么不用Thread而要用Runnable?
解释:一个类继承了Thread,设置变量num=100,当在测试类实例2个线程时,就有200张票了,这明显有问题的。

六、创建线程的第二种方式:实现Runnable接口
步骤:
1. 创建类实现Runnable接口;
2. 重写Runnable接口中的run()方法;
将线程要运行的代码存放在该run方法中。
3. 通过Thread类建立线程对象;
4. 将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法;
为什么要将Runnable接口的子类对象传递给Thread类的构造方法?因为,自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去指定对象的run方法,就必须明确该run方法所属对象。
5. 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

public class Ticket implement Runnable{
private int tick=100;
@override
public void run(){
while(true){
if(tick>0){
System.out.println(Thread.currentThread().getName()+" sale…"+ tick–);
}
}
}

public class TickDemo{
public static void main(String[] args){
Ticket t=new Ticket(); //先实例化一个卖票的对象
//实例化四个线程
Thread t1=new Thread(t); //创建线程
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
//让四个线程开始工作
t1.start(); //执行线程启动run()
t2.start();
t3.start();
t4.start();
}
}
看结果,会出现负数出来,为什么?执行资格和执行权

======================================

线程的继承方式和实现方式有什么区别吗?(面试)
继承Thread类:线程代码存放在Thread子类run方法中;
实现Runnable:线程代码存在接口的子类的run方法中。

要知道为什么设置Runnable接口非常重要。
当一个子类中有一段代码需要多线程执行,那不能再继承Thread类时该怎么办?请用Runnable。
(你不是我儿子,但我还是帮你实现)

实现方式好处:避免了单继承的局限性。
在定义线程时,
建议使用实现方式。

=======================================

七、多线程的安全性
多线程,最怕的就是出现安全问题。
没有迸发,也不会出现这种情况。(一个人卖票就不会出现这种问题)
这种出现的机率可能一时检测不出来,但一出现就要命。

卧倒:具有执行资格,执行权被其它线程抢走了。
经过了判断,在执行输出代码时卧倒了,CPU再过来执行时,数可能已变了,票有可能输出0号票,-1,-2等等错票。//模拟让它停一下:Thread类下面的sleep(毫秒值);

分析问题出在哪?
问题原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句时执行了一部分,还没有执行完,另一个线程参与进来执行。导致了共享数据的错误。

解决办法:
对多条操作共享数据的语句,只能让一个线程执行完。在执行过程中,其他线程不可以参与执行。

Java对于多线程的安全问题提供了专业的解决办法:同步。
同步分:同步代码块、同步方法

锁旗标(同步):synchronized

(1) 同步代码块:
synchronized(对象){
//需要被同步的代码
}
//表示该段代码上锁

//如果是代码块后面要放上锁旗标,如果修饰方法,那么它的锁旗标是隐含的this。

(2)锁旗标也可以修饰方法----同步方法。

关于死锁:
同步也有个很烦心的事:死锁(概率很小)
何谓死锁:
吃饭的必要条件:要有两根筷子。
现在你拿一根筷子,他拿一根筷子,双方都没有达到吃饭的条件,双方又不愿把自己的那根筷子让给对方,结果两个人都吃不成。
你有一个锁,我有一个锁,我到你那里面去运行,你到我这里运行,你不放我去运行,我不放你去运行,结果就完了,都卡在那里了。

但死锁不常发生,因为有和谐的处理办法:
你给我一根筷子,我吃一口,把筷子给你,你吃一口……,交替着吃。

同步中嵌套同步,而锁却不同,就会造成死锁。
关于死锁就是互相拿着对方的锁却等着对方解锁

udp:数据报文(包)协议
DatagramPacket====传输层
=UDP
DatagramSocket传输层
有三种:
单播:是指只向一个固定的机器发送包
广播:是向255.255.255.255发送,所有监听某端口的机器都可以接收到
组播:是向一个用户组发送,该组里面所有用户可以接收到

DatagramPacket有2个作用
1.发送的包===>要给定发送的内容以及发送的地址与端口
DatagramPacket dp =
new DatagramPacket(byte[],0,length,InetAddress,port);
2.接收的包===>只要指定接收包的大小
DatagramPacket dp =
new DatagramPacket(byte[],0,length);

DatagramSocket有2个作用
1.发送的人===>只需要new出来就可以了
DatagramSocket ds = new DatagramSocket();
2.接收的人===>需要指定接收的地址以及端口
DatagramSocket ds = new DatagramSocket(port,InetAddress);

对于三种udp协议
1.发送方完全相同,单播是指定一个ip
广播是指定255.255.255.255这个ip
组播是指定D类ip(224-239)
2.接收方单播直接指定一个ip与端口
广播不能指定ip,只要端口
组播要使用MulticastSocket,
然后使用joinGroup加入该组

         <a name="g">Oracle数据库:</a>

Oracle基本介绍

============================================

一、需要启动的服务:
OracleServiceORCL //oracle数据库服务
OracleOraDb11g_home1TNSListener //oracle监听服务

=======================================

常用数据表如emp、dept、salgrade等表,这几个表存储在系统账号scott下,可以通过scott账号查看表格的基本情况。

=======================================

二、关于Oracle数据库的开发环境
启动步骤:Oracle->应用程序开发->SQL Plus
用户名:scott
口令:tiger
主机字符串:orcl

==========================================

三、PL/SQL Developer 集成开发环境
它是Oracle的第三方工具;
因为oracle的开发环境糟糕,因此我们采用第三方的

==========================================

四、新建SQL窗口
文件 --> 新建 --> SQL窗口

==========================================

Sql与Oracle最大的不同:
Sql中可以随时随意的创建数据库;但Oracle只有一个数据库,一台电脑只会安装一个数据库。
为了区分彼此,Oracle只有创建用户,一个用户一个数据库。

五、账户、表空间、数据库
开辟(分配)数据库空间----表空间(TableSpace)。
表空间代替了数据库,创建数据库就是开辟账户空间。

注意:Oracle为A账户开辟一个表空间,为B账户开辟一个表空间,请问A和B是不是在用同一个数据库?
不同账号之间能不能互访?


其实就是用表空间代替了数据库。创建数据库就是开辟用户空间。


=================================================

六、Oracle的安装–号称史上最麻烦的安装
Oracle里面的东西太多了,大批量处理数据的。
sql server号称百万级数据(一个表的数据),但其实最多20万条记录,超过20万条就用Oracle。

安装可能成功,但连接不了的情况,而且也不报错。

oracle8i/9i (internet)基于网络的

oracle10g/11g (grid)基于网格的,它的客户端就是个web程序了,可以在IE里打开的:oracle->Database Control - orcl点下就会在IE中打开,如果找不到地址就是没开动OracleDBConsoleorcl服务(DBC控制器),该功能就相当于SQL Server

orcale12c

==================================================

七、启动服务,进入Oracle,PL/SQL

7.1 创建数据库和账户

数据库
物理的:数据文件.dbf;日志文件.log;控制文件.ctl;
虚拟的:表空间(可以用户开辟)

数据库实例
启动的数据库对应一个数据库实例,由实例来访问和控制数据库。


问:先创建表空间还是用户?
先创建表空间,再给用户分配表空间


关于账户:
----sys和system管理员账号,在装软件时就已分配好的,因此可以用这账号开辟表空间。
----scott(释放账号:给我们用和看的),密码是tiger。
注意:千万不要去改这账号和密码,全球都是一样的。(改是可以改,但别去改)

关于账户登录:
可以用sys或system管理员账号登录,也可以用scott账户登录。
怎么登?
1.在开始菜单中选择oracle目录–应用程序开发–sql plus
2.在cmd状态下,直接通过命令sqlplus来登录。

在oracle下输入命令:
sys/sys as sysdba --sysdba是数据库系统管理员
解释:第一个sys是账户,第二个sys是密码,该账号做为管理员登录。

思考:
管理员账户可以调用一般账户的表吗?
select * from scott.emp;

一般账户可以调一般账户的表吗?

=====================================================

7.2 创建表空间

基于应用性能和管理方面的考虑,最好为不同的用户创建独立的表空间。

创建表空间的语法:
create tablespace 表空间名

例:
create tablespace t_table
datafile 'e:\111.dbf'   --数据文件存方地址
size 100M;
--只要上面三行就OK了
autoextend on next 32 maxsize unlimited
logging
extent management local
segment space management auto;

========================================

进入PL/SQL
1.all objects ==> my objects
2.左侧的都了解了,oracle就完了

My Objects
Functions 函数-
Procedures 存储过程-
Packages 包-
Package bodies 包体-
Types 类型-
Type bodies 类型体-
Triggers 触发器-
Java sources
Jobs 工作
Queues 队列
Queue table 队列表格
Libraries
Directories
Tables 表格-
Views 视图-
Materialized views
Sequences 序列-
Users 用户-
Profiles 控制文件-
Relos 角色-
Synonyms 同义词-
Database links
Tablespaces 表空间-
Clusters

==============================================

用;号隔开,代表代码写完了,可以执行了如果你是管理员账号,调别的用户的账号可以吗?可以
--账户.表;
select * from scott.emp;如果你是一般用户的账号可以调别人的吗?正常情况下不行,除非授权。

关于账户在Oracle有另一个名词叫:模式
select * from 模式.表;

比如scott就是个模式
比如其它的对象就是个模式
每个对象都是个模式

==============================================

7.2 给表空间分配账户
1.创建账户,指定访问表空间,但未给它赋任何权限,登录时是登不了的!
create user 用户名
identified by 密码
[default tablespace 表空间]
[temporary tablespace 临时的表空间] --该行一般不用

案例:
create user u_dml
indentified by 123
default tablespace t_table

7.3 要给角色授权
(把用户与角色区分搞清楚)
角色:张扬是个学生,是指角色
用户:而张扬,是一个用户

给角色授予权限:
找到users-用户名-编辑-角色权限
connect:临时用户的权限
resource:正式用户的权限
DBA:管理员(一般不用)分配权限或角色:
Grant privileges or role To user;例:Grant connect,resource to u_dml; --给dml角色分配权限

7.4 撤销权限或角色:
Revoke privileges or role FROM user;

例:revoke connect,resource from u_dml; --撤销dml角色的connect,resource权限

===============================================

八、建表
建的表都在Tables里面。
两种建表方式:
1.视图
2.代码

create table tb_88
(
sid number, --int类型用number
sname varchar2(55), --没有varchar
sex varchar2(10)
)

–查看表里的数据:
select * from tb_88;


Oracle中有标识列吗?
oracle没有标识列,不过有个替代品(触发器+序列)


–插入数据
insert into tb_88(sid,sname,sex)
values(10,‘张天’,‘男’);

–视图版的添加表:
右击Tables–新建–主键:在键里,名称自己取,类型primary,选定哪个列做主键,联合主键就选两个,请问有几个主键?1个

删除列:右则的减号

–怎么查看建表的脚本?
右下角–看SQL

–建完表后点“应用”

==================================================

一、数据类型
1.字符:char,varchar2,long
char: 固变 1~2000字节
varchar2:可变长度 1~4000字节
long: 可变长度 2GB长度(一般不用)

2.数值
number:即是整数又是小数,默认整型
number[(p[,s])] ==p精度,s小数位
number(5,2) == 共5位,其中小数位2位
–只要整型:number(5)

3.日期时间====>要转类型,像sql中用’'是不行了。
Date:存储日期、时间类型。
日期转换函数:to_date(‘2016-02-02’,‘yyyy-mm-dd’)

例:insert into tb_name(mydate)values(to_date('2016-02-02','yyyy-mm-dd hh:mi:ss'));

4.储存二进制数据,比如图片、视频、声音文件等
4.1 Raw或Raw Long
4.2 LOB (常用,就是所谓的大数据,最大4GB)
Clob:
Blob:
Bfile:
记住,一般我们不把图片、视频等存在数据库中,只是把它们存放在硬盘地址保存到硬盘。
存在数据库里,要转换,资源消耗多。

===============================================================

不会写sql语句?把Tables中的表往代码中插,选择插入或查询,会自动产生代码给我们填写。

===============================================================

二、数据定义语言DDL
create table – 创建表
alter table – 修改表
truncate table – 删除表(删除数据,保留结构)
drop table – 删除表(删除结构和数据)

create表:-----------------------------------------------------
–创建表:
create table tb_name
(
sid number,
sname varchar2(20),
sex varchar2(4)
)

–复制表:
select into 新表名 from 旧表 where 1=2
create table tb_name
as select * from emp;

–只复制表结构,不要数据
create table tb_name
as select * from emp where 1=2;

–去除重复的数据
select distinct 列名 from emp;

===============================================================

三、数据操纵语言DML
insert – 与sql server一致
delete – 与sql server一致
update – 与sql server一致
select – 与sql有些不一样

insert增:-----------------------------------------------------

–插入其它表中的记录(注意要先创建新表,然后再复制数据)
insert into newtable
select * from emp;

–将部门编号为20的员工插入到新表中
insert into newtable
select * from emp where deptno=20;

–使用union插入多条数据,要借用伪表
insert into newtable
select 1,‘张三’,‘男’ from dual union
select 2,‘李四’,‘女’ from dual union
select 3,‘王五’,‘男’ from dual union
select 4,‘赵六’,‘女’ from dual;

delete删:------------------------------------------------------
–删除性别为男的

update改:------------------------------------------------------

–给所有的人提薪10%
update emp set sal=sal+sal10%;
update emp set sal=sal
1.1;

select查:------------------------------------------------------

===============================================================

四、事务控制语言TCL
commit – 提交
rollback – 回滚
savepoint – 回滚的点

===============================================================

五、数据控制语言DCL
grant – 授权
revoke – 撤销授权

===============================================================

六、伪表dual与伪列rowid,rownum

  1. 伪表:
    select ‘a’ from dual;

  2. 伪列:
    select * from tb_name
    –如果结果集中出现三列,其实它有五列,还有两个列:rowid、rownum
    –rowid:唯一标识符,这是系统给的,不是我们自己定义的
    –rownum:有点类似sql中的row_number()方法

    怎么查看?
    select t.,rowid from tb_name t;
    select t.
    .rownum from tb_name t;

    注意:在Oracle项目中,一般都使用rownum做分页。

    这两个可以同时用吗?可以
    select t.*,rowid,rownum from tb_name t

    –求前两条记录(Oracle不支持top)
    select a.*,rownum from emp a
    where rownum<3

    –求第3、4条记录(注意:rownum只能作用于小于号)
    –解决办法:rownum是a表的伪列,把这伪列变成实列
    select * from
    (
    select a.*,rownum rid from emp a
    ) t where rid>2 and rid<5

    S2阶段的重点是分页,这段代码要记住,以后经常用。

案例1:求薪水前5的人
–思路:薪水排序,再用上面的rownum?

select * from emp where rownum<6 order by sal desc; (错)
先排序再取,上面代码是先取再排序
select * from emp order by sal desc where rownum<6; (错)

正确的:
select t.*,rownum from
(
select * from emp order by sal desc;
) t where rownum<6

案例2:求每个人的收入(薪水+奖金)
select ename,sal,comm,sal+comm from emp; (错)
结果是sal列中和comm列中有值的都能算出收入,如果有个列是null值,则算不出收入。

怎么办?
用nvl()函数,作用与isnull(comm,0)一样
select ename,sal,comm,sal+nvl(comm,0) from emp;注意:select t.*,rownum from emp t order by sal+nvl(comm,0) 的话是先对数据进行分号,再排,所以rownum会显示乱掉。nvl(exp1,exp2,exp3) --当exp1为null,返回exp2,否则返回exp3
select ename,sal,comm,sal+nvl(comm,0,comm+100) from emp;

案例3:查询没有奖金的人
select * from emp where comm=null;
(错,null不能用=号,就好比猪和人比,能比吗?种类都不一样)

正确:select * from emp where comm is null;

=========================================

四、SQL操作符

1.算术运算符 + - * /


2.比较运算符 = != < > <= >= between…and in like is null


3.逻辑运算符 not and or


4.集合运算符 union行合并,union all


5.连接操作符 ||用来连接字符串

SQL server语句:
select sid,sname,sex+'生' from tb_name
--看这案例,在SQL Server中这句话没问题在oracle中会报错:ORA-10722:无效数字
在Sql Server中“+”既有算术作用,也有字符串拼接作用;
但在Oracle中,“+”就只有算术作用。Oracle语句:
select sid,sname,sex||'生' from tb_name

SQL操作符的优先级:算术 > 连接 > 比较 > not > and > or

1.转换函数
to_char()
to_number()
to_date()

2.日期函数
sysdate/systimestamp
add_months(date,number)
months_between(date,date)
extract(xx from date) 1 2
last_day(date)
next_day(date,week)
round(date)
trunc(date)

3.字符串函数
initcap(varchar2)
lower(varchar2)
upper(varchar2)
ltrim/rtrim(varchar2,varchar2)
replace(varchar2,varchar2,varchar2)
instr(varchar2,varchar2[,number])
substr(varchar2,number[,number])
concat(varchar2,varchar2)
ascii(varchar2)
chr(number)
lpad/rpad(varchar2,number,varchar2)
length(varchar2)
decode(自定义)

4.数学函数
abs(number)
ceil(number)
floor(number)
round(number,number)
trunc(number,number)
sign(number)
sqrt(number)
mod(number,number)
power(number,number)

使用PL-SQL

1.关于PL-SQL(功能、特点及语法结构)
2.数据类型(%type与%rowtype)
3.PL-SQL控制语句
4.异常处理
5.函数

============================================

PL/SQL是过程语言PL与结构化查询语言SQL结合而成的编程语言。
PL/SQL是针对Oracle数据库的;
它是过程语言 + 结构化查询语言的结合;

过程语言PL:如变量声明,流程的控制,循环等;
查询语言SQL:SQL语言,如增、删、改、查等;

PL/SQL是SQL的扩展版,SQL能做的,PL/SQL绝大多数都能做。

PL/SQL的优点:
1.支持SQL:数据操纵命令,事务控制命令,游标控制,SQL函数和SQL运算符;
2.支持面向对象编程;
3.可移植性,可运行在任何操作系统上;
4.经过编译执行,性能佳;
5.与SQL紧密集成,简化数据处理,支持SQL数据类型,支持NULL值,支持%type和%rowtype属性类型(oracle中最有意思的);
6.安全性

PL/SQL分成三个部分:

  1. 声明部分
  2. 可执行部分
  3. 异常片理部分

语法结构:
[declare declaration] --声明部分
begin
executable statements --可执行部分
[exception handlers] --异常区
end;

输出:
select ‘abc’ from dual;
dbms_output.put_line(‘abc’);

--打印输出(必带begin)
begindbms_output.put_line('abc');
end

赋值:( := )
–变量声明赋值,并打印
declare i number(6);
begin
i:=77; //:=赋值,select…into也是赋值
dbms_output.put_line(i);
end;

–在emp表中将工号为7369的姓名输出
declare sid number;
sname varchar2(22);
begin
sid:=7369;
select ename into sname from emp where empno=sid; --select…into赋值方式
dbms_output.put_line(sname);
end;

提示下:在begin里面用select语句,必定要用select…into。

===========================================

数据类型:
1.标量类型
2.LOB类型
3.属性类型:
%type:提供某个变量或数据库表列的数据类型
%rowtype:提供表中一行的记录类型(非常有特色)

3.1 %type

–求7369的入职日期(在不知道该列是什么类型的情况下)
–申请一个与“入职日期”一样的

declare sid number;
shiredate emp.hiredate%type; --声明个变量,它的类型与表中某个列的类型一样
begin
sid:=7369;
select hiredate into shiredate from emp where empno=sid;
dbms_output.put_line(shiredate);
end;

–也可以sb shiredate%type;

–求某某的所有信息
declare sid number;
sname emp.ename%type;
sjob emp.job%type;
begin
sid:=7369;
select ename,job into sname,sjob from emp where empno=sid;
dbms_output.put_line(sname||’ '||sjob);
end;

当然,要是表中有很多的列,还像以上这么写吗?
NO,使用行类型:%rowtype;

–查询某某的所有信息
declare sid number;
er emp%rowtype;
begin
sid:=7369;
select * into er from emp where empno=sid;
dbms_output.put_line(er.ename||’ '||er.job);
end;

============================================

输入:& (一般做测试用,其它情况不怎么用)

declare sid number;
er emp%rowtype;
begin
sid:=&请输入; --&类似scanner
select * into er from emp where empno=sid;
dbms_output.put_line(er.ename||’ '||er.job);
end;

注意:sid:=&请输入; --代表录入的是整型
sid:=‘&请输入’; --代表录入的是varchar2类型。

=======================================
逻辑比较:
<> , !=

=======================================

控制语句:
if 条件 then
……
else或者elsif…then
……
end if

–工资大于3500交税,=3500刚好,<3500努力
if语句:
begin
if sal>3500 then
dbms_output.put_line(‘交税’);
elsif sal=3500 then
dbms_output.put_line(‘刚好’);
else
dbms_output.put_line(‘努力’);
end if;
end;

case语句:
case
when then ;
when then ;
else
end case;

循环语句:有三种:
1.loop 无条件循环
2.while
3.for

–打印1~100
declare i number;
begin
i:=1;
loop
dbms_output.put_line(i);
i:=i+1;
exit when i=100; --退出及退出条件
end loop;
end;

============================================
declare i number;
begin
i:=1;
<<b_loop>> --loop循环的名字
loop
dbms_output.put_line(i);
i:=i+1;
exit b_loop when i=100; --退出及退出条件
end loop;
end;

==========================================

–求1~100的和
declare i number;
mysum number;
begin
i:=0;
mysum:=0;
while i<=100 loop
mysum:=mysum+i;
i:=i+1;
end loop;
dbms_output.put_line(‘总和:’||mysum);
end;

–循环里都会使用到loop

–for循环的写法:
declare
mysum number;
begin
mysum:=0;
for i in 1…100 loop
mysum:=mysum+i;
end loop;
dbms_output.put_line(mysum);
end;

–求奇数之和
declare
mysum number;
begin
mysum:=0;
for i in 1…100 loop
if mod(i,2)=1 then
mysum:=mysum+i;
end if;
end loop;
dbms_output.put_line(mysum);
end;

–顺序语句:goto 标名……<<标名>>
不讲,不用了。

======================================
异常:
1.系统自带的异常—预定义异常
2.我们写代码报的异常—自定义异常

1.预定义异常
too_many_rows : 行太多
no_data_found : 数据未找到

例示:预定义异常:
declare sid number;
shiredate emp.hiredate%type;
sb shiredate%type;
begin
sid:=7369;
select hiredate into shiredate from emp;
dbms_output.put_line(shiredate);
–异常
exception --发生异常就会报错
when too_many_rows then
dbms_output.put_line(‘行太多’);
end;

例示:自定义异常
三步:声明,判断,捕捉

iee exception;

raise iee;

exception when iee then
dbms_output.put_line(‘错误信息’);
when too_many_rows then
dbms_output.put_line(‘错误信息’);
……

可以带多个异常体

===============================================

函数:
create or replace function f_name [(参数1,参数2…)]
return 类型
is/as

[local declarations] --函数体里面的变量声明全放该位置

begin
–执行体
return
–异常
end;

–案例:给编号,返回工资’交税’还是’刚好’,还是’努力’
create or replace function f_n126(sid number)
return varchar2
is

ssal number(8,2);
str varchar2(22); --注意,该处不用declare定义

begin
select sal into ssal from emp where empno=sid;
if ssal>3500 then
str:=‘交税’;
elsif ssal=3500 then
str:=‘刚好’;
else
str:=‘努力’;
end if;
return str;
end;

–如何调用函数?
–oracle调用方式:
select f_n126(7369) from dual;

–pl/sql调用方式:
declare str varchar2(22);
begin
str:=f_n126(7369);
dbms_output.put_line(str);
end;

自定义异常===================================
declare n_s number(5);
e_my exception;
pragma exception_init(e_my,-20001);
begin
select count(stuname) into n_s from stuinfo where stuname like ‘赵%’;
if n_s=0 then
raise e_my;
end if;
dbms_output.put_line(‘数量是’||n_s);

exception when e_my thendbms_output.put_line('人员为空');

end;

=函数=============================================
create or replace function my_temp(n_s in varchar2, n_max in out number)
return number is
n_tavg number(5, 2);
begin
select avg(stuage),max(stuage) into n_tavg,n_max from stuinfo where stuname like n_s||‘%’;
return n_tavg;
end;

create or replace function my_sum(n_a in number)
return number
is
n_sum number(5):=0;
begin

for int_s in 1…n_a loop
n_sum:=n_sum+int_s;
end loop;
return n_sum;
end;

数据库对象

1.数据库对象
2.同义词
3.序列
4.视图
5.索引

Oracle中比较有特色的:同义词、序列

1.数据库对象
又称模式对象,是逻辑结构的集合。
最基本的数据库对象就是表。

数据逻辑结构:指的是存在一种或多种特定关系的数据元素集合。
通俗点:就是把数据元素形象地进行了有规则排列,但不用考虑在计算机上如何实现。
再通俗点:就是数据有规则的排列。表不就是有规则的排列吗?

数据库对象包括:
同义词、序列、视图、索引、表、函数、包、过程、触发器等。

指针

===========================================

2.同义词synonym
同义词——现有对象的一个别名。
(同义司对网管而言是个非常霸气的东西)
Oracle只有一个数据库,用户的访问是通过表空间分隔开的,一般来说两个用户之间不能相互访问,但现在A用户要B用户分享某个表中的数据,那B的表空间就要给A分配个权限。

如果只共享表空间中的某个表中的一部分数据,怎么共享?
----将某个表共享,但这也向其他用户曝露了表,存在安全问题。因此,我们给要共享的表设置个同义词(别名),将同义词共享给其他用户。举例:
同义词就好比我们要给这个对象取别名,也就是我们所称的“外号”,比如张新宇你们叫他“锤子”,“锤子”就是他的外号;如果某天来个IS来找“锤子”,他找得到么?找不到,“锤子”是不是很安全?IS找门卫问这里有个叫“锤子”的没有?门卫当他傻啊,如果说要找张新宇,找不找得到?找得到。同义词分类:
1.私有同义词;--  只有自己使用; 只能在其模式内访问,且不能与当前模式的对象同名。
2.公有同义词;--  搞个别名给大家使用;公有同义词可被所有的数据库用户访问。同义词作用:
1. 提高安全性
2. 主要用于资源共享。模式==对象。

1.私有同义词
语法:
Create [or replace] Synonym syn_emp For scott.emp;
–Synonym 同义词
–syn_emp 指scott.emp表的同义词(别名)
–scott.emp 是模式名(对象名),其中emp是表名。
如果当前是用scott账户在操作,则可以省略scott.

2.公有同义词
语法:
create public synonym syn_emp for scott.emp;
–syn_emp 同义词名(别名)

注意:
在创建私有同义词时,发现scott也没有权限创建,要让scott有创建的权限,就需要用管理员权限给scott授权。

为某个账户授权同义词:
grant create synonym to scott;

注意:权限授出后,一定要收回(取消授权),否则会乱套。
取消授权:
revoke create synonym from scott;

以上是授权私有同义词,那么公有的同义词呢?
公有的同义词不能授权,也就是普通账户不能创建公有同义词,除非是管理员账户。

3.同义词的操作

调用:
select * from syn_emp;
–syn_emp 为同义词名(别名)

删除:
Drop Synonym syn_emp; --删除私有同义词
Drop Public Synonym syn_emp; --删除公有同义词

创建或替换(修改):
create or replace sysnonym syn_emp for scott.emp;

===========================================

三、序列
oracle中没有标识列,就是序列,标识列可以做好多东西,有替代品—序列,比标识列麻烦的多。 序列+触发器

什么是序列?
序列是用于生成唯一的、连续的序号 的对象。
序列有升序和降序。一般都是升序。

1,2,3,4,5,6,7,8

序列有什么用?
能为我们生成一组连续的,永远不重复的一组数字。
主要用于提供主键值,做分页。序列就是我们所学的sql server中的标识列:
标识种子——从什么数字开始,常用1
标识增量——每次增加的数

1.创建序列语法<色’昆死>
create sequence 序列名称
[start with 1] – (种子)从n开始计数
[increment by 1] – (增量)每次递增n,负数为递减 <英’克瑞门特>
[maxvalue n | nomaxvalue] – 最大值
[minvalue n | nominvalue] – 最小值,(没太多含义)
[cycle | nocycle] – 循环/不循环<塞叩>
[cache n | nocache]; – 分配并存入到内存中

–案例:
create sequence seq_110
start with 1
increment by 1
maxvalue 99999
minvalue 1;

2.使用序列
通过序列的伪列来访问序列的值。
nextval——返回序列的下一个值(一直往下,永远不回头,取下一个,指针在下一个值上面)
currval——返回序列的当前值(取当前的,指针永远在当前值上面)

id 1,2,3,6,4,5,

–案例:
–查下一个(显示的值不会回头,没有回头的,有回头程序就有问题了)
select seq_110.nextval from dual;
(显示的值1,2,3,4,5,……,永远不会回头,显示相同的数字)

--查当前
select seq_110.currval from dual;

注意:
1.序列不要轻易的删掉
在SQL Server中,有标识列1,2,3,4的数据,如果删除标识列4的,再增加一条记录,标识列是5。
在Oracle中,如为某表定义了序列,删除中间的某条记录,情况和SQL Server中一样,但是如果把该表的序列删掉,再创建序列,那么情况就不一样了。

学生信息表
1,2,3,4,5 , 6, 7,8,9, 10, 11, 13 ,1 ,2 ,3

序列,currval nextval 13

学号为7的学生成绩表 7,90 80

1,2,3,4,5,6,7,8,9

所以创建序列这里就不能用:create or replace sequence seq_110;

2.create sequence seq_110; 不写了,可不可以?结果会是什么?
就是标识列,默认的属性,种子1,递增1,最大值?我也不知道,无聊你们自己去试。

**************************************
思考:既然序列是一组唯一、有序的数字,那在触发器insert时,把序列当做id插入,是否就可以达到了标识列的效果呢?
**************************************

insert into tb_name(tid,tname,tprice)
values(1,‘张三’,100);
insert into tb_name(tid,tname,tprice)
values(2,‘李四’,100);
insert into tb_name(tid,tname,tprice)
values(3,‘李四’,100);
insert into tb_name(tid,tname,tprice)
values(4,‘李四’,100);

create sequence seq_110; //创建一个序列

insert into tb_name(tid,tname,tprice)
values(seq_110.nextval,‘张三’,100); --序列当前值的下一个值

insert into tb_name(tid,tname,tprice)
values(seq_110.nextval,‘李国’,100);

select seq_110.currval from dual; --序列当前值

要搞清楚这个思路:
在往表里插入一条或多条数据时,会自动执行insert的触发器,
那么我在编写insert触发器时,手动的将序列放入到触发器,
每次执行插入一条数据时,添加了一个序列进去。

不过有些麻烦,要在oracle中做成标识列,要触发器。

(每次插入时搞个触发器,然后在他插入之前,去修改一下他插入的那张临时表inserted,把表里的值就调用这个序列的nextval,这样看上去就看是个标识列。)

比oracle要麻烦,要强大,有前触发,有后触发。(第三学期要经常写这些)思考:如果有100个表,要写多少个序列?1个还是100个?都行,没有标准的。
如果写一个,100个表共用一个序列,那会造成每个表中的标识列不连贯,比如:
A表:
序列1,2,3,4,9,10,11,……1,2,3,4,5,6,7,8
B表:
序列5,6,7,8,12,13,14,……1,2,3,4,注意:尽量做到一个表一个触发器一个序列。A表  seq_110序列1,2,3,5。。。。。。B表  seq_120
序列1,2,3,4,5

4.更改和删除序列
更改序列:
alter sequence seq_110 maxvalue 5000 cycle;
注意:不能更改序列的start with参数
尽量不要修改,一旦修改会出问题,如果实在要改,先删了再创建序列。

删除序列:
drop sequence seq_110;

===========================================

四、视图
通过定制的方式显示来自一个或多个表的数据。
说白了:视图就是一个虚拟表,就是一段查询的SQL语句。
好处:安全性,降低了程序的复杂程度

–例如:emp查询每个员工的名字、薪水、奖金、收入、部门名称dept

–建议:先写查询语句,再去搞视图
–第1步写查询语句:
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal+nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno=b.deptno;

是不是每个人都要写这么长段代码?不用,我们根据这需求创建个视图,以后别人要看,就直接调用这个视图名就行了。

–创建这个需求的视图
create or replace view v_emps
as
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal+nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno=b.deptno;

注意:如果这时运行报错:没有权限,则要通过sys或system账户给scott赋view的权限。
grant create view to scott;

–调用视图:
select * from v_emps;

思考:
–1. 视图是否可以调用视图?(肯定)
–案例:我现在只要姓名,薪水,奖金3个列
create or replace view v_empb
as
select 姓名,薪水,奖金 from v_emps;

–2. 视图是否可以无限次嵌套?(应该不行,SQL Server最多是32层,Oracle中应该也差不多)

–3. 视图的数据是否可以直接修改?(视图的数据保存在表里,视图只是一张虚拟的表)
理论上来说是可以修改的,这个修改是在修改基表上的数据;
但有一种合成、聚合的数据,比如“收入”是由薪水+奖金,是不能被修改的。

-------联接视图(要操作)
关于+的,+号在右—>左联 left outer join
+号在左—>右联 right outer join
左右都有+号—>全联 full outer join

-------视图上的DML语句

-------视图中的函数

===========================================

五、索引
是数据库内部编排数据的一种方法。
优点:提高查询速度

–创建索引
Create Index index_name on Tablename(colname,colname…)
tablespace 表空间名;
–不能使用or replace

–重建索引(修改)
Alter Index index_name Rebuild;

–删除索引
Drop Index index_name;

–唯一索引
Create Unique Index index_name On Tablename(colname);

–组合索引
create index index_name on tablename(colname1,colname2,……);

–反向键索引

–位图索引

–索引组织表
好处:把数据存储在与其关联的索引中
最大优点:访问数据都是基于组件
就是教大家创建表

===========================================

一、触发器
1.三种操作: delete update insert
2.两个临时表: :new :old
3.两个时间点: after before
4.两种重要模式: 行级 语句级
5.条件: when

Oracle中的触发器比SQL Server要复杂;
SQL Server中增删改操作只会触发一个事件,但在Oracle中会触发两个事件。
以delete为例,Oracle有个删除前事件 before 、删除后事件 after。
Oracle触发器分:前触发、后触发

1.什么是触发器?
(1) 触发器是一种特殊的存储过程;
(2) 触发器不能被直接调用,也不是手动启动,而是由事件来触发;–增删改
(3) 触发器经常用于加强数据的完整性约束和业务规则等。
(4) 触发器具备事务的功能。
简单点说:触发器就是个开关,负责灯的亮与灭,你动了它就亮了。

Oracle触发器比SQL Server的要复杂,有触发前before与触发后after。

标识列:序列+触发器:

create or replace trigger t_insert
before insert
on tb_715
for each row
begin
–新表中的id=序列的下一个值
select seq715.nextval into :new.sid from dual;
end;

                          <a name="o"> HTML:</a>

什么是HTML:

HTML:Hyper Text Markup Language 超文本标签语言

HTML:网页的“源码”

浏览器:“解释和执行”HTML源码的工具

单词:

<html>
<head>头
<title></title>标题
</head>
<body>身体
<h1>。。。。<h6>标题标签
<p/>段落
<br/>换行
<hr/>水平线
<img />图片
<ol><li></li></ol>有序
<ul><li></li></ul> 无序
<div></div> 层
<dl><dd></dd><dt></dt></dl>块级标签
<marquee></marquee>跑马灯
<span></span> 文字
</body>
</html>
color 颜色
height 高度
size 大小
font-size文字大小
width 宽度
direction 方位
&nbsp;空格
align 文本显示
center 居中
left 居左
right 居右

特殊符号:

空格:

大于(>):>

小于(<): <

引号(”):"

版权号() :©

type 功能 例子
text 单行文本输入
password 密码
radio 单选 男

checkbox 多选 书

reset 重置表单数据
file 文件上传
submit 提交表单数据
image 图形提交按钮
button 普通按钮

css:层叠样式表
内部样式:
行内样式:
头部样式:id选择器 类选择器 元素选择器

盒子属性:

margin(外边距/边界)

border(边框)

padding(内边距/填充 )

超链接样式的四种状态:

未访问状态(a:link )

已访问状态(a:visited )

鼠标移上状态(a:hover )

激活选定状态(a:active )

             <a name="p">JavaScript:</a>

1.JS能做什么?我们重点学习什么?
2.JS的组成(ECMAScript、DOM、BOM)
3.JS的运行原理(见图)
4.JS的使用(内嵌、外部、缩写)
5.JS核心语法(变量、数据类型typeof()、输入输出、运算符号、控制语句、注释、语法约定)

Java与Javascript比较:
Java代码需要编译才能执行,而JS代码不需要编译就能执行;
Java是基于服务端的语言,JS是基于客户端的语言。
(什么叫基于服务端和基于客户端?简单理解,就是需要在服务端执行的或需要在客户端执行的。)

==========================================

提升前端用户体验、交互;
拼的不是功能,是用户体验和性能
三大基友:html+css+js

css层叠样式表

==========================================

JavaScript学习重点:表单验证

==========================================
表单验证:
在向服务器提交前,先做判断输入的信息是否符合要求;
不符合的立即提示用户,符合的就把数据往服务器发送。

==========================================

DOM–文档对象模型
Document

BOM–浏览器对象模型
Brow Object Model

一、JS的基本语法
脚本:平时写的代码。

1.内置JS代码

2.document.write(“”);
//输出一个字符串
document.write(“hello world”); //显示一行字符串
document.write(1234); //显示一行数字
document.write(sname); //显示变量的值

============

js区分大小写
js语句结尾尽量写分号
大部分语法与java相同
js中注释与java相同

============

3.声明变量
3.1 var 变量名=值;
3.2 变量名=值;
注意:变量的数据类型由存入的数据来决定

var i=100; //i是数值型number
var a=‘aabb’; //a是字符串型string
var b=“aabb”; //b是字符串型string

//注意:在js中不明显区分单双引号。

换行:document.write(“你好!
”); //让“你好!”变红色:
document.write(“你好!
”)

var x,y,z=10;
//只有z是10,x和y声明了但没赋值。

  1. 内部js与外部js
    外部js的调用:

  2. 数据类型
    typeof(x) //返回x的类型

undefined 未定义,变量被声明后,未被赋值
boolean true和false
string 用单引号或双引号来声明的字符串
number 整数或浮点数
object javascript中的对象、数组和null

  1. 运算符
    只做运算,不做取整
    alert(10/3); //3.33333335
    alert(parseInt(10/3)); //取整数部分:3

  2. if语句

  3. switch语句
    穿透
    case 10:

case 11:

  1. while语句,for语句

  2. break,continue

  3. 弹出消息框
    4.1
    alert(“消息框内容”);
    写在控件里面:

    4.2
    询问消息对话框:带确定和取消按钮的
    confirm(“你确定要删吗?”);
    怎么判断点的是确定还是取消?
    confirm()返回的是boolean类型,点“确定”返回true,点“取消”返回false。
    if(confirm(“你确定要删除?”)){
    document.write(“点了确定”);
    }else{
    document.write(“点了取消”);
    }

    4.3
    输入消息对话框
    prompt(“提示信息”,“输入框的默认信息”);

    prompt(“请输入姓名”,“张三”);

    prompt(“请输入姓名”);

    对输入的信息进行捕捉:
    var a=prompt(“请输入”,“0”);
    var b=prompt(“请输入”,“0”);
    var c=a+b; //注意,这里的+是连接符
    alert©;

    prompt()得到的数据类型是字符串,+变成了连接符。

函数和windows对象

一、函数
函数的定义:类似于Java中的方法,是完成特定任务的代码语句块。

  1. 系统函数
    eval(<表达式>)
    //得到一个文本框的值(表单)
    例:var sname=eval(“doucment.form.sname.value”);

    parseInt(“字符串”)
    //将字符串转换为整型数字

    parseFloat(“字符串”)
    //将字符串转换为浮点型数字

    isNaN()
    //用于检查其参数是否是非数字
    alert(isNaN(“55”));

  2. 自定义函数
    2.1 无参函数
    function 函数名(){
    //javascript代码;
    }
    2.2 有参函数
    function 函数名(参数1,参数2,…){
    //javascript代码;
    }
    2.3 带返回值函数(无参)
    function 函数名(){
    return 返回值或变量;
    }
    2.4 带返回值函数(有参)
    function 函数名(参数1,参数2,…){
    return 返回值或变量;
    }

  3. 函数的调用
    3.1 外部调用:

    3.2 内部调用:

    注意:函数不可以跨页面调用。但可以通过将函数写入js文件,页面调用该js文件,通过js代码重用来实现。

二、函数实现代码的重用
重用的概念:重复使用

2.1 获得文本框的值:
var ia=document.getElementById(“ID”).value;

2.2 为文本框赋值:
document.getElementById(“ID”).value=“11111”;

三、局部变量和全局变量
写在方法体的里面的变量称为局部变量;
写在方法体之外的变量称为全局变量。

四、window对象
常用属性:
screen: 有关客户端的屏幕和显示性能的信息
history: 有关客户访问过的URL的信息
location: 有关当前URL的信息

常用方法:
prompt: 显示可提示用户输入的对话框
alert: 显示带有提示信息和确定按钮的对话框
confirm: 显示一个带有提示信息、确定和取消的对话框--window.open("1.html");//打开新的指定页面  【注意路径级别】
--location.href("1.html");//不打开新页面的前提下直接进入新页面
--location.reload();//刷新当前页面
--window.close();//关闭当前页面
--history.back();//返回 必须有历史记录 history.go(-1)
--history.forward();//前进 必须有历史记录 history.go(1)setTimeout: 在指定的毫秒数后调用函数或计算表达式
setInterval: 按照指定的周期来调用函数或表达式常用事件:
onload:一个页面或一个图像完成加载
onmouseover:鼠标移到某元素之上
onclick:点击对象
onkeydown:某个按键按下
onchange:域的内容被改变

五、匿名调用函数
匿名函数:没有名字的函数。

例1:
onload()
①//直接放在body里 等body加载完毕后才执行

     ②function test(){alert("哈哈哈");}window.onload=test;③window.onload=function(){alert("哈哈哈");匿名函数}

六、时间对象
Date对象:时间对象、日期对象。

格式:
var 日期对象=new Date(参数)
//获得当前日期,参数格式:MM DD,YYYY,hh:mm:ss:ms案例:
var today=new Date(); //返回当前日期和时间
var tdate=new Date("september 1,2015,12:23:33");Date对象的方法:
setXxx:设置时间
getXxx:得到时间Xxx包括:
FullYear: 当前年
Month:    0~11(一月至十二月)
Day:      0~6(星期几)
Date:     1~31
Hours:    0~23
Seconds和Minutes:0~59

案例:
var today=new Date(); //获取当前时间
var year=today.getFullYear(); //得到年
var month=today.getMonth(); //得到月
var day=today.getDay(); //得到星期几
var date=today.getDate(); //得到日
var hh=today.getHours(); //得到时
var mm=today.getMinutes(); //得到分
var ss=today.getSeconds(); //得到秒

//将字符串的值写入到html中某个ID中
var dd=year+“年”+month+“月”+date+“日”;
var da=document.getElementById(“da”);
da.innerHTML=dd; //innerHTML获取对象的内容或向对象插入内容

让时间一直在显示:setInterval()方法

function mm(){
setInterval(“函数名”,1000);
//每隔1秒自动执行
setTimeout(“函数名”,1000);
//等待1秒后执行一次
}

面试题:setInterval()与setTimeout()的区别

思考:用setTimeout()方法实现读秒(采用递归)
思考:当页面加载时就显示时间(onload)

七、数学函数Math
Math.abs(x) //返回数的绝对值
Math.ceil(x) //返回比x大的最小整数 Math.ceil(34.5)–35
Math.floor(x) //返回比x小的最大整数 Math.floor(34.5)–34
Math.random() //返回0~1之间的随机数
Math.round(x) //四舍五入取整
Math.sqrt(x) //返回数的平方根

类别 名称 描述
属性 Rows[] 返回包含表格中所有行的一个数组
方法 insertRow() 在表格中插入一个新行
deleteRow() 从表格中删除一行

属性 cells[] 返回包含行中所有单元格的一个数组
rowIndex 返回该行在表中的位置
方法 insertCell() 在一行中的指定位置插入一个空的标签
deleteCell() 删除行中指定的单元格

javascript与css

目标:
1.使用style属性制作菜单特效;
2.使用className属性制作菜单特效;
3.使用scrollTop制作随鼠标滚动的广告图片;

一、通过js修改元素的样式

二、js菜单
1.写好样式;
2.写好函数;
3.不同事件调用不同函数。

当有很多行代码相同时,例如:

  • 第一行
  • 第二行
  • 第三行
  • ……

    以上代码相同的,相同的

  • 和事件
    JS简化写思路:
    1.获得
  • 标签对象集合
    2.循环集合中的对象,对象.事件=function(){}
  • 代码:
    var arr=document.getElementByTagName(“li”);
    for(var i=0; i<arr.length; i++){
    arr[i].className=“vb”;
    arr[i].οnmοuseοver=function(){
    this.className=“va”;
    };
    arr[i].οnmοuseοut=function(){
    this.className=“vb”;
    }
    }

    三、动态改变文字样式

    四、图片跟随滚动条
    获取类样式的方法:
    currentStyle
    getComputedStyle()

    网页的三维:x,y,z
    层的浮动:position:absolute;
    top:20px;
    left:20px;
    right:20px;
    bottom:20px;

    滚动事件:
    currentStyle
    //得到当前样式
    currentStyle.top //当前与top

    与top的距离
    与left的距离
    scrollTop滚动距离

                 <a name="q"> jQuery:   </a>
    

    了解什么是jQuery以及其基本语法:
    例如: 如何用jQuery去获取文本框的值? id=“aa”
    $(“#aa”).val();

          js的window.onload在jQuery里如何表示?$(document).ready(function(){});$(function(){})   jQuery里如何动态设置样式css的? 单个属性和多个属性的区别?$("div").css("color","red");$("div").css({键:值,键:值});jQuery的事件?点击事件?失焦事件?该如何表示?等等$("#btn").click/blur/mouseover(function(){})
    

    开发版本
    生产版本
    测试版本

    推荐自学网址:
    1.https://jquery.cuishifeng.cn/(在线API文档)
    2.http://www.w3school.com.cn/(w3school 在线教程)

    推荐使用浏览器:谷歌

    推荐使用开发工具:HBuilder

    一、$工具方法

    $.each(要遍历的对象,回调函数) 下标,元素
    $.type() 得到数据类型
    $.trim() 去除前后空格
    $.isArray()/isFunction()判断是否是数组/函数
    $.parseJSON() 解析json格式的字符串–>js的对象/数组

    二、jQuery属性和CSS

    attr()拿值 设值
    removeAttr() 移除属性值
    addClass() 增加样式
    removeClass() 移除样式
    prop():比较适合用于boolean的情况
    html():包含子标签
    text():只会拿到纯文本
    val() value值

    单属性:.css(“样式”,“样式值”)
    多属性:.css({“样式”:“样式值”,“样式”:“样式值”})

    rgba(0-255,0-1)

    一、筛选
    –过滤:first() last() eq() filter() has() not()
    –查找:children() parent() find() prevAll() nextAll() siblings()

    二、文档处理
    –插入:
    append/appendTo prepend/prependTo
    after/before
    –修改:
    replaceWith

    –删除:
    empty()
    remove()

    三、补充知识点:位置
    position 父容器
    offset 大容器
    返回顶部 $(“body,html”).scrollTop()

    一、事件
    探讨加载DOM两种方式(顺序+个数)
    绑定事件的两种方式
    元素.事件名(回调函数)
    元素.on/bind(事件名,回调函数)
    解绑事件的两种方式 off/unbind
    事件的传播:从小到大传播 return false
    事件的坐标:pageX pageY
    合成事件:hover/toggle
    一次事件:one

    二、动画效果
    自带动画:
    基本动画: show() hide() toggle()
    滑动动画: slideDown() slideUp() slideToggle()
    淡入淡出动画:fadeIn() fadeOut() fadeToggle()
    自定义动画:
    元素.animate({
    宽高top left “10px” “+=5”
    },time);
    javaweb:
    Bootstrap:

    easyui:

Javabase到easyui的知识总结相关推荐

  1. 程序员转正述职报告_程序员转正述职报告

    指缝太宽,时间太瘦.我于2018年3月进入公司做net程序开发,转眼间已经快三个月了.三个月,是考核的时间,更是磨练和适应融合公司的时间.初来公司,曾担心和同事的相处问题,但公司融洽的工作氛围.团结向 ...

  2. easyUI的基本知识

    今天我们来了解一下easyui,并且利用easyui写一个首页 网页地址 http://www.jeasyui.net/(中文网) http://www.jeasyui.com/(英文版) EasyU ...

  3. JQuery EasyUI的常用组件

    jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件,该框架提供了创建网页所需的一切,帮助您轻松建立站点. 注:本次介绍的JQuery EasyUI版本为1.5版. 一 ...

  4. (转)基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

    http://www.cnblogs.com/wuhuacong/p/3317223.html 在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的 ...

  5. layui与eazyui的区别_jquery easyui和layui的区别是什么?

    jquery easyui和bootstrap的区别是什么? JQueryEasyUIJQueryEasyUI是一组基于jQuery的UI插件集合体,而jQueryEasyUI的目标就是帮助web开发 ...

  6. EasyUI 树菜单

    EasyUI 树菜单 通过ssm框架项目实现EasyUI 的树菜单的单选,复选,异步加载树,同步加载树和树权限控制等功能. 本章知识点 效果图: 需求:通过SSM框架,实现EasyUI 树菜单的单选, ...

  7. 基础知识漫谈(1): 想到哪儿写到哪儿

    http://www.cnblogs.com/anrainie/p/5606570.html ***************************** 一.想到哪儿写到哪儿 给公司新员工培训,和网上 ...

  8. jQuery EasyUI使用教程之创建可折叠面板

    2019独角兽企业重金招聘Python工程师标准>>> <jQuery EasyUI最新版下载> 在本教程中,你将学习到有关于easyui折叠面板的知识.折叠面板包含了一 ...

  9. Python介绍与特点(自学python知识整理)

    Python介绍与特点(自学python知识整理) Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计: Python 是一种解释 ...

最新文章

  1. Python之format格式化输出
  2. 版本变迁_冰枪?卢登?大天使?——从发条魔灵的装备变迁看版本变动
  3. 每天一道LeetCode-----重排链表,节点顺序是从头取一个,从尾取一个,从头取一个,从尾取一个.....
  4. pyecharts简单使用
  5. windows 下安装 elasticsearch 以及 head 管理插件
  6. 【Flink】Flink 1.12.2 SlotManager
  7. Domino服务器以及Notes客户端重新配置的方法
  8. 关于sqlmap的配置和基本使用教程
  9. 方舟生存进化秘籍大全
  10. Office server webs app 集成(JAVA)
  11. codevs 5960 信使x
  12. 通话记录有办法恢复吗?
  13. 云原生爱好者周刊:Grafana Loki 免费电子书
  14. JS中Math对象的方法
  15. 转载 :make报错:/usr/bin/ld: cannot find -lXXX
  16. Java——七种垃圾收集器+JDK11最新ZGC
  17. 定时任务——@Scheduled注解做定时任务
  18. matlab syms min,科学网—Matlab中的syms与conj - 孔令才的博文
  19. 微信聊天api接口调用
  20. TerminateThread 导致LoadLibary 死锁

热门文章

  1. 【Android 】零基础到飞升 | Gestures(手势)
  2. Apache Sedona(GeoSpark) spatial join 源码解析
  3. 用javascript 动态改变iframe 的src 属性
  4. 获取a标签的src属性
  5. excel中 复制工作表_如何在Excel 2013中轻松移动或复制工作表
  6. 计算机期末考试成绩分析,计算机操作员考试成绩分析
  7. LoL_Skip使用说明(英雄联盟换肤工具)
  8. 重装系统十大排行:一键重装系统对比
  9. 淘宝客微信机器人SDK调用接口
  10. 循环判断核酸检测结果+logistics模型拟合确诊数据