Java从入门到精通学习笔记
第一章 初识java
a) Java是一种通过解释方式来执行的语言。
b) Java语言编写的程序既是编译型,又是解释型的。编译只进行一次,而解释在每次运行程序时都会进行。
c) JDK下载安装
i. path:jdk/bin
ii. calsspath:jdk/jre/lib
iii. 验证配置:cmd---》java----》javac
iv. 编译:javacxxx.java
v. 运行:javaxxx
第二章 熟悉Eclipse开发工具
a) 下载安装时要与已安装的jdk匹配,若jdk是32位的,Eclipse就下载32位的。
b)打开启动提示工作空间的提示:窗口/首选项/常规/启动和关闭/“工作空间”;
第三章 Java 语言基础
a) Java程序的基本组成单元是类,类体中又包括属性与方法两部分。
b) 通常将类的属性称之为类的全局变量(成员变量),将方法中的属性称之为局部变量。
c) Java语言是严格区分大小写的。
d)
整型数据类型
数据类型
内存空间(8位为1字节)
取值范围
Byte
8位
-128-127
Short
16位
-32768-32767
Int
32位
2的负32到2的32减1
Long
64位
2的负64到2的64减1
浮点数据类型
数据类型
内存空间(8位为1字节)
取值范围
Float
32位
2的负32到2的32减1
Double
64位
2的负64到2的64减1
e) 如果在成员变量的类型前面加上关键字static,这样的成员变量成为静态变量。静态变量的有效范围可以跨类,甚至可达到整个应用程序之内。对于静态变量,除了能在定义它的类内存取,还能直接以“类名.静态变量”的方式在其他类内使用。
第四章 流程控制
a) 虽然if后面的复合语句块只有一条语句,省略了“{}”并无语法错误,但为了增强程序的可读性最好不要省略。
b) If后面()内的表达式的值必须是boolean型的。
c)
i. If(a > 0)
b = a;
else
b = -a;
可以简写成:
b = a >0?a:-a;
d) 在switch语句中,case语句后常量表达式的值可以为整数,但绝不可以是实数。例如:case 1.1;就是不合法的。
e) foreach语句
1. for(元素变量x :遍历对象obj){
引用了X的java语句;
}
第五章 字符串
a) Java中一句相连的字符串不能分开在两行中写。例如:
i. System.out.println(“Ilike
Java”);//这是错误的书写方式
ii. System.out.println(“Ilike” +
“Java”);//这是正确的书写方式
b) 获取字符串信息常用方法
i. 获取字符串长度:str.length();
ii. 字符串查找:indexOf()与lastIndexOf(),返回字符或字符串首次出现和最后一次出现位置。
iii. 获取索引位置:str.charAt(int index);
c) 字符串操作常用方法
i. 获取子字符串:str.substring(int beginIndex);/在字符串中空格占用一个索引位置/
ii. 获取子字符串:substring(int beginIndex,int endIndex);
iii. 去除空格:str.trim();
iv. 字符串替换:str.replace(char oldChar,char newChar);/注意,要替换的字符oldChar的大小写要与原字符串中字符的大小写保持一致,否则不能成功地替换。/
d) 判断、比较、大小写转换、分割
i. 判断字符串的开始与结尾:str.startsWith(String prefix);str.endsWith(String suffix);
ii. 判断字符串是否相等:str.equals();equalsIgnoreCase()忽略大小写。
iii. 按字典顺序比较两个字符串:str.sompareTo(String otherstr);
iv. 字母大小写转换:str.toLowerCase();str.toUpperCase();
v. 字符串分割:str.split(String sign);
e) 在正则表达式中“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符“.”,必须使用转义字符”\”;
f) 字符串生成器常用方法
i. StringBuilder
builder = new StringBuilder(“”);/创建字符串生成器/
ii. append();//追加
iii. insert(int offset,arg);//插入
iv. delete(int
start,int end);//删除
第六章 数组
a) 一维数组:创建
i. intmonth[] = new int[12];
ii. intarr[] = new int[]{1,2,3,4,5};
iii. intarr[] = {1,2,3,4,5};
b) 二维数组:创建
i. a= new int[2][4];
c) 对数组进行排序:Arrays.sort(object);
d) 复制数组:Array.copyOf(arr,int newlength);copyOfRange(arr,intfromIndex,int toIndex);
i. 例子:int newarr[] = Array.copyOf(arr,5);
e) 数组查询:binarySearch(Object[].a.Objectkey);binarySearch(Object[].a,int fromIndex,int toIndex,Object key);
i. 例子:int index = Arrays.binarySearch(arr,0,1,8);
第七章 类和对象
a) 类是封装对象的属性和行为的载体。
b) 封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类。
c) 继承性主要是利用特定对象之间的共享属性。
d) 将父类对象应用于子类的特征就是多态。
访问包位置
类修饰符
private
protected
public
本类
Y
Y
Y
同包其他类或子类
N
Y
Y
其他包的类或子类
N
N
Y
e) 在无参构造方法中可以使用this关键字调用有参的构造方法。但使用这种方式需要注意的是只可以在无参构造方法中的第一句使用this调用有参构造方法。
列子:packagechapter7;
/**
date:2016-10-16
author:zhonghua
*类的构造方法
- */
public class AnyThing{
//定义无参构造方法
public AnyThing(){
this("this调用有参构造方法");
System.out.println("无参构造方法");
}
public AnyThing(Stringname){
System.out.println("有参构造方法");
}
f) 在Java语言中对静态方法有两点规定:
i. 在静态方法中不可以使用this关键字。
ii. 在静态方法中不可以直接调用非静态方法。
g) “==”运算符和equals()方法比较的内容是不同的,equals()方法是String类中的方法,它用于比较两个引用所指的内容是否相等;而“==”运算符比较的是两个对象引用的地址是否相等。
h) final,finally,finalize区别
i.final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
ii.finally是异常处理语句结构的一部分,表示总是执行。
iii.finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
第八章 包装类
a) Integer,Boolean,Byte,Character,Double,Number包装类内含方法,按需使用,灵活运用。
第九章 数字处理类
a) Math类三角函数方法:sin(),cos(),tan(),asin(),acos(),atan(),toRadians()//将角度转换为弧度,toDegress()//将弧度转换为角度。
b) 指数函数方法:
i. exp();//e的a次方
ii. log();//用于自然对数,lnx
iii. log10();//用于取底数为10的对数
iv. sqrt();//取a的平方根
v. cbrt();//用于取a的立方根
vi. pow(double
a,double b);//用于取a的b次方
c) 取整函数方法
i. ceil();//最小整数
ii. floor();//最大整数
iii. rint();//最接近的整数
iv. round();//加0.5返回最近的整数
d) Math.random()方法,随机数。
第十章 接口、继承与多态
a) 继承,其基本思想是基于某个父类的扩展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类原有的属性和方法,或者直接重写父类中的某些方法。
b) 继承并不只是扩展父类的功能,还可以重写父类的成员方法,重写(还可以成为覆盖)就是在子类中将父类的成员方法的名称保留,重写成员方法的实现内容,更改成员方法的存储权限。
c) 在继承中还有一种特殊的重写方式,子类与父类的成员方法返回值、返回值‘、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊重写方式被称为重构。
d) 重写的返回值类型必须是父类中同一方法返回值类型的子类。
e) Object类中的getClass()、notify()、notify
All()、wait()等方法不能被重写。
f) 利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用处理。
g) 在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。
h) 在接口中定义的方法必须被定义为public或abstract形式。
i) 在接口中定义的任何字段都自动是static和final的。
第十一章 类的高级属性
a) 类包不仅可以解决类名冲突问题,还可以在开发庞大的应用程序时,帮助开发人员管理庞大的应用程序组件,方便软件复用。
b) Java包的命名规则是全部使用小写字母。
c) Final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常,由final定义的变量为常量。
i. final----定义变量-----常量
ii. final----定义方法-----不可重写
iii. final----定义类-------不可继承
d) 一个既是static又是final的字段只占据一段不能改变的存储空间。
e) 在Java中定义全局常量,通常使用public static final修饰,这样的常量只能在定义时被赋值。
f) 在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private。
g) 如果在外部类和非静态方法之实例化内部类对象,需要使用外部类。内部类的形式指定该对象的类型。
h) 内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。
第十二章 异常处理
a) Java中将异常封装到一个类中,出现错误时,就会抛出异常。
b) 异常产生后,如果不做任何处理,程序就会被终止。
c) try语句块存放的是可能发生异常的Java语句;catch程序块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分。
第十三章 Swing 程序设计
第十四章 集合类
a) 数组的长度是固定的,集合的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。
b) 通常遍历集合,都是通过迭代器(Iterator)来实现。
c) List接口继承了Collection接口,因此包含Collection中的所有方法。
d) List接口的常用实现类有ArrayList与LinkedList.
i. ArrayList类实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问。
ii. LinkedList类采用链表结构保存对象。这种结构的优点是便于向集合插入和删除对象。
e) Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复的对象。
f) Map集合没有继承Collection接口,其提供的是Key到value的映射。Map中不能包含相同的key,每个key只能映射一个value。
g) Map接口常用的实现类有HashMap和TreeMap。建议使用HashMap类实现Map集合,因为由HashMap类实现的Map集合添加和删除映射关系效率更高。HashMap是基于哈希表的Map接口的实现,HashMap通过哈希码对其内部的映射关系进行快速查找;而TreeMap中的映射关系存在一定的顺序,如果希望Map集合中的对象也存在一定的顺序,应该使用TreeMap类实现Map集合。
第十五章 I/O (输入/输出)
a) 流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。
b) 输入流---InputStream类的常用方法
i. read();//读取数据的下一个字节
ii. read(byte[]
b);//从输入流中读入一定长度的字节
iii. mark(int
readlimit);//在输入流的当前位置放置一个标记
iv. reset();//将输入指针返回到当前所做的标记处。
v. skip(long
n);//跳过输入流上的n个字节并返回实际跳过的字节数。
vi. markSupported();//如果当前流支持mark()/reset()操作就返回True。
vii. close();//关闭流
c) 并不是所有的InputStream类的子类都支持InputStream中定义的所有方法,如skip、mark()、reset()等方法只对某些子类有用。
d) 输出流----OutputStream类常用方法
i. write(int
b);//将指定的字节写入此输出流
ii. wirte(byte[]
b);//将b个字节从指定的byte数组写入此输出流。
iii. write(byte[]
b,int off,int len);//将指定byte数组中从偏移量off开始的len个字节写入此输出流。
iv. flush();//彻底完成输出并清空缓存区。
v. close();//关闭输出流。
e) File类是java.io包中唯一代表磁盘文件本身的对象。
f) FileInputStream类与FileOutputStream类都用来操作磁盘文件。FileOutputStream类有与FileInputStream类有相同的参数构造方法,创建一个FileOutputSream对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件。
g) 由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象。
h) 百度总结资料
i.
百度总结
第十六章 反射
a) 通过java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描述java对象本身信息的功能。
b) 所有java类均继承Object类。
c) 在反射中执行具有可变数量的参数的构造方法时,需要将入口参数定义成二维数组。method(String…strings){}
d) 百度的反射定义:“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的 反射机制。”
e)类是Class类的对象 ,表示方式有三种:
i.//第一种,任何一个类都有一个隐含的静态成员变量
ii.Class Classc1 = Person.class;
iii.//第二种,已经知道该类的对象,通过getClass()获得
iv.Classc2 = person.getClass();
v.//第三种,Class类的forName()方法
vi.Classc3 = Class.forName("Person");
vii.//这里,c1,c2,c3都是Class类的实例,我们称c1, c2 ,c3为Person类的类类型
viii.//不难看出,c1 == c2结果是true, c2 == c3结果也是true
f)通过类的类类型,我们经常会用到的方法就是newInstance()方法,通过该方法可以创建该类的实例:
i.Person
personA = new Person(); //直接new一个实例
ii.Person
personB = Person.class.newInstance(); //通过newInstance()方法获得Person的实例
iii.//在学习JAVAEE时候,newInstance()方法我们最常见于获取数据库驱动
iv.Class.forName("com.mysql.jdbc.Driver").newInstance();
v.//需要注意的是,在使用newInstance()方法的前提是该类必须要有无参构造方法
g)编译时刻加载类称为静态加载,运行时刻加载类称为动态加载,使用new方法新建实例即为静态加载类,在编译时候就要加载全部类。
h)Annotation的作用(百度答案):Annotation提供了一条与程序元素关联任何或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。这些被存储在annotation的“name=value”结构对中。annotation类型是一种接口,能够通过反射API的方式提供对其的访。annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的。需要注意的是,这里存在着一个基本的潜规则:annotaion不能影响程序代码的执行,无论增加、删除annotation,代码都始终如一的执行。另外,尽管一些annotation通过Java的反射api方法在运行时被访问,而java语言解释器在工作时忽略了这些annotation。正是由于忽略了annotation,导致了annotation类型在代码中是“不起作用”的;只有通过某种配套的工具才会对annotation类型中的进行访问和处理。本文中将涵盖标准的annotation和meta-annotation类型,陪伴这些annotation类型的工具是java编译器(当然要以某种特殊的方式处理它们)。由于上述原因,annotation在使用时十分简便。一个本地变量可以被一个以NonNull命名的annotation类型所标注,来作为对这个本地变量不能被赋予null值的断言。而我们可以编写与之配套的一个annotation代码,使用它来对具有前面变量的代码进行解析,并且尝试验证这个断言。当然这些代码并不必自己编写。在JDK安装后,在JDK/bin目录中可以找到名为“apt”的工具,它提供了处理annotation的框架:它启动后扫描源代码中的annotation,并调用我们定义好的annotation处理器完成我们所要完成的工作(比如验证前面例子中的断言)。说到这里,annotation的强大功能似乎可以替代XDoclet这类的工具了,随着我们的深入,大家会更加坚信这一点的答案。
第十七章枚举类型与泛型
a) 枚举类型
i. 定义:枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型。
1.publicenumSeason {SPRING, SUMMER, AUTUMN, WINER;}
ii.特点
1.使用关键字enum
2.类型名称,比如这里的Season
3.一串允许的值,比如上面定义的春夏秋冬四季
4.枚举可以单独定义在一个文件中,也可以嵌在其它Java类中 除了这样的基本要求外,用户还有一些其他选
5.枚举可以实现一个或多个接口(Interface)
6.可以定义新的变量
7.可以定义新的方法
8.可以定义根据具体枚举值而相异的类
iii.总结:那么什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值的集合。
b)泛型
i.定义:
1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
ii.优点:
1.泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
iii.常见面试题
1.Java中的泛型是什么?使用泛型的好处是什么?
a)答:泛型是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架。
b)泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。
2.Java的泛型是如何工作的?什么是类型擦除?
a)答:泛型的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。
b)编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List类型来表示。为什么要进行擦除呢?这是为了避免类型膨胀。
3.Array中可以用泛型吗?
a)这可能是Java泛型面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective Java一书中建议使用List来代替Array,因为List可以提供编译期的类型安全保证,而Array却不能。
第十八章 多线程
a) Java中的多线程在每个操作系统中的运行方式也存在差异。Windows操作系统是多任务操作系统,它以进程为单位。
b) 一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样的一个进程就可以具有多个并发执行的线程。
c) 实现线程的两种方式:继承java.lang.Thread类与实现java.lang.Runnable接口。
d) 实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。
e) 使用Runnable接口启动新的线程的步骤如下:
i. 建立Runnable对象。
ii. 使用参数为Runnable对象构造方法创建Thread实例。
iii. 调用start()方法启动线程。
f) 线程具有生命周期,其中包含7种状态,分别为出生状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态和死亡状态。
g)
线程生命周期
h) 操作线程方法:
i. sleep();//睡眠
ii. join();//加入,threadB.join();后待B执行完毕后才执行A
iii. yield();//礼让
i) 以往有的时候会使用stop()方法停止线程,但当前版本的JDK早已废除了stop()方法,不建议使用stop()方法来停止一个线程的运行。现在提倡在run()方法中使用无限循环的形式,然后使用一个布尔型标记控制循环的停止。
j) Yield()方法使具有同样优先级的线程有进入可执行状态的机会,当当前线程放弃执行权时会再度回到就绪状态。
第十九章 网络通信
a) TCP协议是一种以固定连接线为基础的协议,适合可靠性要求比较高的场合(有连接,可靠)。
b) UDP是无连接通信协议,不保证可靠数据的传输(无连接,不可靠)。
c) 网络程序中的套接字(Socket)用于将应用程序与端口连接起来。
d)
e)TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低
f)Java中基于TCP协议实现网络通信的类
i.客户端的Socket类
ii.服务器端的ServerSocket类
iii.
g)Socket通信的步骤
① 创建ServerSocket和Socket
② 打开连接到Socket的输入/输出流
③ 按照协议对Socket进行读/写操作
④ 关闭输入输出流、关闭Socket
h)服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
i)客户端:
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
j)应用多线程实现服务器与多客户端之间的通信
① 服务器端创建ServerSocket,循环调用accept()等待客户端连接
② 客户端创建一个socket并请求和服务器端连接
③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接
④ 建立连接的两个socket在一个单独的线程上对话
⑤ 服务器端继续等待新的连接
k)UDP编程
i.UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去
ii.DatagramPacket类:表示数据报包
iii.DatagramSocket类:进行端到端通信的类
iv.服务器端实现步骤
① 创建DatagramSocket,指定端口号
② 创建DatagramPacket
③ 接受客户端发送的数据信息
④ 读取数据
l)客户端实现步骤
① 定义发送信息
② 创建DatagramPacket,包含将要发送的信息
③ 创建DatagramSocket
④ 发送数据
m)注意问题:
i.多线程的优先级问题:
根据实际的经验,适当的降低优先级,否侧可能会有程序运行效率低的情况
是否关闭输出流和输入流:
对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭socket即可
3、使用TCP通信传输对象,IO中序列化部分
4、socket编程传递文件,IO流部分
第二十章 数据库操作
a) 数据库种类
i. 层次性数据库
ii. 网状型数据库
iii. 面向对象型数据库
iv. 关系型数据库
b) JDBC是一种可用于执行SQL语句的Java API,是连接数据库和java应用程序的纽带。
c) 常用语句:
i. select语句:select所选字段列表from数据表名where条件表达式groupt by字段名having条件表达式(指定分组的条件)order by字段名[asc|desc]
ii. insert语句:insert into表名[(字段名1,字段名2…)]values(属性值1,属性值2,…)
iii. update语句:update数据表名set字段名=新的字段值where条件表达式
iv. delete语句:delete from数据表名where条件表达式
d)编写访问数据库的Java程序还需要几个重要的类和接口。
i.DriverManager类
1.DriverManager类处理驱动程序的加载和建立新数据库连接。DriverManager是java.sql包中用于管理数据库驱动程序的类。通常,应用程序只使用类DriverManager的getConnection()静态方法,用来建立与数据库的连接,返回Connection对象:
static Connection getConnection(Stringurl,String username,String password)
2.指定数据的URL用户名和密码创建数据库连接对象。url的语法格式是:
jdbc:<数据库的连接机制>:。
ii.Connection类
1.Connection类是java.sql包中用于处理与特定数据库连接的类。Connection对象是用来表示数据库连接的对象,Java程序对数据库的操作都在这种对象上进行。Connection类的主要方法有:
2.Statement
createStatement():创建一个Statement对象。
3.Statement
createStatement(int resultSetType,int resultSetConcurrency):创建一个Statement对象,生成具有特定类型的结果集。
4.void
commit():提交对数据库的改动并释放当前持有的数据库的锁。
5.void
rollback():回滚当前事务中的所有改动并释放当前连接持有的数据库的锁。
6.String
getCatalog():获得连接对象的当前目录。
7.boolean
isClose():判断连接是否已关闭。
8.boolean
isReadOnly():判断连接是否为只读模式。
9.void
setReadOnly():设置连接为只读模式。
10.void close():释放连接对象的数据库和JDBC资源。
11.Statement类
iii.Statement类是java.sql包中用于在指定的连接中处理SQL语句的类。数据库编程的要点是在程序中嵌入SQL命令。程序需要声明和创建连接数据库的Connection对象,并让该对象连接数据库。调用类DriverManager的静态方法getConnection()获得Connection对象,实现程序与数据库的连。然后,用Statement类声明SQL语句对象,并调用Connection对象的createStatement()方法,创建SQL语句对象。例如,以下代码创建语句对象sql:
Statement sql = null;
try{
sql = con.createStatement();
}catch(SQLException e){}
iv.ResultSet类
1.有了SQL语句对象后,调用语句对象的方法executeQuery()执行SQL查询,并将查询结果存放在一个用ResultSet类声明的对象中,例如,以下代码读取学生成绩表存于rs对象中:
2.ResultSet rs = sql.executeQuery(“SELECT *FROM ksInfo”);
3.ResultSet对象实际上是一个由查询结果数据的表,是一个管式数据集,由统一形式的数据行组成,一行对应一条查询记录。在ResultSet对象中隐含着一个游标,一次只能获得游标当前所指的数据行,用next方法可取下一个数据行。用数据行的字段(列)名称或位置索引(自1开始)调用形如getXXX()方法获得记录的字段植。以下是ResultSet对象的部分方法:
4.byte
getByte(int columnIndex):返回指定字段的字节值。
5.Date
getDate(int columnIndex):返回指定字段的日期值。
6.float
getFloat(int columnIndex):返回指定字段的浮点值。
7.int
getInt(int columnIndex):返回指定字段的整数值。
8.String
getString(int columnIndex):返回指定字段的字符串值。
9.double
getDouble(String columnName):返回指定字段的双精度值。
10.long getLong(String columnName):返回指定字段的long型整值。
11.boolean next():返回是否还有下一字段。
12.以上方法中的columnIndex是位置索引,用于指定字段,columnName是字段名。
13.用户需要在查询结果集上浏览,或前后移动、或显示结果集的指定记录,这称为可滚动结果集。程序要获得一个可滚动结果集,只要在获得SQL的语句对象时,增加指定结果集的两个参数即可。例如,以下代码:
Statement stmt = con.createStatement(type,concurrency);
ResultSet rs = stmt.executeQuery(SQL语句)
14.语句对象stmt的SQL查询就能得到相应类型的结果集。
15.int型参数type决定可滚动集的滚动方式:
16.ResultSet.TYPEFORWORDONLY,结果集的游标只能向下滚动。
17.ResultSet.TYPESCROLLINSENSITIVE,游标可上下移动,当数据库变化时,当前结果集不变。
18.ResultSet. TYPESCROLLSENSITIVE,游标可上下移动,当数据库变化时,当前结果集同步改变。
19.int型参数concurrency决定数据库是否与可滚动集同步更新:
20.ResultSet.CONCURREADONLY,不能用结果集更新数据库中的表。
21.ResultSet.CONCUR_UPDATETABLE,能用结果集更新数据库中的表。
22.例如,以下代码利用连接对象connect,创建Statement对象stmt,指定结果集可滚动,并以只读方式读数据库:
stmt =connect.createStatement(ResultSet.TYPESCROLLSENSITIVE,
ResultSet.CONCURREADONLY);
23.可滚动集上另外一些常用的方法如下:
24.boolean previous():将游标向上移动,当移到结果集的第一行时,返回false。
25.void beforeFirst():将游标移结果集的第一行之前。
26.void afterLast():将游标移到结果集的最后一行之后。
27.void first():将游标移到第一行。
28.void last():将游标移到最后一行。
29.boolean isAfterLast():判游标是否在最后一行之后。
30.boolean isBeforeFirst():判游标是否在第一行之前。
31.boolean isLast():判游标是否在最后一行。
32.boolean isFirst():判游标是否在第一行。
33.int getRow():获取当前所指的行(行号自1开始编号,结果集空,返回0)。
34.boolean absolute(int row):将游标移到row行。