第一章(抽象和封装)
1.快捷键
main + alt+/ 快速生成main方法
syso + alt+/ 快速生成输出语句
new了一个类之后。未导入包的话 ctrl+shift+o 快速导入包
alt+shift+s 然后选择getters and setters 就可以快速
生成 set 方法 get 方法 封装
2.方法重载
public void print(){}
public void print(int i){}
public void print(int i,string b)
public void print(string b,int i)
方法重载就是: 在同一个作用域(同一个类)中方法名称一样。但是参数的个数或者数据类型。或者顺序不一样的方法。
就是方法重载
第二章 (继承)
1.继承的关键字
类名 extends 要继承的类名
2.可以继承的东西
(1)public和protected修饰的属性和方法。不管子类和父类是否在同一个包里
(2)继承默认权限修饰符修饰的属性和方法。但子类和父类必须在同一个包里。
(3)无法继承private修饰的属性和方法。
(4)无法继承父类的构造方法
(5)void test(); 缺省的。 缺省作用域修饰的属性和方法。在同一包中的类可以继承和调用,不同包中的类无法继承和调用
(6).4个作用域修饰符
访问修饰符 本类 同包类 子类 其他类
private 可以
缺省的(friendly) 可以 可以
protected 可以 可以 可以
public 可以 可以 可以 可以
3.继承构造方法的顺序
public class test1 {
public test1(){
System.out.println("test1");
}
}
public class test2 extends test1{
public test2(){
System.out.println("test2");
}
}
public class test3 {
public static void main(String[] args) {
test2 t = new test2();
}
}
输出 test1 然后输出test2 ; 继承父类之后。会先执行父类的构造方法,然后执行子类的构造方法,
因为子类构造方法没写明super; 于是自动调用super.从而调用了父类的无参构造方法
4. super .继承条件下构造方法的调用规则.
(1)如果子类构造方法没有写super 显示调用父类的有参构造方法。也没有通过this显式调用自身其他构造方法。择会默认先调用
父类的无参构造方法。在这种情况下。写不写super效果都一样!!!!!
(2)如果子类构造方法通过super 显示调用父类的有参构造方法,那将执行父类相应的构造方法。而不会执行父类无参构造方法
(3)如果子类构造方法中通过this显式调用自身其他构造方法。在相应构造方法中应用 1 和 2 两条规则
(4)特别注意的事。如果存在多级继承关系。在创建一个子类对象时。以上规则会多次向更高一级父类应用。一直执行到父类
object类的无参构造(注:什么都没有)方法为止
super() //调用直接父类无参构造方法
super.name //调用直接父类的某个属性值
super.print() //调用直接父类的某个方法
注意: super调用父类构造方法必须是在第一句
public abstract void print(); //不用写方法声明
子类如果继承了父类。 则必须实现这个方法。 否则报错!
6.final 不可更改。!
(1)用final 修饰的类不能再被继承
final class
(2)用final 修饰的方法不能被子类重写
public final void print(){}
(3)用final 修饰的变量将变成常量。只能赋值一次
final String = "南极";
//注意 。值类型变量。值不可更改。引用类型变量 。如一个类。是引用地址不可更改。但是此类的属性可以更改!!!
第三章 (多态)
1.子类转换成父类的规则
(1)将一个父类的引用指向一个子类对象。称为向上转型(upcasting)。自动进行类型转换
如 Pet p = new Dog();
(2)此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法。不是父类的方法
如 p.eat(); 将执行 Dog类的eat() 方法.
(3)此时通过父类引用变量无法调用子类的<<<特有方法>>>。必须进行类型转换!
2.使用父类作为子类继承父类的方法的参数从而实现多态.
把父类座位方法参数是使用多态的常用方式.
3.类型转换
Pet p = new Pet(); //父类 pet
Dog d = (Dog)p; //向下转型。 必须进行转换才可以调用dog类的特有方法
d.catchingFlyDisc(); //调用玩游戏的方法
Penguin pgn = (Penguin)p; //出现转换异常错误。 因为此时pet 是dog 。
4.instanceof 等同于 C#的 is
(1)Pet对象 instanceof dog 判断成功返回真 否则返回假 等同于Pet对象 is dog
(2)使用时 要判断的两个对象必须有继承关系 。 否则编译错误。
(3)数据类型转换失败不会报错。 会赋null值。提高代码健壮性;
5.迭代。 等同于C#的 forecah
for(MotoVehicle mv : mvs){}
6.继承的时候,父类的被继承的方法被继承到子类之后,不能缩小作用域,只能扩大作用域
第四章 (接口)
接口是一种约定。一种能力。 与抽象类 类似.
1.接口的声明和使用
(1)[修饰符] interface 接口名 [extends 父接口。。]{
常量定义。
方法定义.
}
public interface iUSB {}
(2)class 类名 extends 父类名 implements 接口1,接口2 {
}
public class usbI implements IUSB
2.接口的重要注意点。
(1).接口中值能定义常量。接口中的属性都会自动用public static final修饰。 即接口中的属性都是全局静态变量。必须在定义时指定初始值
public static final int pi = 3.14 等同于接口中的 int pi = 3.14
(2).接口中的所有方法都是抽象方法。接口中方法都会自动用public abstract修饰。即接口中只有全局抽象方法
public abstract void show() 等同于接口中的 void show()
(3).和抽象类一样。 接口不能实例化。接口中不能有构造方法.
(4).接口之间可以通过extends继承。一个接口可以继承多个接口。但接口不能继承类
(5).一个类只能有一个直接父类。但可以通过implements实现多个接口。类必须实现接口的全部方法。否则必须定义为抽象类。
类在继承父类的同时又实现了多个接口时。extends必须位于implements
(6). 接口不能实例化.
public interface it{}
测试类中: it i = new it(); 报错。 无法实例化。 等同于抽象类概念
3.接口表示一种约定
(1)即用接口作为参数。 具体可以参考继承的 拿父类作为参数. 类似.
4.接口表示一种能力
(1)一个类实现了一个某个接口,就表示这个类具备了那种能力。
就好像玩游戏。 有很多技能。 你学习了某种技能。 你就能用这个技能了。 具备这种能力了。
5.java 接口与 C#接口的对比
(1).java 通过extends继承父接口。类通过implements实现接口.C#通过 : 实现这两个功能;
(2).java 接口中的成员变量(属性)必须是常量。自动用public static final修饰。C#中不允许存在成员变量。但是可以有属性,不能包含
常量。变量。构造方法和任何静态成员
(3).java接口中属性和方法都可以使用public 修饰。C#中默认public 。不允许显式使用public 修饰
(4).java接口可以定义静态常量和方法,C#中不允许
第5章
1.生成随机数
import java.util.Random; //导入此类
Random r = new Random();
r.nextInt(5); //生成0到4的随机数 小于这个参数
2.static 深入使用。
public final static Level[] levels = new Level[6];
static{
levels[0] = new Level(1,2,10,30,1);
}
(1).以上代码是用static 修饰的代码段. 当类被载入的时候(类第一次被使用到的时候载入。)执行static代码段.
且只执行一次。主要作用是实现static属性的初始化.
3.获取当前时间的毫秒数
long currenTime = System.currentTimeMillis();
4.立即退出程序.
System.exit(1);
5.获取当前类的对象引用
Game g = new Game(this);
第6章
1.instanceof
判断某个对象是否是与一个类或者实现了一个接口。 接口为true 或 false
如下代码案例 其中 cat 和 Dolphin是子类,Animal是父类,cat实现了Terrestrial接口
Cat c = new Cat("加菲猫",4);
Dolphin d = new Dolphin("海豚奇奇");
System.out.println(c instanceof Cat); //true
System.out.println(c instanceof Animal);//true
System.out.println(c instanceof Terrestroal); //true
System.out.println(d instanceof Terrestroal); //false
System.out.println(c instanceof Dolphin); //编译错误
第7章
1.输出本地日期
Date d = new Date();
System.out.Print(d); //输出当前日期。 无格式
SimpleDateFormat sd = new SimpleDateFormat(yyyy-MM-dd); //格式化日期
String str = sd.format(d); //格式化
System.out.Print(str);
第8章(异常与 log4j日志)
(1).java占位符 String.format()
%d : 只适用于数字型的变量或常量 。 可以当做占位符
System.out.println(String.format("%d - %d = %d",10,5,5));
输出结果 -- 10-5=5
(2).判断输入的是否是整数:
System.out.print("请输入数字");
if(input.hasNextInt()){ //hasNextInt()方法。 判断是不是整数
int num = input.nextInt();
}else{
String num = input.next();
System.out.print("输入的数字不正确")
}
适用if else 语句进行异常处理的机制。主要有以下缺点
这样写的缺点:
1.代码臃肿,加入了大量的异常情况判断和处理代码.
2.程序员把相当精力放在了异常处理代码上。放在了堵漏洞上,减少了编写业务代码的时间。必然影响开发效率
3.很难穷举所有的异常情况,程序依旧不健壮.
4.异常处理代码和业务代码交织在一起,影响代码的可读性,加大日后程序的维护难度.
(3)异常
System.err.print("出现错误"); 输出红色字体!
e.printStackTrace(); 输出错误信息。
(4) try{
要监视的代码段
}
catch(Exception e){
异常处理代码段
}
finally{
不管是否出现异常都会执行的代码段
}
(5).try-catch-finally结构
其中try是必须的。catch和finally块为可选。但两者必须出现其中之一.
需要特别注意的是:即使在try 和catch块中存在return,finally中的语句也会
执行, finally唯一不执行的情况是。执行了System.exit(1),将直接退出java虚拟机
(6)多重catch块。
一段代码可能引发多种不同的异常。那我们可以在try块后面跟多个catch块,
分别处理不同的异常。但排序顺序必须是子类到父类,如果吧父类放最前面,
后面的都得不到执行了。
运行时。系统从上到下分别对每个catch块处理的异常类型进行检测。并执行。
第一个与异常类型匹配的catch语句,执行一条catch之后,其他的都会忽略.
(8) throws Exception 声明异常 和 throw 抛出异常
public void setSex(String sex) throws Exception { //声明可能会出现异常。交给方法调用者处理异常。如果没有写处理异常语句会编译报错
if (sex.equals("男") || sex.equals("女")) {
this.sex = sex;
} else {
throw new Exception("性别必须是男或者女"); //抛出异常。 自己创建一个异常。
}
}
Person p = new Person();
try {
p.setSex("啊"); //调用这个方法必须用try catch把他包括起来。否则编译错误。因为这个方法有 throws Exception
} catch (Exception e) {
e.printStackTrace(); //把刚才抛出的异常打印出来
}
(9) log4j日志。
1.右键项目-属性-java构建路径-库-添加外部Jar 选中要添加的log4j 文件.
2.创建log4j.properties文件.在需要的项目下 新建-文件-文件名后缀为properties
3.配置日志信息 -- 关联到日志。日志默认在src文件夹下,要把配置文件放在这.产生的日志文件也默认在src文件夹下。需刷新。
log4j.rootLogger = debug, stdout,logfile 左:设置Logger的输出级别和目的地。 右:输出级别。输出目的地1,输出目的地2
log4j.appender.stdout = org.apache.log4j.ConsoleAppender 左:设置输出目的地 右:ConsoleAppender 输出目的地为控制台
log4j.appender.stdout.Target = System.err 左:配置输出到哪里 右:输出到System.out 或者 System.err
log4j.appender.stdout.layout = org.apache.log4j.SimpleLayout 左:设置日志布局类型 右:非常简单的方式格式化日志输出 或者 HTMLLayout 输出HTML表格
log4j.appender.logfile=org.apache.log4j.FileAppender 左:设置输出目的地 右:FileAppender 输出目的地为文件
log4j.appender.logfile.File=jbit.log 左:设置输出文件名称 右:文件名称
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 左:设置日志布局类型 右:根据指定的转换模式格式化输出日志信息.如果设置了。则必须配置ConversionPattern
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %F %m 左:设置日志布局类型ConversionPattern 右:日志信息格式。
(10)输出级别
fatal 指出每个严重的错误时间将会导致程序的退出
error 指出虽然发生错误事件,但依旧不影响系统的运行
warn 表面会出现潜在错误的情形
info 在粗粒度级别上指明消息。强调应用程序的运行过程
debug 指出细粒度信息事件。对调试应用程序是非常有帮助的
(11).转换模式ConversionPattern
%d 设置输出日志的日期和时间 可以默认 如 %d 也可以指定格式 如 %d{yyyy-MM-dd HH:mm:ss} 类似于 2013-4-28 18:55:22
%m 用来输出代码中指定的消息
%n 用来输出一个换行符
%l 用来输出日志时间的发生位置。包括类名发生的线程,以及在代码中的行数 如:cn.jbit.log.Test11.main(Test11.java:21) 说明发生在cn.jbit.log包下的Test11类
的main线程中。在代码中的行数为21.
%p 用来输出优先级.
%F 用来输出文件名
%M 用来输出方法名
第9章 (集合框架)
1.集合框架内容 注:括号里的是它的子类
(1)Collection接口存贮一组允许重复,无无序的对象
(2)Set接口继承Collection接口。存贮一组不允许重复,无序的对象 (HashSet (LinkedHashSet) , TreeSet)
(3)List接口继承Collection接口。村组一组允许重复,有序的对象 (ArrayList , LinkedList)
(4)Map接口存贮一组成对的 键-值 对象。提供kye(键)到value(值)的映射,key 不允许重复,无序, value 允许重复,无序 (HashMap (LinkedHashMap) , TreeMap)
2.各种集合的常用方法
(1)ArrayList
声明:ArrayList list = new ArrayList();
添加:list.add(值) 添加到末尾; list.add(int,值) 根据指定的int值把值添加到指定位置。
取长度:list.size();
取值:list.get(int); 根据指定的int下标取得对应的值 返回object型值
移除:list.remove(int); 根据指定int下标移除对应的值。 list.remove(对象);根据对象移除指定的对象
判断是否包含: list.contains(对象) 判断指定对象是否存在于集合里。 返回boolean值
(1.1)Vector
Vector 与 ArrayList的异同。Vector是线程安全的。ArrayList重速度轻安全。线程是非安全的。所有当用到
多线程环境中时。需要自己管理线程的同步问题. 当长度需要改变的时候。Vector默认增长一倍。ArrayList增长50% 有利于节约空间
其他用法大致相同
(2)LinkedList 链表集合
声明:LinkedList list = new LinkedList();
添加:list.addLast(值) 添加到链尾; list.addFirst(值) 添加到链头
取长度:list.size();
取值:list.getFirst(); 取得链头的值 list.getLast(); 取得链尾的值 list.get(int) 根据指定的int下标取得对应的值 返回object型值
移除:list.removeFirst(); 移除链头的值 list.removeLast(); 移除链尾的值
判断是否包含: list.contains(对象) 判断指定对象是否存在于集合里。 返回boolean值
(3)HashMap 哈希集合 --继承自Map接口
声明:HashMap Map = HashMap();
添加:Map.put(键,值) 如果添加的键已经存在。 那么会覆盖原有的那个对象
取长度:list.size();
取值:list.get(键); 根据指定的键 取得对应的值 返回object型值
移除:list.remove(键); 根据指定键移除对应的值。
判断是否包含: list.containsKey(键) 判断指定对象是否存在于集合里。 返回boolean值
显示:Map.keyset() 返回全部的键, Map.values() 返回值集 Map 返回键值集 用输出语句输出就可以了
(3.1)Hashtable与HashMap异同 --继承自Dictionary类
Hashtable 与 HashMap 的异同。Hashtable是线程安全的。HashMap重速度轻安全。线程是非安全的。所有当用到
多线程环境中时。需要自己管理线程的同步问题. Hashtable 键和值都不允许为null。HashMap 键和值都允许为null
其他用法大致相同
3.迭代器Iterator --所有集合通用迭代器。 所有集合共有方法 iterator()返回一个Iterator对象产生
(1)声明如下代码
List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()) //判断是否存在下一个可访问的对象 存在为true
Object o = it.next(); //取得下一个对象 返回Object值
4.泛型
(1)ArrayList
声明:List<数据类型> list = new ArrayList<数据类型>();
(2)LinkedList 链表集合
声明:LinkedList<数据类型> list1 = new LinkedList<数据类型>();
(3)HashMap 哈希集合 --继承自Map接口
声明:HashMap<数据类型,数据类型> Map = new HashMap();
其他用法与非泛型集合 一致。 使用泛型使数据存贮更加安全。取出数据也不需要强制转换。效率更高
注意: java中泛型集合如果要使用到int数据类型, 那么 要更改为 Integer
第10章 JDBC
1.JDBC访问数据库的步骤
(1)加载JDBC驱动
Class.forName("JDBC驱动类的名称");
(2)与数据库建立连接
Connection conn = DriverManager.getConnection(数据连接字符串,数据库账户名,密码);
(3)发送sql语句并得到返回结果
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(Select id,name from master);
(4)处理返回结果
while(rs.next){
int id = rs.getInt("id");//获取id 列
String name = rs.getString("name");//获取name列
}
2.使用odbc连接数据库步骤
(1)配置数据源, 具体配置步骤请参见<<配置ODBC数据源V1.0.swf>>
(2)加载jdbc驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); -- 参数 JDBC驱动类的名称
(3)与数据库建立连接
Connection conn = DriverManager.getConnection(数据连接字符串,数据库账户名,密码);
如果配置的数据源是MyKTV05 那么连接字符串就是 conn = DriverManager.getConnection("jdbc:odbc:MyKTV05", "sa","sa");
(4)关闭连接.
conn.Close();
3.使用纯JAVA驱动连接数据库步骤
(1)加载jdbc驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");-- 参数 JDBC驱动类的名称
(2)与数据库建立连接
Connection conn = DriverManager.getConnection(数据连接字符串,数据库账户名,密码);
如:conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=MyKTV05","sa","sa");
其中 通过端口 1433 连接到主机 localhost 然后是数据库名,账号名和密码
(3)关闭连接.
conn.Close();
4.Statement接口的使用。-- 作用:对数据的增删改查
(1)Statement的使用
Statement stmt = conn.createStatement(); //通过已经有的数据连接创建Statement对象。
stmt.execute("要执行的sql语句");
stmt.Close(); //使用完毕需要关闭连接
(2)Statement 的常用方法
stmt.execute(); -- 执行一条sql语句 返回布尔值 , 表示是否返回ResultSet
stmt.executeQuery(); --执行一条sql语句, 返回一个结果集 相当于C#的ExecuteDataReader
stmt.executeUpdate();--执行一条sql语句, 返回一个受影响行数的int值 相当于C#的ExecuteNonQuery
stmt.Close(); 关闭Statement对象
5.ResultSet 的使用。--处理结果集
(1)ResultSet 的使用
ResultSet rs = stmt.executeQuery("select * from [master]"); //stmt对象执行完sql语句后返回了一个结果集。让rs来接收
while(rs.next()) //循环,一行一行的读取数据
{
System.out.print(rs.getInt("id"));
System.out.print("\t" + rs.getString("name"));
System.out.println("\t" + rs.getInt("money"));
}
(2)ResultSet的常用方法介绍
rs.next(); 将光标从当前位置向下移动一行,返回布尔值,存在下一行为true 。 否则为false
rs.previous() 将光标从当前位置向上移动一行,返回布尔值,存在下一行为true 。 否则为false
rs.Close() 关闭ResultSet对象
rs.getXxx(列号<1开始> 或者是 列名) ..方法 Xxx代表数据类型 有int String float三种。方法参数为列号或者列名 从而获取当前光标所在的行的对应数据
rs.getRow() 得到光标当前所指行的行号
rs.absolute(int值) 光标移动到指定的行
6.PrepareStatement 接口。 继承自Statement
(1)为什么要使用PrepareStatement 它比Statement好在哪里 优点。
提高了代码可读性和可维护性 因为可以使用占位符
提高SQL语句的执行性能 。 因为它会预编译好SQL语句
提高了安全性。能有效防止sql注入攻击
(2)PrepareStatement的使用
PrepareStatement pstmt = conn.PrepareStatement("select * from Student where name = '?' and id = ?"); //通过已经有的数据连接创建Statement对象。 ? 占位符
pstmt.setString(1,"小剑"); 使用setXxx实现对每个占位符的赋值. Xxx表示数据类型,setXxx方法有两个参数。
pstmt.setInt(2,5); 第一个参数是对应的占位符的位置。 从1开始。 第二个是 设置占位符的值
stmt.execute(); //执行操作。 这里不需要再传sql语句了
stmt.Close(); //使用完毕需要关闭连接
其他常用方法 与 Statement一致
7.关闭资源注意事项
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
logger.error(e);
}
try {
if (stmt != null)
stmt.close();
} catch (SQLException e2) {
logger.error(e2);
}
try{
if (conn != null)
conn.close();
} catch (SQLException e3) {
ogger.error(e3);
}
应该这样子关闭。 每一个对象关闭都应该有一个独自得try catch块, 如果只用一个try catch块得话。如果第一个关闭出错了。后面的就都不会关闭了!
第11章 Oracle基础
1.创建表空间
create tablespace order_tablespace //创建表空间。名为order_tablespace
datafile 'E:\JavaOOP\oracle\order_tablespace.DBF' //设置表空间的文件的存放路径
SIZE 200M //设置表空间的最大容量
autoextend on next 20M Maxsize 400M //文件大小可自动扩展,每次扩展20M, 文件扩展最大值为400M
logging //Oracle 生产表空间中数据库对象的任何创建或更改的日志记录项
extent management local //表空间中的盘区管理采用本地化管理方式
segment space management auto //表空间中段的管理方式为自动管理方式
表空间许多配置可以采用默认值。这样语句可以简化为
create tablespace order_tablespace //创建表空间。名为order_tablespace
datafile 'E:\JavaOOP\oracle\order_tablespace.DBF' //设置表空间的文件的存放路径
SIZE 200M //设置表空间的最大容量
2.创建用户
create USER easyBuy //创建用户,用户名为 easyBuy
identified by easyBuy //设置用户密码为 easyBuy
default tablespace easyBuy_tablespace // 设置此用户的默认表空间
temporary tablespace easyBuy_tablespace // 设置此用户的临时表空间
drop user news cascade // 删除用户
3.权限
系统有3种预定义角色
connect //临时用户,特别是那些不需要创建表的用户,通常赋予该角色
resource //更为可靠地正式的数据库用户可以授予该角色, 可以创建表,触发器, 过程等
DBA // 数据库管理员角色。拥有管理数据库的最高权限,一个具有DBA角色的用户可以撤销任何别的用户甚至DBA的权限,所以该角色不要随便授予
(1)赋予权限
grant connect,resource to easyBuy //把connect和resource 权限给用户easyBuy
grant create any view to lesson9; //--用dba权限给lesson9用户创建视图的权限
(2)撤销权限
revoke resource from easyBuy //把用户easyBuy的resource权限给撤销
(3)允许用户查看emp表中的记录
grant select on emp to easyBuy //允许用户easyBuy 查看emp表中的数据
比如当前用户epet把emp表的数据允许给easyBuy用户查看,那么easyBuy用户查询emp表就要: select * from epet.emp 查询epet里面的emp表。
(4)允许用户更新emp表中的记录
grant update on emp to easyBuy //允许用户easyBuy 更新emp表中的数据
4.oracle 数据类型
char //存贮固定长度的字符串。如果用户输入的值小于它存贮的大小,则自动以空格填充
varchar2 //存贮可变长度的字符串。使用它可以节省空间。但是效率没有char高
nchar //存贮双字节的数据(汉字)
nvarchar2 //存贮可变长度的 双字节数据
以上4种 都可以加() 然后放上存贮的大小
number
number(p) //P代表最多几位数
number(p,s) //s代表能有几位小数点
(重点)
timestamp //与date 类似的日期数据类型,但其中的秒值精确到小数点后6位
date //日期类型 。
sysdate 可以获取当前系统的日期
---------
lob 存贮大型,没有被结构化的数据,如二进制文件和图片文件。lob数据类型主要分为
blob 存贮二进制对象,如图像,音频。视频文件
clob 用于存贮字符格式的大型对象
5.创建数据库表 和约束
(1)create table pet( --创建表
id number(11), --添加表字段
master_id number(11) not null, - 添加不能为空的表字段
type_id number(11) not null, - 添加不能为空的表字段
status char(1) default 1 not null, -添加设有默认值的表字段
constraint pet_pk primary key(id), --添加主键约束 也可以 id number(11) primary key 同样也能实现
constraint master_fk foreign key(master_id) references master(id), --添加主外键关系
constraint pet_type_fk foreign key(type_id) references pet_type(id) --添加主外键关系
constraint 主外键关系名称 foreign key(外键字段名) references 主键表名(主键字段名) --主外键关系的格式
)
(2)修改表
alter table pet add constraint 主外键关系名称 foreign key(外键字段名) references 主键表名(主键字段名) --修改表pet,添加主外键关系
(3)添加注释。
comment on table pet is '宠物' 给表pet添加注释
comment on column pet.name is '宠物名称' 给表pet的name字段添加注释
(4)DBA为用户创建表。语句如下
create table houserent.DISTRICT 。 给用户houserent创建DISTRICT表.
6.创建和使用序列
序列Oracle提供的用于产生一组等间隔整数的数据库对象,可以通过在插入语句中引用序列值来实现主键自增
(1)创建
create sequence 序列名 --创建序列
start with 1 --设置序列的起始值为1
increment by 1 --设置序列的增长量为1 如果为负值。 则是递减序列
maxvalue 100 --设置序列的最大值为100
minvalue 0 --设置序列的最小值为 0
cycle或 nocycle --用来指定序列达到最大值或者最小值后
cache 10 --用来指定是否在缓存中保存预分配的序列值,如果保存,可以提高获取序列值的速度
order或noorder --保证序列值的唯一性和顺序性,noorder只保证序列的唯一性
(2)使用
使用序列需要用到两个伪列
nextval 返回序列的下一个值
currval 返回序列的当前值
如
insert into master values(master_seq.nextval,'小剑2号','dixiachen1',1)
序列名.nextval 可以添加序列的下一个值
7.删除表空间
(1).drop tablespace epet_tablespace including contents // 删除epet_tablespace表空间中的所有数据
(2).在Oracle工具中删除epet_tablespace表空间,然后再删除对应的物理文件
(3).注意: 千万不能先删除物理文件。。。。 后果自负.
8.注意:添加或者修改了数据, 一定要记得提交。。或者写commit
9.取模方法
mod(4, 3);
第12章 oracle应用
1.连接oracle数据库步骤
(1)加载jdbc驱动
Class.forName("oracle.jdbc.driver.OracleDriver");-- 参数 JDBC驱动类的名称
(2)与数据库建立连接
Connection conn = DriverManager.getConnection(数据连接字符串,数据库账户名,密码);
如:conn = DriverManager.getConnection("jdbc:oracle:@localhost:1521:SJBITDB","sa","sa");
其中 通过端口 1521 连接到主机 @localhost 然后是数据库实例名SJBITDB,账号名sa和密码sa
(3)关闭连接.
conn.Close();
2.oracle数据库函数
(1)to_date('2013-5-8','yyyy-mm-dd') 转化为日期类型的方法 第一个参数是要转化的日期,第二个参数是转化的格式,注意要两边要格式相同才可以转换
(2)日期处理函数
extract() 可以从date型字段中抽取某一部分内容,比如年月日。等
使用方法:extract(year from sysdate)||'年' 获取当前时间的年部分。 其中||'年' 是拼接的意思 相当于 + 号
to_char() 日期转换。默认为 DD-MON-YY
使用方法:to_char(sysdate) 转换当前时间。 如果当前是2013-5-10 会转换为10-5月-13
自定义格式使用方法:to_char(adopt_time,'YYYY"年"MM"月"DD"日"HH24"时"MI"分"SS"秒"')
因为自定义转换的话。接字要加上"" 所以得自己做好转义
(3)decode()函数 。 相当于多重if - else - then 逻辑
decode(value,if1,then1,if2,then2,if3,then3,else)
实际代码:decode(status,1,'正常',2,'禁用','大傻逼')
如果status的值是1 那么返回正常 如果是2 返回禁用。 如果都不是。 那么。。。。 不解释。。
(4)nvl()函数 用于将null值转换指定的值。使用于字符,数字,日期等数据类型
语法格式:nvl(要转换的字段,转换的值)
实际代码: nvl(name,'无名') 如果name为null 那么将会转换为 无名
3.索引
索引可以提高查询的速度。正确设置索引
(1)索引分为:
1 B树索引 一种平衡的索引,无论用户搜索哪一条数据,所花费的时间都是一样的。 平衡了
2 位图索引 如果某个列重复值很多。 就用位图索引,例如性别列。B树索引意义不大。用位图索引很好
3 反向键索引 适用于含有顺序的列,如序列的列,可以提高速度
4 唯一索引 一个列的每个值都不能重复, 如主键
5 非唯一索引 非唯一索引可以重复
6 单列索引 给一个列创建索引
7 组合索引 有些时候总是拿两个或者以上的列的数据来做查询,就可以用他,几个列一起建立组合索引,可以提高速度
8 基于函数的索引 给以一个列设置了索引,但是如果要给这个列的值使用了函数之后,索引就没作用了,这时候用这种索引
语法:
create [unique或bitmap] index 索引名 -- unique设置的话就是唯一索引, bitmap就是位图索引 如果都省略 那么就是 B树索引
on 表名(列名 [asc或desc]) [reverse] asc为升序 desc降序 reverse如果设置了,就是反向索引,如果括号里面有很多列,
那么就是组合索引,如果在括号里用了函数, 那么就是这种基于函数的索引 如:on 表名(to_date(列名,'yyyy') [asc或desc])
(2).按F5查看查询计划(oracle对语句的执行分析,可以通过查看执行计划的信息看执行了哪些索引)
当查询条件中出现了索引对应的列时才会使用索引
4.数据的导入导出.
在cmd中用exp导出 imp导入
Oracle 他和cmd中的exp是类似的,以二进制文件导出,使用最广泛
sql insert 把所有的的数据的sql语句导入出去, 导出为sql文件
PL/PLSQL Developer 是Oracle开发工具独有的文件格式,导入也只有该软件能导入
第13章。 数据访问层
1. 持久化操作包括:保存,删除,修改,读取和查找等
2. DAO模式 Data Access Object 数据存取对象 位于业务逻辑和持久化数据之间实现对持久化数据的访问
2.1 DAO模式的优点: 它实现了两次隔离
(1)隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在,
分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了耦合性,提高了可复用性。
(2)隔离了不同数据库的实现,采用面向接口编程,如果底层数据库变化,如由Oracle变化为SQL server,只要
增加DAO接口的新实现类即可,原有Oracle实现不用修改,这符合开闭原则,降低了代码的耦合性,提高代码的
可扩展性和可移植性
2.2 DAO模式主要由以下几部分组成
(1)DAO接口:把对数据库的所有操作定义成一个个抽象方法,可以提供多种实现
(2)DAO实现类:针对不同数据库给出DAO接口定义方法的具体实现
(3)实体类:用于存放与传输对象数据
(4)数据库连接和关闭工具:避免了连接和关闭代码的重复使用,方便修改
3.实体类传递数据.
(1)实体类的属性一般使用private修饰
(2)对所有私有属性提供get set方法
(3)提供构造方法
(4)最好实现类 java.io.Serializable 支持序列化机制,可以讲该对象转换成字节序列存储在磁盘或在网络传输
(5)如果实现了java.io.Serializable就该定义属性。解决不同版本之间的序列化问题。以下属性
private static final long serialVersionUID = 2070056025956126480L;
第14章 xml和File I/O
1.dtd文件。 dtd文件就是一种标准,一种xml文件的格式的标准
(1)dtd文件可以定义在xml文档内部,也可以作为外部文件导入
导入方法: 其中pets是pet.dtd文件的根元素
(2)以下是以个示例代码的具体介绍
//pet的直接下级元素是dog,penguin,顺序固定,dog只能出现一次, penguin能出现多次
//dog包含这4个属性
//dog 有id属性 是CDATA类型 必须出现
//penguin包含这4个属性
//health 属性 是#PCDATA数据类型的
(3)dtd文件的符号的解释。放在()里的属性的后面
* 代表可以出现0到多次。
+ 代表至少出现1次
? 代表出现0次到1次
2 . XML概念及作用?
(1)是可扩展标记语言,它是一种简单的数据存贮语言,使用一系列自定义的标签来描述数据,它主要的作用就是存储数据,交换数据,数据配置
如何使用CSS修饰XML文档?
(2)使用CSS为它定义如果显示,然后在xml文件里面写上导入外部css文件的语句
Xml-stylesheet type = “text/css” href = “ css文件路径” ?>
(3)xml创建规则
1.至少需要一个元素
2.xml标签区分大小写
3.应正确使用结束标签
4.正确嵌套标签
5.应使用合法标签
6.标记名称长度不要太长
7.应定义有效的属性
8.应验证文档
(4)xml优点
1.独立于计算机平台, //不管是PC电脑 还是手机。 或者其他机器都能识 别
2.简单性, //非常容易上手。很容易看懂
3.独立于操作系统。 //不同的操作系统都可以识别他
4.可扩展性 //
5.独立于编程语言 //不同的编程语言都可以使用它
6.交互性 //数据交换非常的方便。
7.灵活性 //
3. 使用dom解析xml文件 //适用于小数据量的解析 dom4j 自行学习;
3.1
(1). 导入对应的包 ; 如
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
(2).得到dom解析器的工厂的实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
(3).从dom工厂得到dom解析器
DocumentBuilder db = dbf.newDocumentBuilder();
(4).解析xml文档,得到Document 即dom树
Document doc = db.parse("xml文件路径");
Test.class.getResourceAsStream("rubric1.xml") 获取类路径, 获取Test类的路径 具体请看报错信息
(5).得到某个节点的列表信息
NodeList list = doc.getElementsByTagName("student"); //得到所有的student节点集合
(6).接下来循环遍历获取数据
3.2 主要的方法
3.2.1 Document对象的主要方法
(1) getElementsByTagName(String): 返回一个NodeList对象,它包含了所有指定的标签名的集合
(2) getDocumentElement() :返回根节点Element对象
3.2.2 !NodeList对象 //包含了多个node节点的列表,可以看做是以个Node集合
(1) getLength(): 返回列表的长度
(2) item(int) :返回指定位置的Node对象
3.2.3 !Node对象 //是DOM结构最基本的对象,代表文档树中的一个抽象节点.它的子对象有Element,Attr 属性节点。,text 文本节点。等
getChildNodes() 获取此节点的所有子节点node 的集合 NodeList
getFirstChild() 获取此节点的第一个子节点 注意:文本值也是子节点。 是text文本节点 所以获取某个node的文本值需要node1.getFirstChild().getNodeValue()
getNextSibling() 返回在DOM树中这个节点的下一个兄弟节点 一般用作于循环 如下代码
for (Node node1 = node.getFirstChild(); node1 != null; node1 = node1.getNextSibling()){}
getPreviousSibling() 返回在DOM树中这个节点的上一个兄弟节点
getNodeName() : 根据节点的类型返回节点的名称
getNodeValue() :返回节点的值
getNodeType (): 返回节点的类型 注意:解析的时候一般要判断某个节点是否是想要的类型,才获取它的值 如下代码
if (node1.getNodeType() == Node.ELEMENT_NODE) 如果这个节点是 Node.ELEMENT_NODE 才获取它的值。 因为解析的时候,xml文档中的空白符也会被当做对象
被解析出来。所以要对节点类型做判断.
4.使用SAX解析XML
SAX(Simple API for XML) 是另一种常用的xml解析技术。它不像DOM那样建立以个完整的文档树
与DOM相比。它提供更好的性能优势,它最大优点是内存消耗小。因为整个文档无需一次加载到内存中。
这使SAX解析器可以解析大于系统内存的文档。它每读取一个节点,它上一个读取的节点就会释放掉。
SAX解析器不能交流元信息,如DOM的父子支持。所以你必须跟踪解析器处在文档的哪个位置。所以文档越复杂,应用逻辑越复杂
4. 使用Reader读取文件内容
1.创建字符输入流对象,负责读取文件pet.template
Reader rd = new FileReader("pet.template");
2.创建中转站数组 存放读取内容 一次读取10字节
char ch = new char[10];
while (1 == 1) {
3.读取文件到ch数组 返回读取到的数据的长度 如果没有数据就返回-1
length = rd.read(ch);
if (length != -1)
4. 输出保存在ch数组的数据, 输出length的长度的数据
System.out.println(new String(ch, 0, length)); new String(ch, 0, length)//String的构造方法,第1个参数是要输出的东西,第3个参数是要输出数据的长度
else 一般与取到的数据长度对应
break;
}
5. rd.close(); 关闭输入流对象。 切记一定要关闭
5. .template 模板文件
1.替换模板文件中的东西 有如下模板文件
您好!
我的名字是(name), 我是一只(type)
我的主人是(master)。
要把以上文件中的占位的单词替换掉。 很简单。 先读取整个文件 存在String变量中。 然后调用String对象的replace(String1,String2)方法
其中String1是要替换的字符串, String2是替换成什么样
如: str = str.replace("(name)","小剑");
6. 使用Writer写入数据到文件
Writer wr = new FileWriter("要写入的文件的路径"); 如果此文件存在 就会覆盖。 不存在就新建
wr.write(String) 此方法作用是写入数据。参数是想要写进去的东西
wr.close() 关闭输出流。 注意: 必须关闭。 否则数据不会写到文件里
课外知识:
1.java转义字符
如果你想要输出这样的字符串 haha"哈哈哈"
那么就需要转义字符了。因为"号有可能有二义性
就是在每个需要转义的 " 符号前面 加个\
所以代码就是 System.out.println("haha\"哈哈哈\"");
2. 伪表 dual 此表是虚拟的。 一般用作于测试
select sysdate from dual 测试用。。 因为oracle每次查询都要基于from 表