文章目录

  • properties类
  • InetAddress类
  • 网络编程
    • 三要素:
  • 反射
    • 获取Person类字节码文件对象
    • 获取指定的构造方法
    • 创建该类实例
    • 获取成员变量
    • 获取成员方法
  • 设计模式:
  • Mysql数据库

properties类

  • Properties 类表示了一个持久的属性集 ,没有泛型(属性列表中的键和值都是String)

  • 它继承自Hashtable<K,V> implements Map<K,V>

  • Map集合的遍历:

  • 通用的方式

  •    keySet()---->Set<K>
    
  •      get(K key)---->V value
    
  • Properites属性集合类的特有功能

  • public Object setProperty(String key, String value):添加键和值

  • public Set stringPropertyNames():获取属性列表中的所有的键的集合

  • public String getProperty(String key):通过键获取值

  • public void load(Reader reader):将一些配置文件中的数据加载到属性集合类中

  • public void store(Writer writer, String comments)

  • 将属性集合类中数据保存到指定的文件中

*需求:

  • 在当前项目下user.txt文件 ,如果当前文件中lisi这个键,将它的值改为
  • 78,然后重新将值写入到user.txt文件(既要用到load(Reader r),
  •      还要用到store(Writer w,String comments))
    

InetAddress类

  • java.net.InetAddress类:互联网ip地址统称
  • 这个类没有构造方法,不能直接创建对象!,提供一些成员方法使用:静态的
  • Runtime类: 单例模式
  • 提供静态方法,返回该类本身
  • public static InetAddress getByName(String host):
  • 参数为:主机名称:
  • 成员方法
  • public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。
  • public String getHostName():获取主机名

网络编程

三要素:

协议 ip地址 端口号
网络协议
UDP和TCP

UDP和TCP协议的区别:

1)是否需要建立连接通道
UDP:不需要建立通道 (QQ聊天,发短信)
TCP:需要建立连接通道(打电话…)

2)是否是可靠连接(是否安全)
UDP:是一种不可靠连接,不安全–执行效率高
TCP:是一种可靠连接,服务器端一直阻塞状态(同步的—安全性),执行效率低
三次握手,四次挥手!
3)共同点
UDP/TCP —两端都需要有Socket(Socket编程)

应用协议
http协议
https协议(比上http协议)

第一要素:
ip地址
192.168.138.1: 使用点分十进制法

A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码  (政府部门)
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码 (大学校园)
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码(私人地址)127.0.0.1:回环地址:表示本机  ---- 域名:localhostxxx.xxx.xxx.255 广播地址


第二个要素:端口号

使用360软件—查看当前计算机中每个软件 的端口号
有效端口号:0-65535
0-1024:保留端口号

http://www.baidu.com
http://192.168.25.1:80(可以不写)/xx
一般:80端口号:是不写的(省略)
常见端口号
tomcat: 8080
redis:6575… (数据库—非关系型数据库 key-value )
mysql软件:3306

  • UDP协议发送端的步骤
  • 1)创建发送端的Socket对象
  • 2)数据数据报包对象:DatagramPacket
  • 3)发送数据
  • 4)关闭资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;/*** UDP协议发送端的步骤* * 1)创建发送端的Socket对象* 2)数据数据报包对象:DatagramPacket* 3)发送数据* 4)关闭资源* **/
