`
寂寞游侠
  • 浏览: 2953 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

使用java实现面向对象编程

 
阅读更多
第一章(抽象和封装)
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<String,数据类型>();
其他用法与非泛型集合 一致。 使用泛型使数据存贮更加安全。取出数据也不需要强制转换。效率更高
注意: 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文档内部,也可以作为外部文件导入
导入方法:<!DOCTYPE pets SYSTEM "pet.dtd" > 其中pets是pet.dtd文件的根元素

(2)以下是以个示例代码的具体介绍
<!ELEMENT pet (dog,penguin*)>  //pet的直接下级元素是dog,penguin,顺序固定,dog只能出现一次, penguin能出现多次
<!ELEMENT dog (health,love,decHealth,incLove)>  //dog包含这4个属性
<!ATTLIST dog id CDATA #REQUIRED>   //dog 有id属性 是CDATA类型  必须出现
<!ELEMENT penguin (health,love,decHealth,incLove)> //penguin包含这4个属性
<!ELEMENT health (#PCDATA)>   //health 属性  是#PCDATA数据类型的
<!ELEMENT love (#PCDATA)>
<!ELEMENT decHealth (#PCDATA)>
<!ELEMENT incLove (#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 表

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics