复习要点:
    一、题型及分值分布
    复习要点 - 图1

    二、重点内容
    CH1 Java入门(5分)

    1. JDK平台提供的java.exe是Java解释器、javac.exe是Java编译器;
    2. java文件编译成功后会在当前目录中生成的文件名和后缀;

    字节码文件(.class)

    1. Java技术平台一般划分为三个系列:Java SE,Java EE和Java ME

    JavaSE:Java标准版
    JavaEE:Java企业版
    JavaME:Java微型版

    1. Java跨平台的含义,作用;

    含义:在一个计算机编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计算机上直接使用。字节码由Java虚拟机负责解释运行。
    作用:一次编译,多次运行

    1. JAVA执行过程的理解;

    编写源文件(.java),编译源文件生成字节码(.class),加载运行字节码

    1. JAVA的程序结构;

    class 类名{
    属性;
    构造方法{方法体};
    普通方法{方法体};
    }

    Ch2 Java的基本数据类型与数组(7分)

    1. Java是大小写敏感语言
    2. 标识符的规则,中文问题;

    标识符由字母,下划线,美元符号和数字组成,长度不受限制
    标识符的第一个字符不能是数字
    标识符不能是关键字
    标识符不能是true,false和nell

    1. 关键字是否大小写的问题;

    复习要点 - 图2

    1. 基本的数据类型,及其字节范围;

    复习要点 - 图3

    1. 整型:byte(1字节=8bit) \ short(2字节) \ int(4字节) \ long(8字节)
      ① byte范围:-128 ~ 127,short范围:-2^15~2^15-1, int范围:-2^31~2^31-1, long范围:-2^63~2^63-1
      ② 声明long型变量,必须以”l”或”L”结尾
      ③ 通常,定义整型变量时,使用int型。
      ④ 整型的常量,默认类型是:int型
    2. 浮点型:float(4字节) \ double(8字节)
      ① 浮点型,表示带小数点的数值
      ② float表示数值的范围比long还大
      ③ 定义float类型变量时,变量要以”f”或”F”结尾
      ④ 通常,定义浮点型变量时,使用double型。
      ⑤ 浮点型的常量,默认类型为:double
    3. 字符型:char (1字符=2字节)取值范围:0~65535
      ① 定义char型变量,通常使用一对’’,内部只能写一个字符
      ② 表示方式:1.声明一个字符 2.转义字符 3.直接使用 Unicode 值来表示字符型常量

    ③转义字符\

    1. 布尔型:boolean
      ① 只能取两个值之一:true 、 false
      ② 常常在条件判断、循环结构中使用
      1. 基本数据类型间的隐式转换、显示转换问题,比如int a=10/3的整除问题;
    1. 涉及到的基本数据类型:除了boolean之外的其他7种
      2. 隐式转换(自动类型转换,只涉及7种基本数据类型)
      结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
      byte 、char 、short —> int —> long —> float —> double
      特别的:当byte、char、short三种类型的变量做运算时,结果为int型
      说明:此时的容量大小指的是,表示数的范围的大和小。比如:float容量要大于long的容量
      3. 显示转(换强制类型转换,只涉及7种基本数据类型):自动类型提升运算的逆运算。
      1. 需要使用强转符:( )
      2. 注意点:强制类型转换,可能导致精度损失。
      4. String与8种基本数据类型间的运算
      String属于引用数据类型,翻译为:字符串
      声明String类型变量时,使用一对“ “
      String可以和8种基本数据类型变量做运算,且运算只能是连接运算:+
      运算的结果仍然是String类型
      避免:
      String s = 123;//编译错误
      String s1 = “123”;
      int i = (int)s1;//编译错误

    2. 数组的定义、声明、内存对象模型、引用及遍历;遍历数组时注意a[i] % 4==0和i% 3==4的区别;

    数组的定义:一些类型相同的变量组成的集合
    声明:
    元素类型 数组名[];
    元素类型 [] 数组名;
    静态初始化:数组的初始化和数组元素的赋值操作同时进行
    int[] ids= new int[]{1001,1002,1003,1004};
    动态初始化:数组的初始化和数组元素的赋值操作分开进行
    String[] names = new String[5];
    内存对象模型:
    复习要点 - 图4
    引用:下标
    遍历:for循环,加强for循环
    一维数组元素的默认初始化值
    ● 数组元素是整型:0
    ● 数组元素是浮点型:0.0
    ● 数组元素是char型:0或'\u0000',而非'0'
    ● 数组元素是boolean型:false
    ● 数组元素是引用数据类型:null

    1. 三种注释;

    单行注释:\注释内容
    多行注释:*注释内容\
    文档注释:**注释内容
    \
    CH3 运算符、表达式和语句(7分)

    1. 循环语句,for/while/do…while/foreach的用法、特点;

      for
      while
      do…while
      foreach:for(声明循环变量:数组名){}

    2. 基本语句的用法:赋值、条件、逻辑、比较、打印等;

      赋值:=
      条件:if语句,if-else语句,if-else if-else语句;switch语句
      逻辑:&&,||,!
      比较:>,<,>=,<=,==,!=
      打印:println()

    3. 运算符,尤其是==、三目运算符等;尤其要注意逻辑运算是短路运算。

    算术运算符:+,-,*,/,%
    自增,自减运算符:++x(—x)先加(减)再用,x++(x—)先用再加(减)
    关系运算符:>,<,>=,<=,==,!=
    赋值运算符:=
    位运算符:&按位与运算符,|按位或运算符,~按位非运算符,^按位异或运算符

    1. 每个表达式对应的值,如赋值表达式的值、逗号表达式的值、三元运算符的值;
    2. 选择语句的概念,使用;

    CH4 类与对象(11分)
    复习要点 - 图5

    1. 成员变量的定义:类中方法外定义的变量;

    成员变量的特点:在整个类体有效,与其声明的位置无关,在定义时有默认值。每个类型变量的默认值都不一样,书上有一张表,要牢记;

    1. 局部变量的定义:在方法体中定义的变量和方法的参数;

    局部变量的特点:只在定义它的方法内有效,与其声明的位置有关,局部变量在定义时没有默认值。

    1. 如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,如果想在该方法中使用被隐藏的成员变量,则必须使用关键字this;
    2. 成员常变量的定义(final的用法);成员变量的定义;

    5)构造方法的概念和理解;构造方法的定义格式要牢记;构造方法也是一种方法,也可以重载;构造方法的特点是创建一个类实例后调用的第一个方法;
    6)函数签名的概念,函数重载的概念;函数重载的使用;
    7)函数传参的使用及理解;用内存对象模型好好分析(Java总是在传值,引用型传的是变量的地址,而基本型传的是变量的值);要注意跟方法返回值一起考虑,如:
    public class E {
    public static void main (String[]args) {
    String str = new String (“aa”);
    str=modify(str);
    System.out.println(str);
    }
    public static String modify (String s) { //若没有返回类型呢?
    s = s + “bb”;
    return s;
    }
    }

    1. 实例成员、类成员的区别和联系;
    2. 四种访问权限及其范围大小排序;

    权限从小到大顺序为:private < 缺省 < protected < public
    复习要点 - 图6

    1. 包的概念,用法,跟文件的关系;

    CH5 子类与继承(9分)

    1. abstract的用法:

    (1)修饰类,让类变成抽象类,其特点是:抽象类不能实例化对象。一个类是不是抽象类,主要看他有没有abstract修饰,若有则是抽象类,若没有就不是抽象类;
    (2)修饰方法:让方法变成抽象方法,其特点是,抽象方法不需要写类体。一个方法是不是抽象方法,只需要看他有没有被abstract修饰,若有则是抽象方法,若没有就不是抽象方法;
    (3)一个类若有抽象方法,则该类一定是抽象类,因为抽象方法没有实体,没有具体的功能,不能实例化,就只能是抽象类,反之,若不是抽象类,那么实例化后,该示例对象的该方法有什么功能,就无法确定,因此Java有这么个规定;反之,抽象类可以没有抽象方法,即该类中所有的方法都是非抽象方法,都没有被abstract修饰,此时,若该类没有被abstract修饰,此类就是非抽象类,若被abstract修饰,此类就是抽象类。

    1. final的用法:

    (1)修饰类,说明此类不能被继承;
    (2)修饰方法,说明此方法不能被子类重写;
    (3)修饰变量(不管是成员变量还是局部变量),说明此变量不能被改写,即它是一个常变量;
    (4)问题思考:由abstract和final含义可知,两个单词能不能同时修饰同一个类或方法?

    1. super的用法:
    2. 子类的构造方法中且第一条语句上使用super调用父类的构造方法,根据具体情况,可带参数,也可不带参数;
    3. 若子类成员(可以是属性,也可以是方法)隐藏了对应父类重名的成员,用super操作被隐藏的父类的成员变量和方法;
    4. this的用法:
    5. 局部变量隐藏时,用它可以访问成员变量;
    6. 多个构造方法间的访问,注意必须在构造方法的第一行;
    7. 修饰成员方法;
    8. 方法重写的概念,重写的规则(尤其是重写父类的方法时,不允许提高方法的访问权限,但可以降低访问权限);注意跟另一个概念【方法重载】对比(同一个类中,不同签名);
    9. 成员(包括成员方法和成员属性)隐藏的概念,成员隐藏在代码中的应用;特别是,当它跟多态结合起来考虑时要紧扣概念;

    public Demo{
    public static void main(String args[]) {
    A fu = new A();
    System.out.println(fu.f());
    B zi = new B();
    System.out.println(zi.f());
    }
    }
    class A {
    int x = 222, y = 3333;
    int f() {….}
    }
    class B extends A {
    int x = 4444, y = 555;
    int f() {…..}
    }

    1. 方法的可变参数,实际上是一个数组,这个知识点可以跟数组一起考核,比如,求所有参数的和或乘积等等应用;
    2. 利用父类是一个抽象类或者一个接口,子类实现求解不同图形的周长或面积;试着自己写下代码;

    CH6 接口与实现(2分)

    1. 接口的概念;存在的价值,即引入接口解决的问题;
    2. 接口的定义格式;接口中方法默认被public abstract修饰;接口中的变量自动都是public、static,final;接口中也可以有非抽象的方法;接口也产生class文件;接口中的方法不能被final修饰,因为要重写所有接口中的方法;
    3. 如果一个类实现了某个接口,那么这个类必须重写该接口的所有抽象方法,否则编译出错。
    4. 接口回调;接口与多态;

    CH7 内部类与异常类(8分)

    1. 内部类的概念和定义;内部类有四种类型;每一种内部类的书写格式,尤其是匿名内部类的书写格式;

    成员内部类(静态内部类,非静态内部类)
    成员内部类就是一般我们说的非静态内部类和静态内部类,即在类中定义的。
    匿名内部类
    匿名内部类一般用于函数参数,作用是实现某个接口
    在方法参数中新建一个接口对象 / 类对象,并且实现这个接口声明 / 类中原有的方法
    局部内部类
    如果一个内部类只在一个方法中使用到了,那么我们可以将这个类定义在方法内部,这种内部类被称为局部内部类。其作用域仅限于该方法。内部类编译后如何取名?给你一段代码,你能不能判断有几个class文件及其对应的名称;
    格式:
    成员内部类:外部类$内部类名.class
    局部内部类:外部类$数字 内部类名.class

    1. 内部类直接访问的是外部类变量的值,尤其是跟方法、构造方法、变量初始化等知识点一起考核时,注意理解;

    class A{
    int a=7555;
    A(){ a=8888; }
    int getA(){ return a; }
    void ff(){ a=999; }
    class B{
    B(){ a=11111; }
    void f(){
    ff();
    System.out.println(a);
    }
    }
    public static void main(String[] args) {
    A o=new A();
    System.out.println(o.getA());
    B i=o.new B();
    i.f();
    }
    }

    1. 异常的概念,异常的定义;异常体系有3大类;理解程序员处理异常的2种方式;

    概念:程序运行时可能出现的一些错误
    定义:
    1. 继承于现的异常结构
    2. 提供全局常量
    3. 提供重载的构造器

    异常的执行流程;
    过程一:”抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。
    并将此对象抛出。
    一旦抛出对象以后,其后的代码就不再执行。
    关于异常对象的产生:
    ① 系统自动生成的异常对象
    ② 手动的生成一个异常对象,并抛出(throw)
    过程二:”抓”:可以理解为异常的处理方式:① try-catch-finally ② throws
    异常体系有3大类:
    编译时异常(checked)
    运行时异常(unchecked,RuntimeException)

    1. 异常处理的5个关键字:try…catch、finally、throws 、throw的用法、意义和注意事项;

    try…catch:
    1.使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中行匹配
    2.一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没写finally的情况。继续执行其后的代码
    3.catch中的异常类型如果没子父类关系,则谁声明在上,谁声明在下无所谓。catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
    finally:finally是一定执行的
    throws:throws 属于异常处理的一种方式,声明在方法的声明处。
    throw:throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。
    7)Throwable类中定义了3个异常处理的方法;
    1.public void printStackTrace():打印异常的详细信息。
    包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
    2.public String getMessage():获取发生异常的原因。
    提示给用户的时候,就提示错误原因。
    3.public String toString():获取异常的类型和异常描述信息(不用)。
    CH8 常用实用类(7分)

    1. String类概念;定义和构造;

    概念:处理字符序列
    定义:
    构造:String 对象名=new String(字符串);
    String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
    两个:一个是堆空间中new结构(存的是常量池的地址),另一个是char[ ]对应的常量池中的数据:”abc”

    1. String类函数的用法,尤其是indexOf;compareTo、getBytes()和length()的用法;当length()跟ASCII编码表及转义字符结合起来使用时,要能理解字符串的长度;

    indexOf():返回指定子字符串在此字符串中第一次出现处的索引
    compareTo:按字典顺序比较两个字符串。
    getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
    length():字符序列长度

    1. 常量池的概念,编译器对字符串常量构造时的优化;

    复习要点 - 图7
    编译器对字符串常量构造时的优化:
    给一个变量赋值,如果等于号的右边是常量的表达式并且没有一个变量,那么就会在编译阶段计算该表达式的结果,然后判断该表达式的结果是否在左边类型所表示范围内,如果在,那么就赋值成功,如果不在,那么就赋值失败。但是注意如果一旦有变量参与表达式,那么就不会有编译期间的常量优化机制

    1. 字符串内容相等、地址相等的判断方法;字符串的内存对象模型;String和StringBuffer内存分配问题对比解析;

    字符串内容相等:equals()
    字符串地址相等:==
    字符串的内存对象模型:
    复习要点 - 图8
    String和StringBuffer内存分配问题对比解析:
    String:不可变的字符序列;底层使用char[]存储
    StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
    StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
    String内存分配情况:
    String Str = “jack”这个语句会先检查字符串常量池是否存放这个”jack”这个字符串对象,如果没有存在,那么就会在字符串常量池中创建这个字符串对象,如果存在直接返回该字符串的内存地址值。
    String str3 = new String(“jack”) 该语句会创建两个对象,首先会先检查字符串常量池中存不存在jack这个字符串对象,如果不存在就会创建,如果存在就返回内存地址值。创建了出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。总共两个对象
    String、StringBuffer和StringBuilder在本质上都是字符数组,不同的是,在进行连接操作时,String每次返回一个新的String实例,而StringBuffer和StringBuilder的append方法直接返回this,所以这就是为什么在进行大量字符串连接运算时,不推荐使用String,而推荐StringBuffer和StringBuilder。

    1. 输入输出,尤其要注意:System.out.print和System.out.println的区别;

    输入:Scanner 变量名=new Scanner(System.in)

    CH9 组件及事件处理(10分)

    1. 常见的组件(课程上讲解的,点到的)的使用,事件源、事件监听器;

    组件:
    复习要点 - 图9
    复习要点 - 图10
    复习要点 - 图11
    事件源:

    组件名 功能
    Button Button(按钮)
    Canvas 用于绘图的画布
    Checkbox 复选框组件(也可当做单选框组件使用)
    CheckboxGroup 用于将多个Checkbox 组件组合成一组, 一组 Checkbox 组件将只有一个可以 被选中 , 即全部变成单选框组件
    Choice 下拉选择框
    Frame 窗口 , 在 GUI 程序里通过该类创建窗口
    Label 标签类,用于放置提示性文本
    List JU表框组件,可以添加多项条目
    Panel 不能单独存在基本容器类,必须放到其他容器中
    Scrollbar 滑动条组件。如果需要用户输入位于某个范围的值 , 就可以使用滑动条组件 ,比如调 色板中设置 RGB 的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、 滑块的大小、最小值和最大值。
    ScrollPane 带水平及垂直滚动条的容器组件
    TextArea 多行文本域
    TextField 单行文本框

    事件监听器:

    事件类别 描述信息 监听器接口名
    ActionEvent 激活组件 ActionListener
    ItemEvent 选择了某些项目 ItemListener
    MouseEvent 鼠标移动 MouseMotionListener
    MouseEvent 鼠标点击等 MouseListener
    KeyEvent 键盘输入 KeyListener
    FocusEvent 组件收到或失去焦点 FocusListener
    AdjustmentEvent 移动了滚动条等组件 AdjustmentListener
    ComponentEvent 对象移动缩放显示隐藏等 ComponentListener
    WindowEvent 窗口收到窗口级事件 WindowListener
    ContainerEvent 容器中增加删除了组件 ContainerListener
    TextEvent 文本字段或文本区发生改变 TextListener
    1. 组件和事件、事件监听器的一对一、一对多关系的理解;

    2. 布局的概念,意义和使用;

    复习要点 - 图12
    概念:布局管理器可以将组件进行统一管理
    意义:Java提供了LayoutManager布局管理器,可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置了,只需要为容器选择合适的布局管理器即可
    使用:
    FlowLayout:流式布局管理器
    BorderLayout:边框布局管理器
    CardLayout:卡片布局管理器
    GridLayout:网格布局管理器
    GridBagLayout:网格包布局管理器
    BoxLayout:盒布局管理器

    1. 课设中的相关组件知识;

    见上面事件源

    1. 事件监听器添加的几种写法:

    https://blog.csdn.net/jasonCSH/article/details/108730324
    通过内部类实现
    通过匿名内部类实现
    外部类实现
    通过事件源所在类实现
    通过onClick属性实现

    CH10 输入、输出流(9分)

    1. 一切皆字节流的含义;

    一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

    1. File类的几种构造方式;

    File(String Pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    参数:
    string pathname:字符串的路径名称
    路径可以是以文件结尾,也可以是以文件夹结尾
    路径可以是相对路径,也可以是绝对路径
    路径可以是存在,也可以是不存在
    创建FiLe对象,只是把字符串路径封装为FiLe对象,只是把字符串路径封装为文件对象,不考虑路径的真假情况
    File(String parentPath,String childPath)从父路径名字符串和子路径名字符串创建新的 File实例。
    参数:把路径分成两部分
    String parentPath:父路径
    String childPath:子路径
    File(File parentFile,String childPath)从父抽象路径名和子路径名字符串创建新的 File实例。

    1. GBK编码的特点;UTF-8编码的特点;尤其是汉字的表达;

    ASCII:美国标准信息交换码。
    用一个字节的7位可以表示。
    ISO8859-1:拉丁码表。欧洲码表
    用一个字节的8位表示。
    GB2312:中国的中文编码表。最多两个字节编码所有字符
    GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
    Unicode:国际标准码,融合了目前人类使用的所字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。
    UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。
    GBK编码的特点:

    1. 文件输出流FileOutputStream都继承于OutputStream,而文件输入流FileInputStream都继承于InputStream类;

    2. 字节流、字符流的概念,应用背景和意义、使用步骤;尤其是数据追加写的代码;

    字节流:
    字符流:
    数据追加续写
    每次程序运行,创建输出流对象,都会清空目标文件中的数据。如何保留目标文件中数据,还能继续添加新数据呢?
    ● public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。
    ● public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称写入文件。

    这两个构造方法,参数中都需要传入一个boolean类型的值,true 表示追加数据,false 表示清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了

    1. 常见的输入输出流(课堂上重点讲解的字节、字符、缓冲、转换)定义,来自那个包,使用步骤;

    字节:
    字节输出流【OutputStream】
    java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。
    字节输出流【OutputStream】
    java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。
    字符:
    字符输入流【Reader】
    java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。
    字符输出流【Writer】
    java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。
    缓冲:
    缓冲流涉及到的类:
    BufferedInputStream
    BufferedOutputStream
    BufferedReader
    BufferedWriter
    转换:
    转换流涉及到的类:属于字符流
    InputStreamReader:将一个字节的输入流转换为字符的输入流
    解码:字节、字节数组 —->字符数组、字符串
    OutputStreamWriter:将一个字符的输出流转换为字节的输出流
    编码:字符数组、字符串 —-> 字节、字节数组

    1. Java中文件路径分隔符的写法;

    转义字符:\

    1. 随机流的作用

    随机存取文件流(读文件,存文件)

    1. 对象序列化必须具备的条件;

    1.需要实现接口:Serializable
    2.当前类提供一个全局常量:serialVersionUID
    3.除了当前Person类需要实现Serializable接口之外,还必须保证其内部所属性,也必须是可序列化的。(默认情况下,基本数据类型可序列化)
    补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量

    CH11 JDBC与MySQL数据库(13分)
    import java.sql.;
    public class Example11_1 {
    public static void main(String args[]) {
    Connection con=null;
    Statement sql;
    ResultSet rs;
    try{ Class.forName(“com.mysql.jdbc.Driver”); //加载JDBC_MySQL驱动
    }
    catch(Exception e){}
    String uri = “jdbc:mysql://localhost:3306/students?useSSL=true”;
    String user =”root”;
    String password =””;
    try{
    con = DriverManager.getConnection(uri,user,password); //连接代码
    }
    catch(SQLException e){ }
    try {
    sql=con.createStatement();
    rs=sql.executeQuery(“SELECT
    FROM mess”); //查询mess表
    while(rs.next()) {
    String number=rs.getString(1);
    String name=rs.getString(2);
    Date date=rs.getDate(3);
    float height=rs.getFloat(4);
    System.out.printf(“%s\t”,number);
    System.out.printf(“%s\t”,name);
    System.out.printf(“%s\t”,date);
    System.out.printf(“%.2f\n”,height);
    }
    con.close();
    }
    catch(SQLException e) {
    System.out.println(e);
    }
    }
    }

    1. ResultSet对象自动维护指向当前数据行的游标,每调用一次next()方法,游标向下移动一行

    ResultSet:结果集对象,封装查询结果

    1. JDBC的概念:是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问。它由一组用Java语言编写的类和接口组成;
    2. JDBC的使用步骤,编码;

    步骤:
    1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
    1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
    2.右键—>Add As Library
    2. 注册驱动
    Class.forName(“com.mysql.jdbc.Driver”)
    3. 获取数据库连接对象 Connection
    Connection con = DriverManager.getConnection(uri,user,password)
    4. 定义sql
    Statement sql
    5. 获取执行sql语句的对象 Statement
    sql=con.createStatement()
    6. 执行sql,接受返回结果
    rs=sql.executeQuery(“SELECT * FROM mess”)
    7. 处理结果
    8. 释放资源
    con.close()

    1. JDBC中常用的几个类;上课讲解的几个实例;

    2. DriverManager:驱动管理对象
      * 功能:
      1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
      static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
      写代码使用: Class.forName(“com.mysql.jdbc.Driver”);
      通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
      static {
      try {
      java.sql.DriverManager.registerDriver(new Driver());
      } catch (SQLException E) {
      throw new RuntimeException(“Can’t register driver!”);
      }
      }

      1. 注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。<br /> 2. 获取数据库连接:<br /> * 方法:static Connection getConnection(String url, String user, String password) <br /> * 参数:<br /> * url:指定连接的路径<br /> * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称<br /> * 例子:jdbc:mysql://localhost:3306/db3<br /> * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称<br /> * user:用户名<br /> * password:密码 <br /> 2. Connection:数据库连接对象<br /> 1. 功能:<br /> 1. 获取执行sql 的对象<br /> * Statement createStatement()<br /> * PreparedStatement prepareStatement(String sql) <br /> 2. 管理事务:<br /> * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务<br /> * 提交事务:commit() <br /> * 回滚事务:rollback() <br /> 3. Statement:执行sql的对象<br /> 1. 执行sql<br /> 1. boolean execute(String sql) :可以执行任意的sql 了解 <br /> 2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句<br /> * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。<br /> 3. ResultSet executeQuery(String sql) :执行DQL(select)语句<br /> 2. 练习:<br /> 1. account表 添加一条记录<br /> 2. account表 修改记录<br /> 3. account表 删除一条记录
      2. 代码:<br /> Statement stmt = null;<br /> Connection conn = null;<br /> try {<br /> //1. 注册驱动<br /> Class.forName("com.mysql.jdbc.Driver");<br /> //2. 定义sql<br /> String sql = "insert into account values(null,'王五',3000)";<br /> //3.获取Connection对象<br /> conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");<br /> //4.获取执行sql的对象 Statement<br /> stmt = conn.createStatement();<br /> //5.执行sql<br /> int count = stmt.executeUpdate(sql);//影响的行数<br /> //6.处理结果<br /> System.out.println(count);<br /> if(count > 0){<br /> System.out.println("添加成功!");<br /> }else{<br /> System.out.println("添加失败!");<br /> }<br /> <br /> } catch (ClassNotFoundException e) {<br /> e.printStackTrace();<br /> } catch (SQLException e) {<br /> e.printStackTrace();<br /> }finally {<br /> //stmt.close();<br /> //7. 释放资源<br /> //避免空指针异常<br /> if(stmt != null){<br /> try {<br /> stmt.close();<br /> } catch (SQLException e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> <br /> if(conn != null){<br /> try {<br /> conn.close();<br /> } catch (SQLException e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> }<br /> <br /> 4. ResultSet:结果集对象,封装查询结果<br /> * boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true<br /> * getXxx(参数):获取数据<br /> * Xxx:代表数据类型 如: int getInt() , String getString()<br /> * 参数:<br /> 1. int:代表列的编号,从1开始 如: getString(1)<br /> 2. String:代表列名称。 如: getDouble("balance")<br /> <br /> * 注意:<br /> * 使用步骤:<br /> 1. 游标向下移动一行<br /> 2. 判断是否有数据<br /> 3. 获取数据
      3. //循环判断游标是否是最后一行末尾。<br /> while(rs.next()){<br /> //获取数据<br /> //6.2 获取数据<br /> int id = rs.getInt(1);<br /> String name = rs.getString("name");<br /> double balance = rs.getDouble(3);<br /> <br /> System.out.println(id + "---" + name + "---" + balance);<br /> }
      4. * 练习:<br /> * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。<br /> 1. 定义Emp类<br /> 2. 定义方法 public List<Emp> findAll(){}<br /> 3. 实现方法 select * from emp;<br /> <br /> 5. PreparedStatement:执行sql的对象<br /> 1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题<br /> 1. 输入用户随便,输入密码:a' or 'a' = 'a<br /> 2. sqlselect * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
      5. 2. 解决sql注入问题:使用PreparedStatement对象来解决<br /> 3. 预编译的SQL:参数使用?作为占位符<br /> 4. 步骤:<br /> 1. 导入驱动jar mysql-connector-java-5.1.37-bin.jar<br /> 2. 注册驱动<br /> 3. 获取数据库连接对象 Connection<br /> 4. 定义sql<br /> * 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;<br /> 5. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql) <br /> 6. 给?赋值:<br /> * 方法: setXxx(参数1,参数2)<br /> * 参数1:?的位置编号 1 开始<br /> * 参数2:?的值<br /> 7. 执行sql,接受返回结果,不需要传递sql语句<br /> 8. 处理结果<br /> 9. 释放资源
      6. 5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作<br /> 1. 可以防止SQL注入<br /> 2. 效率更高
    3. UPDATE SET =?,=?,=? WHERE *=?,如何为预编译的sql语句赋值;

    使用 PreparedStatement 的步骤:
    1.编写 SQL 语句,未知内容使用?占位:”SELECT * FROM user WHERE name=? AND password=?”;
    2.获得 PreparedStatement 对象
    3.设置实际参数:setXxx(占位符的位置, 真实的值)
    4.执行参数化 SQL 语句
    5.关闭资源

    1. 数据库的连接使用,尤其是下述代码,注意每个部分的含义;

    Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost/students?user=root&password=root&serverTimezone=UTC”);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(“SELECT * FROM students.mess”);
    int i=1;
    while(rs.next()) {
    System.out.print(i+”: “+rs.getString(1));
    System.out.print(rs.getString(“name”));
    System.out.print(rs.getDate(“birthday”));
    System.out.println(rs.getDouble(“height”));
    i++;
    }

    CH12 Java多线程机制(11分)

    1. 线程的概念、理解;

    ● 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
    ● 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

    1. 线程的创建(两种方式);

    2. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
      2. 创建Thread子类的实例,即创建了线程对象
      3. 调用线程对象的start()方法来启动该线程

    3. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
      2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正
      的线程对象。
      3. 调用线程对象的start()方法来启动线程。

    4. 线程的生命周期及几个状态,这几个状态如何进行切换;尤其是在调用start()方法后、调用sleep(100)后;线程中断的几种原因;

    start()方法来运行多线程代码

    1. start()、wait(有参数)、wait()无参数、notify()、notifyAll()、sleep的用法及意义;

    2. wait:线程不再活动,不再参与调度,进入 wait set 中,因此不会浪费 CPU 资源,也不会去竞争锁了,这时的线程状态即是 WAITING。它还要等着别的线程执行一个特别的动作,也即是“通知(notify)”在这个对象上等待的线程从wait set 中释放出来,重新进入到调度队列(ready queue)中
      2. notify:则选取所通知对象的 wait set 中的一个线程释放;例如,餐馆有空位置后,等候就餐最久的顾客最先入座。
      3. notifyAll:则释放所通知对象的 wait set 上的全部线程。

    3. 多窗口卖票的实例代码,要研究透彻;

    CH15 泛型与集合框架(1分)

    1. 代码【class People 】中,E是泛型,它可以是那些类型(obj);
    2. 数组和链表这两种数据存储结构的优缺点;
    3. 我在上课时讲解的那个求体积时的解决思路,不用泛型时怎么解决的,用泛型时怎么解决的,好好想想。