public class SendDemo {public static void main(String[] args) throws IOException {//1)创建发送端的Socket对象//DatagramSocket//此类表示用来发送和接收数据报包的套接字。//public DatagramSocket()DatagramSocket ds = new DatagramSocket() ;//2)创建数据数据报包对象:DatagramPacket//数据报包用来实现无连接包投递服务//public DatagramPacket(byte[] buf,//  int length,//InetAddress address,//int port)//参数1:当前发送数据的字节数组//参数2:当前数据的实际长度//参数3:ip地址对象//参数4:端口号:0-1024保留端口 (0-65535)String s = "hello,udp,我来了" ;byte[] bytes = s.getBytes() ;int length = bytes.length ;DatagramPacket dp = new DatagramPacket(bytes, length,InetAddress.getByName("10.12.156.36"), 10086) ;//3)发送数据报包 //public void send(DatagramPacket p)ds.send(dp);//释放资源ds.close();}
}
  • UDP协议接收端的实现步骤
  • 1)创建接收端的Socket对象,绑定端口号
  • 2)创建一个数据报包—DatagramPacket:当前接收容器
  • public DatagramPacket(byte[] buf,int length)
  • 3)接收数据
  • 4)从接收容器中解析实际数据
  • 5)展示数据
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** UDP协议接收端的实现步骤* * 1)创建接收端的Socket对象,绑定端口号* 2)创建一个数据报包---DatagramPacket:当前接收容器* public DatagramPacket(byte[] buf,int length)* 3)接收数据* 4)从接收容器中解析实际数据* 5)展示数据**/
public class ReceiveDemo {public static void main(String[] args)  throws IOException{//1)创建接收端的Socket对象,绑定端口号
//      public DatagramSocket(int port)DatagramSocket ds = new DatagramSocket(10086) ;//2)创建一个数据报包---DatagramPacket:当前接收容器// public DatagramPacket(byte[] buf,int length)byte[] bytes = new byte[1024] ;int length = bytes.length ;DatagramPacket dp = new DatagramPacket(bytes, length) ;//3)接收数据
//      public void receive(DatagramPacket p)ds.receive(dp);//4)解析当前接收容器中的实际数据//public byte[] getData():获取缓冲区数据中实际字节数组//public int getLength():获取缓冲区中实际长度byte[] buf = dp.getData() ;int length2 = dp.getLength() ; //获取接收端发送的数据:ip地址
//      public InetAddress getAddress()InetAddress address = dp.getAddress() ;String ip = address.getHostAddress() ;//展示数据String s = new String(buf,0,length2) ;System.out.println("data is: "+s+",from  "+ip);//关闭资源ds.close();}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** * 需求* UDP*     发送端键盘录入数据,接收端不断接收数据(不关闭)* * * 键盘录入数据*   Scanner*  使用字符流的方式*  BufferedReader(new InputStreamReader(System.in))***/
public class SendDemo {public static void main(String[] args) throws IOException {//1)创建发送端的Socket对象DatagramSocket ds = new DatagramSocket() ;//2)键盘录入数据//创建bufferedReader类对象BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;//一次读取一行内容String line = null ;while((line=br.readLine())!=null) {//自定义结束条件if(line.equals("886")) {break ;}//line:发送的数据byte[] bytes = line.getBytes() ;int length = bytes.length ;//创建数据报包对象DatagramPacket dp = new DatagramPacket(bytes, length, InetAddress.getByName("10.12.156.36"),10000) ;//发送数据ds.send(dp);}//释放资源ds.close();}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;//接收端不断接收收据,并解析
public class ReceiveDemo {public static void main(String[] args) throws IOException {//创建一个接收端的SocketDatagramSocket ds = new DatagramSocket(10000) ;//不断接收数据while(true) {//创建接收容器byte[] bytes = new byte[1024] ;int length = bytes.length ;DatagramPacket dp = new DatagramPacket(bytes , length) ;//接收ds.receive(dp);//解析真实数据String str = new String(dp.getData(), 0, dp.getLength()) ;//获取ip地址String ip = dp.getAddress().getHostAddress() ;//展示数据System.out.println("data is :"+str+"from "+ip);}//接收端不关闭}
}
  • TCP协议
  • 基本使用:
  • 客户端的实现步骤
  • 1)创建客户端的Socket对象 java.net.Socket(套接字)
  • public Socket(String host,int port)
  • 2)获取客户端通道内输出流,写入内容
  • 3)关闭资源
public class ClientDemo {public static void main(String[] args) throws  IOException {//创建客户端的Socket对象//public Socket(String host,int port)Socket s = new Socket("10.12.156.36", 8888) ;//获取客户端通道内输出流,写入内容//public OutputStream getOutputStream()OutputStream out = s.getOutputStream() ;out.write("hello,TCP,我来了".getBytes());//释放资源s.close();}
}
  • TCP
  • 服务器端基本使用
  • 步骤
  • 1)创建服务器端的Socket对象,绑定端口
  • 2)进入阻塞状态,监听客户端连接!
  • 3)获取动态内输入流,读数据
  • 4)展示数据
  • 5)释放资源
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** * TCP* 服务器端基本使用* * 步骤*  1)创建服务器端的Socket对象,绑定端口*     2)进入阻塞状态,监听客户端连接!*  3)获取动态内输入流,读数据*     4)展示数据*  5)释放资源*/
public class ServerDemo {public static void main(String[] args) throws IOException {//1)创建服务器端的Socket对象,绑定端口//public ServerSocket(int port)ServerSocket ss = new ServerSocket(8888) ;//2)进入阻塞状态,监听客户端连接!//public Socket accept()Socket s = ss.accept() ;//3)获取动态内输入流,读数据//public InputStream getInputStream()InputStream in = s.getInputStream() ;//读数据//一次读取一个字节数组byte[] bytes = new byte[1024] ;int len = in.read(bytes) ;//展示数据String clienStr = new String(bytes,0,len) ;//public InetAddress getInetAddress()String ip = s.getInetAddress().getHostAddress() ;//输出System.out.println("data is:"+clienStr+",from :"+ip);//释放资源ss.close();}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/*** * * 客户端发送数据"hello,Server,我来了"* 服务器端将数据读取出来,展示* * 服务器端还需要加入反馈操作,"我收到了"* 客户端需要将反馈信息读取 出来*
public class ClientDemo {public static void main(String[] args) throws IOException {//创建客户端的socketSocket socket = new Socket("10.12.156.36",6666) ;//获取通道内的输出流OutputStream out = socket.getOutputStream() ;out.write("hello,Server,我来了".getBytes());//读取服务器端的反馈数据//获取通道内的输入流对象InputStream in = socket.getInputStream() ;//一次读取一个字节数组byte[] bytes = new byte[1024] ;int len = in.read(bytes) ;//展示数据String serverStr = new String(bytes, 0, len) ;System.out.println(serverStr);//释放资源socket.close();}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** 服务器端还需要加入反馈操作,"我收到了"* 客户端需要将反馈信息读取 出来* * 注意事项:* 服务器端不要开启多次,就会出现BindException:绑定异常: 端口号被占用!*
public class ServerDemo {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(6666) ;//监听客户端的链接Socket socket = ss.accept() ;//获取通道输入流,读取数据InputStream in = socket.getInputStream() ;//一次读取一个字节数组byte[] bytes = new byte[1024] ;int len = in.read(bytes) ;//展示数据:客户端发来的数据String clientStr = new String(bytes, 0, len) ;System.out.println(clientStr);//服务器端反馈给客户端//获取通道内的输出流对象OutputStream out = socket.getOutputStream() ;out.write("数据已经收到了".getBytes());//释放资源ss.close();}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;/*** 需求*     键盘录入:BufferedReader* 1)客户端不断键盘录入数据,服务器端不断将数据展示在控制台上* * *
public class ClientTest {public static void main(String[] args) throws IOException {//创建客户端SocketSocket socket = new Socket("10.12.156.36", 2222) ;//)客户端不断键盘录入数据//创建字符输入流:BufferedReaderBufferedReader br =new BufferedReader(new InputStreamReader(System.in)) ;//OutputStream getOutputStream():通道内的字节输出流//输出流需要和BufferedReader对应:  BufferedWriter:字符输出流//将节输出流封装成BuffferedWriter   :字符流通向字节流的桥梁 OutputStreamWriterBufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;//一次读取一行数据:键盘录入 数据,写入到BufferedWriter中String line = null ;while((line=br.readLine())!=null) {//结束条件if(line.equals("over")) {break ;}//录入一行,写入到bw流中bw.write(line);bw.newLine();bw.flush();}//释放资源socket.close();}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;//服务器端不断将数据展示在控制台上
public class ServerTest {public static void main(String[] args) throws IOException {//创建服务器端的Socket对象ServerSocket ss = new ServerSocket(2222) ;//监听客户端连接Socket socket = ss.accept() ;//不断的去读取数据//获取通道内输入流:将封装 成BufferedReaderBufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;String line = null ;while((line=br.readLine())!=null) {//输出数据System.out.println(line);}//服务器端不关闭}
}

反射

