MySQL(2)
MySQL day02
1、关于查询结果集的去重?
12345678910111213141516171819202122232425262728293031323334353637383940// select job from emp group by job;mysql> select distinct job from emp; // distinct关键字去除重复记录。+-----------+| job |+-----------+| CLERK || SALESMAN || MANAGER || ANALYST || PRESIDENT |+-----------+ mysql> select ename,distinct job from emp;以上的sql语句是错误的。记住:distinct只能出现在所有字段的最前面。mysql> select distinct deptno,job from emp;+--------+-----------+| deptno | job |+--------+-----------+| 20 | CLERK || 30 | SALESMAN || 20 | MANAGER || 30 | MANAGER || 10 | MANAGER || 20 | ANALYST || 10 | PRESIDENT || 30 | CLERK || 10 | CLERK |+--------+-----------+案例:统计岗位的数量?select count(distinct job) from emp;+---------------------+| count(distinct job) |+---------------------+| 5 |+---------------------+
2、连接查询
2.1、什么是连接查询?
12345678在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。s ...
MySQL(1)
MySQL day01
1、sql、DB、DBMS分别是什么,他们之间的关系
12345678910111213DB: DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)DBMS: DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)SQL: 结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。 SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。 SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。DBMS -(执行)-> SQL -(操作)-> DB
2、表
123456789101112131415表:table表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。一个表包括行和列: 行:被称为数据/记录(data) 列:被称为字段(column)学号(int) 姓名(varchar) 年龄(int)------------------------------------110 张三 20120 李四 21每一个字段应该包括哪些属性? 字段名、数据类型、相关的约束。
3、学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类呢?
12345DQL(数据查询语言): 查询语句,凡是select语句都是DQL。DML(数据操作语言):insert delete update,对表当中的数据进行增删改。DDL(数据定义语言):create drop alter,对表结构的增删改。TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)DCL(数据控制语言): grant授权、revoke撤销权限等。
4、导入数据(后期大家练习的时候使用这个演示的数据)
12345678910111213141516171819202122232425262728293031第一步:登录mysql数据库管理系统 dos命令窗口: mysql ...
JavaSe:java9 10 11新特性
一、Java9中的新特性
1.1 JDK和JRE目录结构的改变
1.2 模块化系统
模块之间包的调用
现有两个模块,结构如下
现在希望在第一个块的MoudleTest中使用第二个模块中的Person类,直接使用是不行的,使用需要引入暴露和导入的概念
如图:
首先在第二个模块中的src下。新建 moudle-info.java文件
并指明向外暴露的包
1234module java9test { exports guigu.moudletest20210918;}123
然后再需要引用的模块的src下同样新建 moudle-info.java文件
指明需要引入的模块
1234module guigu20210918 { requires java9test;}123
1.3 Java的REPL工具
1.3.1 jShell命令
产生背景
向Python 和Scala之类的语言早就有交互式编程环境(read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。而之前Java版本想执行代码,必须创建文件、声明类、提供测试方法方可实现。
设计理念
即写即得
实现目标
Java 9中拥有的jShell。可以让Java可以像脚本语言一样运行,从控制台启动jShell,利用jShell可以在没有声明类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行java代码,而无需创建Java文件。
jShell也可以从文件中加载语句或将语句保存到文件中
jShell也可以是tab建进行自动补全和自动添加分号
在命令行直接输入 jshell就可以开始写语句了
在shell中编写Java代码也会有相应的提示
/edit命令可以调出JShell Edit Pad,可以在窗口看见已经成功的输出
也可以在JShell Edit Pad中进行修改,修改完成后点击Accept按钮提交修改后在shell内会有修改成功的提示
直接在shell命令内再次定义同名的变量或方法,后建的变量方法会覆盖之前的变量和方法
其他jshell命令
1.4 语法改进:接口的私有方法
Java 9 中,接口中可以定义访问权限为private的方法。
1.5 语 ...
JavaSe:java8新特性
Java8 新特性
Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠覆了之前的认知;java.util.HashMap 数据结构里增加了红黑树;还有众所周知的 Lambda 表达式等等
一、Interface
interface 的设计初衷是面向抽象,提高扩展性。这也留有一点遗憾,Interface 修改的时候,实现它的类也必须跟着改。
为了解决接口的修改与现有的实现不兼容的问题。新 interface 的方法可以用default 或 static修饰,这样就可以有方法体,实现类也不必重写此方法。
一个 interface 中可以有多个方法被它们修饰,这 2 个修饰符的区别主要也是普通方法和静态方法的区别。
default修饰的方法,是普通实例方法,可以用this调用,可以被子类继承、重写。
static修饰的方法,使用上和一般类静态方法一样。但它不能被子类继承,只能用Interface调用。
我们来看一个实际的例子。
123456789101112131415161718192021222324public interface InterfaceNew { static void sm() { System.out.println("interface提供的方式实现"); } static void sm2() { System.out.println("interface提供的方式实现"); } default void def() { System.out.println("interface default方法"); } default void def2() { System.out.println("interface default2方法"); } //须要实现类重写 void f();}public interface InterfaceNew1 { default void def() { System.out.println("InterfaceNew1 default方法"); }}
如果有一个类既 ...
JavaSe:反射
一、反射机制概述
1. 反射的基本概念
Reflection(反射)是被视为动态语言的关键,反射机制允许程序==在运行时借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法==
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。 我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构。所以,我们形象的称之为:反射
2. 反射机制提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时获取泛型信息
在运行时调用任意一个对象的成员变量和方法
在运行时处理注解
生成动态代理
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566import org.junit.Test;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * 反射的功能演示 */public class ReflectionTest { //反射之前,对于Person类的操作 @Test public void test1() { //1. 创建Person类的对象 Person p1 = new Person("Tom", 12); //2. 通过对象,调用其内部的属性和方法 p1.age = 10; System.out.println(p1.toString()); p1.show(); //在Person类的外部,不能通过Person类的对象调用其内部的私有结构 //比如:name、showNation()以及私有的构造器 } //反射之后,对于Person类的操作 @Test ...
JavaSe:网络编程
1️⃣网络编程概述
Java是Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。
Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在Java 的本机安装系统里,由JVM 进行控制。并且Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。
计算机网络:
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。
网络编程的目的:
直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
网络编程中有两个主要的问题:
如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
找到主机后如何可靠高效地进行数据传输
2️⃣网络通信要素概述
通信双方地址
IP
端口号
一定的规则(即:网络通信协议。有两套参考模型)
OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
网络通信协议
1234567891011/** * 一、网络编程中有两个主要的问题: * 1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用 * 2.找到主机后如何可靠高效地进行数据传输 * * 二、网络编程中的两个要素: * 1.对应问题一:IP和端口号 * 2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层) */12345678910
3️⃣信要素1:IP和端口号
IP的理解与InetAddress类的实例化
IP 地址:InetAddress
唯一的标识Internet 上的计算机(通信实体)
本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost
IP地址分类方式1:IPV4和IPV6
IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。以点分十进制表示,如192.168.0.1
IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开,如:3ffe:3201:1401:128 ...
JavaSe:IO(2)
7️⃣对象流
ObjectInputStream和OjbectOutputSteam
用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
对象的序列化
1.对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象
2.序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原
3.序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是JavaEE 平台的基础
4.如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一。否则,会抛出NotSerializableException异常
Serializable
Externalizable
5.凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
private static final long serialVersionUID;
serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版本控制,有关各版本反序列化时是否兼容。
如果类没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID 可能发生变化。故建议,显式声明。
6.简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersi ...
JavaSe:IO
IO流原理及流的分类
原理
1.I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
2.Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。
3.java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
流的分类
1.按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
2.按数据流的流向不同分为:输入流,输出流
3.按流的角色的不同分为:节点流,处理流
字节流通常处理非文本文件
字符流通常用来处理文本文件
1.Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。
2.由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
流的体系结构:
抽象基类
节点流(或文件流)
缓冲流(处理流的一种)
InputStream
FileInputStream
BufferedInputStream
outputStream
FiLeoutputStream
BufferedOutputStream
Reader
FiLeReader
BufferedReader
writer
Filewriter
Bufferedwriter
节点流和处理流
==节点流==:直接从数据源或目的地读写数据
==处理流==:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能
1234567891011121314151617181920212223@Testvoid t1() { //1.实例化File 对象,指明要操作的文件 File file = new File("helloJavaIO.txt"); //2.提供具体的流 FileReader fr = null; try { fr = new FileReader(file); //3.数据的读入 //read() 返回读入的 ...
JavaSe:泛型&IO
⭐java泛型
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。
集合中使用泛型
12345678910111213141516171819202122232425262728293031@Testvoid t4() { ArrayList<Integer> list = new ArrayList<>();//类型推断 list.add(78); list.add(88); list.add(77); list.add(66); // 遍历方式一: for (Integer i : list) { // 不需要强转 System.out.println(i); } //遍历方式二: Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } Map<String, Integer> map = new HashMap<String, Integer>(); map.put("Tom1", 34); map.put("Tom2", 44); map.put("Tom3", 33); map.put("Tom4", 32); //添加失败 //map.put(33, "Tom"); Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); ...
JavaSe:集合-Map
Map接口
并列于Collection
🌟==经典问题==:
1.HashMap的底层实现原理
以jdk7为例说明:
HashMap map = new HashMap( ):在实例化以后,底层创建了长度是16的一维数组Entry[ ] table。…可能已经执行过多次put. . .
map.put( key1, value1):
首先,调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。如果此位置上的数据为空,此时的key1-value1==添加成功==。 ----情况1
如果==此位置上的数据不为空==,(意味着此位置上存在一个或多个数据(以链表形式存在))那么比较key1和已经存在的一个或多个数据的哈希值:
如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功。 ----情况2
如果key1的哈希值和已经存在的某一个数据(key2-value2)的==哈希值相同==,
那么继续比较:调用Key1所在类的equals(key2):
如果equals()返回false:此时key1-value1==添加成功==。 ----情况3
如果equals()返回true:==使用value1替换vaLue2==.
对于情况2 3 ,新添加的键值对以了链表的方式存储
JDK8中的区别:
1.一开始new的时候没要创建一个长度为16的数组
2.JDK8 底层的数组是Node[] ,而非Entry[];
3.首次调用put方法时,底层创建长度为16的数组(与ArrayList JDK8的新特性相同)。
底层是数组 +链表 (JDK7之前)
底层是数组 +链表+红黑树 (JDK8)
==当数组的某一个索引位置上的元素以链表形式存在的数据个数>8且当前数组的长度 >64时,此时的索引位置上的所有数据改为使用红黑树存储==
1234567891011121314@Test void t1() { HashMap map = new HashMap(); map.put(new Person(14, "Tom"), ...