wenzhe published on JDBC核心技术 讲师:宋红康
微博:尚硅谷-宋红康
第1章:JDBC概述 1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
1.2 Java中的数据存储技术 在Java中,数据库存取技术可分为如下几类:
JDBC直接访问数据库
JDO (Java Data Object )技术
第三方O/R工具,如Hibernate, Mybatis 等
JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。
1.3 JDBC介绍 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。 JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。 JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。 如果没有JDBC,那么Java程序访问数据库时是这样的: 有了JDBC,Java程序访问数据库时是这样的: 总结如下: 1.4 JDBC体系结构 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。 JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。
wenzhe published on 目录 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动和停止 ★ MySQL服务的登录和退出 ★ MySQL的常见命令和语法规范 五、DQL语言的学习 ★ 基础查询 ★ 条件查询 ★ 排序查询 ★ 常见函数 ★ 分组函数 ★ 分组查询 ★ 连接查询 ★ 子查询 √ 分页查询 ★ union联合查询 √ 六、DML语言的学习 ★ 插入语句 修改语句 删除语句 七、DDL语言的学习 库和表的管理 √ 常见数据类型介绍 √ 常见约束 √ 八、TCL语言的学习 事务和事务处理 九、视图的讲解 √ 十、变量 十一、存储过程和函数 十二、流程控制结构 1. 为什么要学习数据库 持久化数据到本地 可以实现结构化查询,方便管理 2. 数据库相关概念 DB:数据库,保存一组有组织的数据的容器 DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 SQL:结构化查询语言,用于和DBMS通信的语言 3. 数据库存储数据的特点 将数据放到表中,表再放到库中 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。 表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。 表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性” 表中的数据是按行存储的,每一行类似于java中的“对象”。 4.
1. Java反射机制概述 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 package com.
wenzhe published on 1. 网络编程概述 2. 网络通信要素概述 3. 通信要素1:IP和端口号 4. 通信要素2:网络协议 5. TCP网络编程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 package com.
wenzhe published on 1. File类 File类的使用
File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) File类的声明在java.io包下 File类中涉及到关于文件或文件目录的创建,删除,重命名,修改时间,文件大小等方法。并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点” 1.1 File类的创建 如何创建File类的实例
File(String filePath) File(String parentPath, String childPath) File(File parentPath, String childPath) 相对路径:相较于某个路径下,指明的路径 绝对路径:包含盘符在内的文件或文件目录的路径 路径分隔符 windows:\\ unix:/
1.2 File类的API public String getAbsolutePath():获取绝对路径 public String getPath():获取路径 public String getName():获取名称 public String getParent():获取上层文件目录路径。若无,返回null public long length():获取文件长度(即,字节数)。不能获取目录的长度 public long lastModified():获取最后一次的修改时间,毫秒值 如下的两个方法适用于文件目录 public String[] list():获取指定目录下的所有文件或者文件目录的名称数组 public File[] listFiles:获取指定目录下的所有文件或者文件目录的File数组 public boolean renameTo(File dest):把文件重命名为指定的文件路径 比如:file1.
wenzhe published on 1. 泛型的使用 jdk5.0新增的特性
1.1. 在集合中使用泛型: 总结:
集合接口或集合类在jdk5.0时都修改为带泛型的结构 在实例化集合类时,可以指明具体的泛型类型 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法,构造器,属性)使用到类的泛型的位置,都指定为实例化的泛型类型。 比如:add(E e) —> 实例化以后:add(Integer e) 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类来替换 如果实例化时,没有指明范型的类型,默认类型为java.lang.Object类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 public class GenericTest { // 在集合中使用泛型 @Test public void test1() { ArrayList list = new ArrayList(); list.
wenzhe published on 1. 字符串相关的类 1.1 String的使用 String:字符串,使用一对""引起来表示。
String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小。 String内部定义了final char[] value用于存储字符串数据 String:代表不可变的字符序列。简称:不可变性。 体现: 当对字符串重新赋值时,需要重写指定内存区赋值,不能使用原有的value进行赋值。 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值(因为value是final的)。 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在方法区内的字符串常量池中。 字符串常量池中是不会存储相同内容的字符串的。 结论:
常量与常量的拼接结果在常量池中。且常量池中不会存在相同内容的常量。 只要其中有一个是变量,结果就在堆中 如果拼接的结果调用intern()方法,返回值就在常量池中。 String的实例化方式:
方式一:通过字面量定义的方式 方式二:通过new + 构造器的方式 面试题:String s = new String("abc");方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 package com.
wenzhe published on 1. 基本概念理解 1.1 程序 vs 进程 vs 线程 程序(program)是为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生,存在和消亡的过程。 - 生命周期 如:运行中的QQ,运行中的MP3播放器 程序是静态的,进程是动态的 进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域。 再比如一个运行中的杀毒软件(进程),其中清理文件,查杀木马的运行分别对应一个线程。 线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。 若一个进程同一时间并行执行多个线程,就是支持多线程的 线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开销小。 一个进程中的多个线程共享相同的内存单元/内存地址空间,他们从同一堆中分配对象,可以访问相同的变量和对象。这就使得线程间通信更简便,高效。但多个线程操作共享的系统资源可能就会带来安全的隐患。 1.2 单核CPU vs. 多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费才能通过,那么CPU就好比收费人员。如果有某个人不想交钱,那么收费人员可以把他“挂起”(晾着他,等他想通了,准备好了钱,再去收费)。但是因为CPU时间单元特别短,因此感觉不出来。 如果是多核的话,才能更好的发挥多线程的效率。(现在的服务器都是多核的) 一个Java应用程序java.exe,其实至少有三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。当然如果发生异常,会影响主线程。 1.3 并行与并发 并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事。 并发:一个CPU(采用时间片)同时执行多个任务。比如:秒杀,多个人做同一件事。(Quicksilver changes F1 tires?) 1.4 多线程的优点 背景:以单核CPU为例,只使用单核线程先后完成多个任务(调用多个方法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?
多线程程序的优点:
提高应用程序的响应。对图形化界面更有意义,可增强用户体验。 提高计算机系统CPU的利用率 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改。 何时需要多线程
程序需要同时执行两个或多个任务 程序需要实现一些需要等待的任务时,如用户输入,文件读写操作,网络操作,搜索等。 需要一些后台运行的程序时。 2. 线程的创建和使用 2.1 多线程的创建方式一:继承Thread类 创建一个继承于Thread类的子类 重写Thread类的run() -> 将此线程执行的操作声明在run()中 创建Thread类的子类的对象 通过此对象调用start() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package com.
wenzhe published on 1. static关键字 1.1 static关键字的使用 static: 静态
static可以用来修饰:属性,方法,代码块,内部类
使用static修饰属性: 静态变量(是属性,不是局部变量)或者叫类变量
属性,按是否使用static修饰,有分为静态属性 vs 非静态属性(实例变量)
实例变量:我们创建类类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。 静态变量:我们创建类类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。 static修饰属性的其他说明:
静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用 静态变量的加载要早于对象的创建。 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。 调用 类变量 实例变量 类 yes no 对象 yes yes 静态属性举例: System.out; Math.PI;
使用static修饰方法: 静态方法
随着类的加载而加载,可以通过“类.静态方法”的方式进行调用
调用 静态方法 非静态方法 类 yes no 对象 yes yes 静态方法中,只能调用静态的方法或属性; 非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
wenzhe published on 1. 多态性使用和理解 面向对象特征之三:多态性
理解多态性:可以理解为一个事物的多种形态。
何为多态性:对象的多态性,父类的引用指向子类的对象(或子类的对象赋给父类的引用)
多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边。
便于站在高处(more generalized)指挥,而不局限于实施细节
多态性的使用前提:1)类的继承关系 2)方法的重写
对象的多态性,只适用于方法,不适用于属性。子类不会覆盖父类的同名属性,而是内存都有,编译和运行都看左边。
虚拟方法调用:(Virtual Method Invocation)
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package com.atguigu.java4; public class PersonTest { public static void main(String[] args) { Person p1 = new Person(); p1.