  • 什么是反射:
  • 反射就是通过获取类的字节码文件对象:Class
  • 创建该类的实例(通过构造方法:Constroctor类),调用成员方法(Method类),
  • 给成员变量赋值(Field类)

获取Person类字节码文件对象

Class c = Class.forName(“com.qianfeng.reflect_01.Person”) ;

获取指定的构造方法

//获取单个的构造方法
//Person(String) :是一个私有的,不是公共的
// public Constructor getDeclaredConstructor(Class<?>… parameterTypes)
//获取指定的构造方法
//Constructor con = c.getDeclaredConstructor(String.class) ;

//public void setAccessible(boolean flag):参数为true,取消java语言访问检查con.setAccessible(true);

创建该类实例

Object obj = con.newInstance() ; //p对象

获取成员变量

​ //public Field[] getDeclaredFields():获取所有的Field成员变量(公共的,私有的,默认的,受保护的)
​ //public Field[] getFields():获取所有的公共的字段
​ //Field[] fields = c.getDeclaredFields() ;

Field field = c.getDeclaredField(“name”) ;
//取消Java语言访问检查
field.setAccessible(true);

field.set(obj, “高圆圆”); // 相当于:p.name = “高圆圆”
System.out.println(obj);

获取成员方法

public Method getDeclaredMethod(String name,
//Class<?>… parameterTypes)获取指定的方法
//public Method getMethod(String name,Class<?>… parameterTypes)
//获取公共的成员方法
//参数1:方法名
//参数2:当前如果该方法有形式参数,跟上行驶时参数类型的Class

Method m = c.getMethod(“show”) ;

m.invoke(obj) ;

Method m2 = c.getMethod(“method”, int.class) ;
Object object = m2.invoke(obj, 100) ;

Method m3 = c.getDeclaredMethod(“function”, String.class) ;
//取消Java语言访问检查
m3.setAccessible(true);

m3.invoke(obj, “hello,张佳宁”)

  • 设计模式:

  • 结构型设计模式:

  •  代理模式
    
  •      静态代理
    
  •      动态代理
    
  •          jdk动态代理
    
  •          CGlib动态代理
    
  • 静态代理:--------Thread 的实现方式2 implements Runnable接口

  •  真实角色:专注于自己的功能
    
  •  代理角色:帮助真实角色对实际的方法进行增强
    
  •      都需要实现指定的接口'
    
  • 动态代理:在程序的运行过程中产生的代理类

  •  JDK动态代理
    
  •  Proxy 提供用于创建动态代理类和实例的静态方法
    
  • 静态方法:

  • public static Object newProxyInstance
    (
    ClassLoader loader,
    Class<?>[] interfaces,
    InvocationHandler h
    )

    参数1:表示类的加载器
    参数2:获取类的接口列表的Class字节码文件
    参数3:代理实例的处理程序 接口:InvocationHandler

       JDK动态代理:在程序运行过程中,通过反射的产生的代理类(Proxy以及它里面代理的处理程序:InvocationHandler)
    
  • 举例:

  •  让代理角色完成一些事情(帮
    
  • 助真实角色—对其功能进行增强)

Mysql数据库

-- 使用图形化工具--- 前期写sql语句(练)
-- 进入到mydb_04数据库中
#注释(类上语法语气词)
USE mydb_04;
-- 在mydb_04数据库中创建一张表 student
-- 编号 int类型
-- 姓名 varchar(5)
-- 年龄 int类型
-- 性别 varchar(2)
-- 成绩 double(3,1)
-- 出生日期 data(日期)
CREATE TABLE student(id INT, -- 编号NAME VARCHAR(5), -- 姓名age INT , -- 年龄gender VARCHAR(2) , -- 性别socre DOUBLE(3,1) , -- 成绩birthday DATE);
-- 查询表的结构
DESC student;
-- DML语句:操作语句
-- 插入数据1) (给表中的每一个字段赋值)
-- insert into 表名 values(值1,值2,值3,.....)
INSERT INTO student VALUES(1,'高圆圆',27,'女',99.8,'1990-2-3') ;
-- 插入部分字段2)
-- 注意事项:没有赋值的字段都是NULL(空值)
-- insert into 表名(id,name,age,gender) values(值1,....) ;
INSERT INTO student(id,NAME,age,gender) VALUES(2,'张冲',23,'男') ;
-- 注意事项:
-- 1)插入数据的时候,插入字段顺序必须要表的字段对应上
INSERT INTO student  VALUES('李文擘',3,23,'男',90.8,'1997-11-5') ;
-- 2)如果是给全部字段插入数据,中间逗号隔开,依次插入多条语句!
INSERT INTO student VALUES (3,'赵又廷',38,'男',66.9,'1987-11-5'),(4,'唐宇飞',26,'男',89.9,'1995-11-2') ;
-- 删除表的记录
-- delete from 表名 条件(where)
-- 带条件删除
DELETE FROM student WHERE socre = 90.8 ;
-- 删除全表数据:
--- TRUNCATE table 表名 和 delete from 表名 有什么区别?
-- 1)delete from 表名:删除全表数据  TRUNCATE table 表名 :删除表以及表中的数据--创建一张一模一样的表
-- 2)是否对自增长的主键影响?
/*delete from 表名 不会影响自增长的主键(删除全表的数据)(不会清除自增长主键!)TRUNCATE TABLE 表名 :直接删除了表(并且同时创建一张一模一样的表):自增长主键会清除掉!*/
CREATE TABLE stu(id INT PRIMARY KEY AUTO_INCREMENT  , -- 增长的主键 NAME VARCHAR(5),age INT
) ;
DROP TABLE stu ;
SELECT * FROM stu ;
INSERT INTO stu VALUES(1,'张三',20),(2,'李四',22) ;
INSERT INTO stu(NAME,age) VALUES('张钰',29) ;
-- delete from 表名
DELETE FROM stu;
TRUNCATE TABLE stu ;
-- 修改表
-- 带条件修改单个字段
-- update 表名 set 字段名 = 赋值 where 字段 = 值;
UPDATE student SET NAME = '张杨' WHERE id = 2 ;
-- 注意:update语句都需要带上where条件,否则就是"批量修改"
UPDATE student SET NAME = '高圆圆' ;
-- 修改多个字段 :将id=4的这个人 name='张冲' 并将年龄改成23
UPDATE student SET NAME = '张冲',age = 23 WHERE id = 4 ;
-- DQL语句 数据库的查询语句
-- 基本的查询语句
-- select 全部字段(*) from 表名;  查询全表数据
SELECT * FROM student ;
-- 查询指定的字段
-- 需求:查询id,name,age字段
SELECT id,NAME,ageFROM student ;
--  msyql的基础语法使用
CREATE TABLE student3( id INT, -- 编号 NAME VARCHAR(20), -- 姓名 age INT, -- 年龄sex VARCHAR(5), -- 性别 address VARCHAR(100), -- 地址 math INT, -- 数学 english INT -- 英语
);
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES
(1,'马云',55,'男',' 杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩 ',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港 ',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);
-- 查询全表数据
SELECT * FROM student3;
-- 查询语句
-- 条件查询
--   基本条件查询:where语句
--    条件:使用表达式符号<,>,<=,<=
--    !=(java的语法),<>(不等于 mysql的语法)
--   并列关系:and  &&
--     >=xx  and  <= xx 等价于 between xx and  xx
--   或的关系:or  ||
--   集合in(18,25,19)
--  条件: is null :xxx是null值  不是null   (is not null)-- 基本查询
-- 需求:查询指定的学生信息 姓名和年龄
SELECT NAME,age FROM student3;
-- 需求:查询address地址信息
SELECT  address FROM student3;
-- 将地址去重(select distinct 字段名称:将该字段去查询)
SELECT DISTINCT address FROM student3;
-- select name,address from student3;-- 需求:查询name,总分成绩
SELECT NAME,   (math+english) FROM student3;
-- 查询的时候想给某个字段起别名 需要查询的字段名称 as(省略不写) '名称'
SELECTNAME AS '姓名',(math+english) AS '总分'
FROM student3;-- 注意事项:对两个字段进行求和  两个字段必须一致:int类型(math+english)
-- 当前柳青的英语成绩为null
-- 在获取英语成绩的时候提供一个函数IFNULL(字段名,默认值):如果当前字段名称是null值,
--   使用默认值给它赋值
SELECT NAME '姓名',(math+IFNULL(english,0))FROM student3;SELECT NAME '姓名',age '年龄',sex '性别',address '地址',math '数学',english '英语'FROM student3;USE mydb_04;
SELECT * FROM student3;
-- 条件:使用表达式符号<,>,<=,<=
--    !=(java的语法),<>(不等于 mysql的语法)
--   并列关系:and  &&
--     >=xx  and  <= xx 等价于 between xx and  xx
--   或的关系:or  ||
--   集合in(18,25,19)
--  条件: is null :xxx是null值  不是null   (is not null)
DESC student3 ;-- 需求:查询全表数据
-- 开发中 :跟上全部字段
SELECT * FROM student3;
SELECT id '学号',NAME '姓名',age '年龄',sex '性别',address '家庭住址',math '数学成绩',english '英语成绩'
FROM student3;-- 查询name为马云的人
SELECTage ,sex ,address
FROM student3
WHERE NAME = '马云' ; -- 查询年龄是20的人
SELECT *
FROM student3
WHERE age = 20 ;-- 查询的时候:携带一些表达式符号
-- 查询年龄大于20的人
SELECT *
FROM student3
WHERE age >= 20 ; -- >= :大于或者等于这个值-- 需求:查询年龄在20岁和30岁之间的人(包含两端)
SELECT id '学号',age '年龄',NAME '姓名',sex '性别',address '地址'FROM student3WHERE age >=20 && age <=30;-- and语法(推荐这种方式)
SELECT id '学号',age '年龄',NAME '姓名',sex '性别',address '地址'FROM student3WHERE age >=20 AND age <=30;-- between...and...
SELECT id '学号',age '年龄',NAME '姓名',sex '性别',address '地址'FROM student3 WHERE age BETWEEN 20 AND 30 ;-- 需求:查询英语成绩为null的学生信息/*
mysql 多行注释
select *
from student3
where english = null ; xxx是null---Mysql is null
*/
SELECT *
FROM  student3
WHERE english IS NULL ;-- 查询英语成绩不为空的学生信息
SELECT *
FROM student3
WHERE english IS NOT NULL ;-- 需求:查询年龄不等于20岁的学生信息
SELECT id, NAME,age,sex,address
FROM
student3
WHERE age != 20 ; -- java语法:!=  ,
-- 推荐mysql语法:<> 不等于SELECT id, NAME,age,sex,address
FROM
student3
WHERE age <> 20 ;-- 需求:查询年龄是25岁或者18岁或者20岁的人
SELECT *
FROM student3
WHERE age = 25 || age =18 || age =20; -- or连接或者是||连接-- in(集合数据)SELECT*
FROM student3
WHERE age IN(25,18,20);-- 模糊条件查询 关键字:like
-- 两个符号
-- %:表示多个任意字符
-- _:代表一个字符
-- 语法格式:select 字段名称 from 表名 where 某个字段 like '模糊符号..'-- 查询姓马的人的学生信息
SELECT *
FROM student3
WHERENAME LIKE '马%' ;-- 查询学生姓名带有第二个字符带有化的 学生信息
SELECT*
FROM student3
WHERENAME LIKE '_化%' ;-- 查询学生姓名中有三个字的人
SELECT *
FROMstudent3
WHERENAME LIKE '___' ;-- 查询学生姓名中包含"德"的人
SELECT*
FROM student3
WHERE NAME LIKE '%德%' ;-- 如果dos中出现中文乱码---查询所有包含'character'的变量
SHOW VARIABLES LIKE '%character%' ; -- 模糊查询--  order by :排序查询
-- asc :升序排序
-- desc:降序排序
-- select 字段名称列表 from 表名 order by  排序的字段 排序规则;
-- 学生表中:按照数学成绩升序排序
-- 如果执行排序的时候,某个字段后面没有跟排序规则:默认升序排序   (整数类型)
SELECT*
FROM    student3
ORDER BY math ASC ;-- 需求:按照英语成绩降序排序,并且查询出name,年龄,英语成绩
SELECTNAME,age,english
FROM student3
ORDER BYenglish DESC ;-- 修改表:id=7的英语成绩!
UPDATE student3SET english = 96
WHERE id = 7 ;-- 针对多个字段同时排序
-- 需求:查询全表数据,数学成绩升序,英语成绩降序!
SELECT id,NAME,math,IFNULL(english,0)
FROM student3
ORDER BY math ASC,english DESC ;
-- 多个字段同时排序:优先按照第一个字段的排序规则,-- 第一个字段排序值如果相同,这个时候再按照第二个字段规则排序-- 聚合函数
-- count函数,max函数,min函数,avg函数,sum函数
-- 使用最多就是count  统计 总记录数
-- avg使用多 统计平均分-- 需求:统计当前表中总记录数有多少条
SELECT COUNT(NAME) '人数'
FROM student3 ;/*由于英语成绩:有一个人null值,忽略了
select count(english) from student3;
*/-- count 的使用:一般都是里面用的非业务字段
/*每一张表都有id字段 (非业务字段)id设置的是一个自增长主键 (非空并且唯一的)count(id)*/
SELECT COUNT(id) '总记录数'
FROM student3;-- 需求:查询数学成绩的的最高分的学生信息
-- 聚合函数:单条单列的信息
SELECTMAX(math)
FROM student3;
-- 查询英语平均分
SELECTSUM(math+IFNULL(english,0)) '总分',AVG(IFNULL(english,0))  '英语平均分'
FROM student3;-- 分组查询 group by 分组字段-- 分组查询:查询的是哪些字段-- 查询的字段:可以是分组字段,使用聚合函数
/*GROUP BY分组查询,如果带有条件进行分组查询,要先去判断条件,在进行分组先where,后group by*/-- 需求:查询数学平均分并且按照性别进行分组
SELECTsex '性别',AVG(math) '数学平均分'FROM student3
GROUP BY sex ;-- 需求:查询数学的平均分 并且按照性别分组: 条件 数学成绩小于70分的学生不参与分组/*
selectsex '性别',avg(math) '数学平均分'
from student3
GROUP by sex
where math > 70;*/
SELECTsex '性别',-- 分组的字段AVG(math) '数学平均分'
FROM student3
WHERE math > 70
GROUP BY sex ;-- 帅选having
-- 需求:查询数学的平均分 并且按照性别分组: 条件 数学成绩小于70分的学生不参与分组
--  帅选条件:总人数大于2等于个人的
-- having 是需要放在group by 后面,不能放置在group by 之前
SELECT sex '性别',AVG(math) '数学平局分',COUNT(id)
FROMstudent3
WHERE math > 70
GROUP BY sex
HAVING COUNT(id)>= 2;-- 另一种写法
SELECT sex '性别',AVG(math) '数学平局分',COUNT(id) 人数
FROMstudent3
WHERE math > 70
GROUP BY sex
HAVING 人数 >= 2;-- having和group by的区别
-- group by是在where条件后面用,  不能使用聚合函数的!但是查询的时候可以查询聚合函数
-- having是在group by 后面使用  ,后面使用聚合函数-- 分页查询
-- 在mysql :limit关键字
-- 语法格式:limit 起始行数,每页显示的条数-- 起始行数:从0开始
-- 每页展示3条数
-- 查询第一页的数据
SELECT*
FROM student3
LIMIT 0,3;-- 查询第二页的数据:每页3条
-- limit 起始行数=(当前页码数-1)*每页显示的条数,每页显示条件
SELECT*
FROM student3
LIMIT 3,3;-- 查询第三页:每页3条
SELECT *
FROM student3
LIMIT 6,3 ;-- 自己模拟多条记录使用分页查询SELECT * FROM student3;
-- 数据库的约束
-- 约束:通过一些特定的关键字 保证数据的安全性,正确性和有效性!-- 数据库的约束
-- 默认约束 字段名称 类型 default '值'
-- 非空约束 not null
-- 唯一约束 unique
-- 主键约束 primary key
-- 自增长约束 auto_increment
-- 外键约束 foreign keyUSE mydb_04;
-- 新建一张表
CREATE TABLE stu(id INT ,-- 学号NAME VARCHAR(3) -- 姓名
) ;DROP TABLE stu ;INSERT INTO stu VALUES(1,'张三','男') ,(2,'王五','男') ;
SELECT * FROM stu ;
-- 加入一列 :修改表
-- 加入性别字段
ALTER TABLE stu ADD gender VARCHAR(2) ;
-- 问题当前表中存在null值(没意义的)
-- 插入的时候:插入部分字段,没有赋值的字段是null
INSERT INTO stu(id,NAME) VALUES(3,'赵六') ;-- 为了防止没有插入的字段是null值,可以在创建表的时候加入非空约束
-- default默认约束:是当某个字段没有赋值的时候起作用,如果赋值了,那么按照实际值 赋值即可!
CREATE TABLE stu(id INT ,-- 学号NAME VARCHAR(3), -- 姓名gender VARCHAR(2) DEFAULT '男'
) ;
INSERT INTO stu(id,NAME) VALUES(1,'张冲') ;
INSERT INTO stu VALUES(2,'王五','女') ;
INSERT INTO stu VALUE(3,'袁一鸣',NULL) ; -- 数据不安全(默认约束还是存在问题!)SELECT * FROM stu ;DROP TABLE stu ;-- 非空约束 not null
-- 创建表的时候加入非空约束
CREATE TABLE stu(id INT,NAME VARCHAR(3) NOT NULL -- 姓名不能null值
);-- 插入全部字段数据
INSERT INTO stu VALUES(1,'张佳宁'),(2,'高圆圆'),(3,'王晓晨') ;INSERT INTO stu VALUES(4,NULL) ;-- 当前name值不能null -- Column 'name' cannot be null  列name不能为空
INSERT INTO stu VALUE(4,' ') ;    -- 插入空字符串
DELETE FROM stu WHERE id = 4 ; -- 将非空约束干掉
-- 修改表的字段类型
ALTER TABLE stu MODIFY NAME VARCHAR(3) ;
INSERT INTO stu VALUES(4,NULL) ;
DELETE FROM stu WHERE id = 4 ;-- 修改表:再加入非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(3) NOT NULL ;SELECT * FROM stu ;
DROP TABLE stu ;-- 唯一约束 unique
-- 创建表的时候加入唯一约束
CREATE TABLE stu(id INT,phone_number VARCHAR(11) UNIQUE
) ;-- 插入数据
INSERT INTO stu VALUES(1,'18666668888') ;
-- insert into stu values(2,'18666668888') ;-- 字段不能重复 (UNIQUE 唯一)
INSERT INTO stu VALUES(2,'18266668888') ;
INSERT INTO stu VALUES(3,'18266668888') ;
DELETE FROM stu WHERE id  = 3 ;
SELECT * FROM stu ;-- 修改表:删除唯一约束
-- alter table stu modify phone_number varchar(11) ;
-- alter table 表名 drop index 带有唯一约束的字段名称;
ALTER TABLE stu DROP INDEX phone_number;-- 修改表:添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(11) UNIQUE ;
INSERT INTO stu VALUES(3,'18266668888') ; -- 当前加入唯一约束 不能重复DROP TABLE stu ;-- 主键约束 primary key
-- 特点:非空且唯一
CREATE TABLE stu(INT PRIMARY KEY , -- 主键都应用在非业务字段上 NAME VARCHAR(5)
);
INSERT INTO stu VALUES(1,'张佳宁'),(2,'高圆圆') ;
-- insert into stu values(1,'王晓晨') ; -- id值不能重复的!
-- insert into stu values(null,'王晓晨') ;-- Column 'id' cannot be null id不能null/*一个表中非业务字段 + 业务子弹id              name  age  sex gender music通过id设置主键---是唯一的并且非空举例:大学的学生的数据库name      age  sex  张三         20  男name      age  sex  李三         20  男业务字段可能随着需求的变化不断变化,都不会再业务字段上加入primary key
都是给每一张表设置id字段,并且主键+自增长*/-- 通过修改表:删除主键
-- alter table 表名 drop PRIMARY KEY ;
ALTER TABLE stu DROP PRIMARY KEY ;
-- 添加主键约束
ALTER TABLE stu MODIFY id INT PRIMARY KEY ;INSERT INTO stu VALUES(1,'张三') ;DELETE FROM stu WHERE NAME = '张三' ;
SELECT * FROM stu ;DROP TABLE stu ;-- 自增长约束 auto_increment
CREATE TABLE stu(id INT PRIMARY KEY AUTO_INCREMENT, -- 自增长约束(id值自增从起始索引0一直++)NAME VARCHAR(3)
) ;
INSERT INTO stu(NAME) VALUES('高圆圆') ;
INSERT INTO stu(NAME) VALUES('赵又廷') ;INSERT INTO stu VALUES(5,'张佳宁') ;
INSERT INTO stu(NAME) VALUES('姚笛') ;SELECT * FROM stu ;
-- 删除 自增长约束
ALTER TABLE stu MODIFY id INT;  -- 删除了自增长约束,主键约束还在
INSERT INTO stu(NAME) VALUES('文章');  -- 没有给id插入值,默认null 主键约束了,给默认值0DELETE FROM stu WHERE id = 0 ;
-- 添加 自增长约束ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;INSERT INTO stu(NAME) VALUES('林允儿');-- 外键约束:让多个表之间产生一种关系,来保证数据的安全性和有效性!
-- 创建员工表:employee
-- 员工编号 主键 并且自增长
-- 员工姓名
-- 员工部门名称CREATE TABLE employee (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(5),  -- 员工姓名dept_name VARCHAR(10)  -- 员工的部门名称
); -- 插入数据
INSERT INTO employee(NAME,dept_name) VALUES('张三','研发部') ;
INSERT INTO employee(NAME,dept_name) VALUES('李四','销售部') ;
INSERT INTO employee(NAME,dept_name) VALUES('王五','研发部') ;
INSERT INTO employee(NAME,dept_name) VALUES('赵六','销售部') ;
INSERT INTO employee(NAME,dept_name) VALUES('马七','测试部') ;
INSERT INTO employee(NAME,dept_name) VALUES('高圆圆','研发部') ;SELECT * FROM employee ;DROP TABLE employee ;
-- 上面的表的结构-----数据库的设计  部门名称:字段值大量冗余(重复名称)
-- 解决字段的冗余问题
-- 方案:单独的在创建一张表:部门表 dept表   存储者三个部门:研发部,测试部,销售部-- 部门表
-- 主表:没有外键的表
CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, -- 部门表的主键+自增长iddept_name VARCHAR(10) -- 部门名称) ;-- 插入三个部门INSERT INTO dept(dept_name) VALUES('研发部') ;INSERT INTO dept(dept_name) VALUES('销售部') ;INSERT INTO dept(dept_name) VALUES('测试部') ;-- 创建员工表CREATE TABLE employee(id INT PRIMARY KEY AUTO_INCREMENT,-- 员工表的主键idNAME VARCHAR(5) , -- 员工姓名-- 定义字段:部门id -- 它的值和部门表的主键id 有关系dept_id INT );-- 插入员工信息INSERT INTO employee(NAME,dept_id) VALUES('张三',1) ;
INSERT INTO employee(NAME,dept_id) VALUES('李四',2) ;
INSERT INTO employee(NAME,dept_id) VALUES('王五',1) ;
INSERT INTO employee(NAME,dept_id) VALUES('赵六',2) ;
INSERT INTO employee(NAME,dept_id) VALUES('马七',3) ;
INSERT INTO employee(NAME,dept_id) VALUES('高圆圆',1)  ;-- 上面优化--已经 中文数据字段冗余问题: 创建一个部门表:将部门名称单独在该表中INSERT INTO employee(NAME,dept_id) VALUES('张冲',5) ;-- 问题:往员工表中插入一条不存在的部门数据,依然可以插入成功(存在非法数据!)DROP TABLE dept ;
DROP  TABLE employee  ;
-- 为了防止非法数据,加入一种潜在关系 外界约束
-- 给某个字段设置外键约束
-- constraint(声明) 外键名称() foreign key -- (员工表的dept_id)  reference(关联) 部门表的主键id SELECT * FROM dept ; -- 查询部门表SELECT * FROM emploee  ; -- 员工表-- 员工表:从表:外键是声明在从表上CREATE TABLE emploee(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(5) ,dept_id INT,CONSTRAINT dept_emp_fk FOREIGN KEY (dept_id) REFERENCES  dept(id) ) ;INSERT INTO emploee(NAME,dept_id) VALUES('张三',1) ;
INSERT INTO emploee(NAME,dept_id) VALUES('李四',2) ;
INSERT INTO emploee(NAME,dept_id) VALUES('王五',1) ;
INSERT INTO emploee(NAME,dept_id) VALUES('赵六',2) ;
INSERT INTO emploee(NAME,dept_id) VALUES('马七',3) ;
INSERT INTO emploee(NAME,dept_id) VALUES('高圆圆',1)  SELECT * FROM dept ; -- 查询部门表SELECT * FROM emploee  ; -- 员工表INSERT INTO emploee (NAME,dept_id) VALUES('张三丰',4) ; -- 当前4号部门不存在-- 如果先 存在4号部门-- 给员工表中添加数据-- 对于外键的关系表:主表,从表(外键)-- 添加或者修改操作:先修改主表,这个从表
INSERT INTO dept(dept_name) VALUES('市场部') ; 

NAME VARCHAR(5) , – 员工姓名
– 定义字段:部门id – 它的值和部门表的主键id 有关系
dept_id INT
);

– 插入员工信息
INSERT INTO employee(NAME,dept_id) VALUES(‘张三’,1) ;
INSERT INTO employee(NAME,dept_id) VALUES(‘李四’,2) ;
INSERT INTO employee(NAME,dept_id) VALUES(‘王五’,1) ;
INSERT INTO employee(NAME,dept_id) VALUES(‘赵六’,2) ;
INSERT INTO employee(NAME,dept_id) VALUES(‘马七’,3) ;
INSERT INTO employee(NAME,dept_id) VALUES(‘高圆圆’,1) ;

– 上面优化–已经 中文数据字段冗余问题: 创建一个部门表:将部门名称单独在该表中

INSERT INTO employee(NAME,dept_id) VALUES(‘张冲’,5) ;
– 问题:往员工表中插入一条不存在的部门数据,依然可以插入成功(存在非法数据!)

DROP TABLE dept ;
DROP TABLE employee ;
– 为了防止非法数据,加入一种潜在关系 外界约束
– 给某个字段设置外键约束
– constraint(声明) 外键名称() foreign key
– (员工表的dept_id) reference(关联) 部门表的主键id

SELECT * FROM dept ; – 查询部门表
SELECT * FROM emploee ; – 员工表
– 员工表:从表:外键是声明在从表上
CREATE TABLE emploee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(5) ,
dept_id INT,
CONSTRAINT dept_emp_fk FOREIGN KEY (dept_id)
REFERENCES dept(id)
) ;

INSERT INTO emploee(NAME,dept_id) VALUES(‘张三’,1) ;
INSERT INTO emploee(NAME,dept_id) VALUES(‘李四’,2) ;
INSERT INTO emploee(NAME,dept_id) VALUES(‘王五’,1) ;
INSERT INTO emploee(NAME,dept_id) VALUES(‘赵六’,2) ;
INSERT INTO emploee(NAME,dept_id) VALUES(‘马七’,3) ;
INSERT INTO emploee(NAME,dept_id) VALUES(‘高圆圆’,1)

SELECT * FROM dept ; – 查询部门表
SELECT * FROM emploee ; – 员工表
INSERT INTO emploee (NAME,dept_id) VALUES(‘张三丰’,4) ; – 当前4号部门不存在
– 如果先 存在4号部门-- 给员工表中添加数据
– 对于外键的关系表:主表,从表(外键)
– 添加或者修改操作:先修改主表,这个从表
INSERT INTO dept(dept_name) VALUES(‘市场部’) ;


Properties类,InetAddress类,网络编程,反射,Mysql数据库相关推荐

  1. qn模块java脚本_Qn271 对于网络编程 反射 IO 线程的一些一本入门程序 多多联系会加快 速度 WinSock-NDIS 269万源代码下载- www.pudn.com...

    文件名称: Qn271下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 673 KB 上传时间: 2015-05-13 下载次数: 0 提 供 者: 褚晓旦 详细 ...

  2. mysql connector安装教程_通过安装MySQL Connector/Net实现VS2017 C#编程连接MySQL数据库-网络教程与技术 -亦是美网络...

    对编程有一定了解的小伙伴都知道,一般情况下使用微软的visual studio进行编程开发都会搭配自家的SQL server.Access数据库,而开发web程序一般情况下PHP搭配MySQL使用,但 ...

  3. 电子词典——项目(文件编程、网络编程、sqlte3数据库)

    基于文件IO.网络编程.sqlite3数据库--电子词典 一.电子词典主功能介绍 1.注册:客户端发起注册请求,服务器检测到请求后从用户数据库中遍历是否有该账号存在,若没有则直接注册:若存在该账号则注 ...

  4. (006)网络编程,反射及其应用,MySQL数据库

    摘要 : 本周感觉学的好多,网络编程UDP/TCP网络协议,通信读取传输文件,反射的思想,相关方法,JDK动态代理,数据库DDL数据库定义语句,DML数据库操作语句,DQL数据库查询语句,以及6种约束 ...

  5. python 面向对象编程tcp_python面向对象、类、socket网络编程

    类和对象 python3统一了类与类型的概念:类==类型:从一组对象中提取相似的部分就是类:特征与技能的结合体就叫做对象: 类的功能: 初始实例化: 属性引用: 1.数据属性: 2.函数属性: 对于一 ...

  6. 网络编程和mysql

    网络的相关概念 网络通信 1.概念:两台设备之间通过网络实现数据传输 2.网络通信:将数据通过网络从一台设备传输到另一台设备 3.java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信 ...

  7. week_06_动态代理,工厂方法,单例,File,IO,网络编程,反射,数据库语句

    动态代理 动态代理核心思想: 再程序执行过程中通过一些特殊的方式产生代理 jdk动态代理: 前提必须有一个接口 java.lang.reflect.Proxy:提供了创建动态代理类和实例的静态方法 p ...

  8. Python基础教程(十):CGI编程、MySQL数据库

    Python CGI编程 什么是CGI CGI 目前由NCSA维护,NCSA定义CGI如下: CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如: ...

  9. android 如何读取cgi_Python基础教程(十):CGI编程、MySQL数据库

    Python CGI编程 什么是CGI CGI 目前由NCSA维护,NCSA定义CGI如下: CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如: ...

最新文章

  1. 2022图机器学习必读的11大研究趋势和方向: 微分方程/子图表示/图谱理论/非对称/动态性/鲁棒性/通用性/强化学习/图量子等...
  2. python使用opencv_Python使用OpenCV进行标定
  3. view桌面池计算机显示错误,学员问答之3-View桌面问题
  4. C++项目參考解答:求Fibonacci数列
  5. sitecore系列教程之如何以编程方式将访客数据关联到联系人卡片
  6. java右移位_java中的左移 右移
  7. 如何使普通用户授权加入域的权限个数多于十个
  8. 一道自创的招聘测试题
  9. 单个用户OWA登陆失败,提示用户名和密码错误
  10. Nginx+Tomcat web站(Linux)   动静站分离
  11. 多线程Thread和Runnable
  12. Scrapy爬虫框架,入门案例(非常详细)
  13. C++使用类和对象(谭浩强9.8-9.14)
  14. c语言句子后移两位加密,用C语言实现对输入的引英文句子进行加密
  15. 轻健身餐的市场前景如何?如何选择一个投资小、美食和健身餐清淡的品牌?
  16. 应用内添加原生广告,变现与用户体验可兼得
  17. Android中ListView下拉刷新的实现
  18. 微信小程序-slot插槽
  19. ssm+Vue计算机毕业设计学科竞赛赛场安排系统(程序+LW文档)
  20. x265 命令行参数大全

热门文章

  1. excel smart流程图增加_使用Excel2010的SmatrArt模板创建流程图的方法
  2. GIS技巧100例—03 ArcGIS导入SketchUp模型
  3. 3dmax文件导入sketchup方法
  4. 基于聚类的异常值检测算法依据及python实现
  5. Three.js - 绘制一个有房子的场景(二十三)
  6. HJ40 统计字符 【python3】
  7. GL3510创维一路进四路出HUB芯片方案,扩展坞方案,资源
  8. 【华硕 Armoury crate 中 GameVisual 更新色彩配置文件 GameVisual下载失败服务器响应超时问题解决】
  9. 云计算的IaaS、SaaS和PaaS基本理解和认识
  10. 【企业架构】投资企业架构工具的 6 个理由