`
阅读更多

class OracleDriver implements Driver{

     static{  

        OracleDriver d=new OracleDriver();

        DriverManager.addDriver(d);

     }

  }

 

  class DriverManager{

     private static List<Driver> dri=new ArrayList<Driver>();

     public static void addDriver(Driver d){

        ......

        dri.add(d);

     }

     public static Connection getConnection(){

        for(Driver d:dri){ 

           if(d!=null)  return d.getconnect();

        }

     }

  }      

 

  ===================================

  boolean execute(sql) ---> all   execute可以执行所有的SQL语句,返回有boolean

     boolean 表示有没有ResultSet返回

     true:      false:没有

     rs=stm.getResultSet();

 

  ResultSet executeQuery(sql){}-----> select   只能执行查询语句

 

  int executeUpdate(sql){} -----> insert update delete   只能执行增 删 改

 

  jdbc常见问题:

  1 Class not found 

    -------> ojdbc14.jar 

 

  2 No suitable Driver

    ----->url

   

  3 Socket Exception 

   -------à ping 200

   

  4 SQLException ---->  sql

                              

   table: jdbc_users

   sequence:  jdbc_users_seq

  配备文件:

 driver=oracle.jdbc.driver.OracleDriver

url=jdbc:oracle:thin:@192.168.0.200:1521:oradb10g

username=cksd0804

password=cksd0804            

 

BufferedReader

String str=br.readLine();

String[] s=str.split("=");

if(s[0].equals("driver"){}    

 

.properties格式的文件 有一个Map

.properties ------> Map<String,String>

            ------> Properties extends Hashtable<String,String>

 

 JdbcUtil.class.getResourceAsStream("/com/kettas/jdbc/cfg/config.properties"); 

 JdbcUtil.class 表示jdbcUtil的对象

.getResourceAsStream() 通过流的方式获得资源―――对文件进行读取

()里面写虚拟路径

 /com/kettas/jdbc/cfg/config.properties

  /<====>classpath

 

 /home/java/jdbc/..... 

 

 Student s=new Student();

 1. search file ---->Student.class

    path---->command

    classpath--->.class

 2. read Student.class

 3. Class c----> Student详细信息 

 Student s2=new Student();  

 

  .class----> jdbc.jar--->user--->classpath

 

  1 分散代码集中管理

  2 变化的内容写进文件

 

  3 xml   .properties   配备文件的两种常用文件格式

  4  Properties

  5  ExceptionInInitializerError

  6  Class.getResourceAsStream( 虚拟路径 )

                                        

                                        

  1. jdbc 六个步骤

  2. 注册Driver的三种方式

  3. ResultSet遍历

  4. 三种execute方法的区别

  5. JdbcUtil

  6. Driver方展的四个阶段 

  7. 写程序,jdbc_users表插入五条记录

     String[] names={"mary","tom","anna","jerry","george"};

 

==================================

package com.kettas.jdbc.day1;

import java.sql.*;

 

public class FirstJdbc {

 

    public static void main(String[] args) {

       //step 1.  注册Driver

      //注册Driver第二种方式

      /*Driver d1=new oracle.jdbc.driver.OracleDriver();

      try {

         DriverManager.registerDriver(d1);

      } catch (SQLException e1) {

         e1.printStackTrace();

      }

      

       *注册Driver第三种方式

      * 在程序不指定,DriverManager没有,再找环境变量jdbc.drivers

      * 里面有没有指定

      * java  -Djdbc.drivers=oracle.jdbc.driver.OracleDriver classname

       */

      //注册Driver第一种方式

      try {

         Class.forName("oracle.jdbc.driver.OracleDriver");

//       如果需要多个Driver

//       class.forName("driver2");

//       class.forName("driver3");

//       class.forName("driver4");

      } catch (ClassNotFoundException e) {

         e.printStackTrace();

      }

      Connection conn=null;

      Statement stm=null;

      try{

//       step 2. 连接数据库

   String url="jdbc:oracle:thin:@192.168.0.200:1521:oradb10g";

         conn=DriverManager.getConnection(url,"cksd0804","cksd0804");

//       step 3. 创建Statement

         stm=conn.createStatement();

         //step 4. 执行sql 

String sql="insert into jdbc_users(id,name,passwd,phone,email)"

            +" values(jdbc_users_seq.nextval,'zhangsan','11111','22222','zhang@cernet.com')";

         stm.executeUpdate(sql);

         System.out.println("===========insert ok==============");

         //step 5. 处理结果集

      }catch(Exception e){

          e.printStackTrace();

      }finally{

//       step 6. 释放资源

         if(stm!=null)  try{ stm.close();} catch(Exception ee){}

         if(conn!=null) try{ conn.close();} catch(Exception ee){}

      }

   }

 

}

 

 

====================================

 

package com.kettas.jdbc.day1;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

 

import com.kettas.jdbc.util.JdbcUtil;

public class SecondJdbc {

    public static void main(String[] args) {

       Connection conn=null;

       Statement stm=null;

       ResultSet rs=null;

       try{

           conn=JdbcUtil.getConnection();

         stm=conn.createStatement();

       String sql="select id,name,passwd,phone,email from jdbc_users"

               +" where id=2";

          rs=stm.executeQuery(sql);

           //处理结果集

    if(rs.next()){            System.out.println(rs.getInt(1)+"-------"+rs.getString(2));

        }

    /*while(rs.next()){         System.out.println(rs.getInt(1)+"-------"+rs.getString(2));

         }*/遍历结果

//rs第一个下标在结果的上一个地址。

       }catch(Exception e){

           e.printStackTrace();

       }finally{

           JdbcUtil.release(rs,stm,conn);

       }  

    }

}

 

====================================

package com.kettas.jdbc.util;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.Properties;

import java.io.*;

 

public class JdbcUtil {

    private static Properties info=new Properties();

    static{   

       try {

InputStream is=JdbcUtil.class    .getResourceAsStream("/com/kettas/jdbc/cfg/config.properties");

           info.load(is);//???

           is.close();

       } catch (Exception e) {

           throw  new ExceptionInInitializerError(e);

       }

    }

    public static Connection  getConnection() throws Exception{

       Class.forName(info.getProperty("driver"));

       return DriverManager.getConnection(info.getProperty("url"),

              info.getProperty("username"),info.getProperty("password"));

    }

    public static void release(ResultSet rs,Statement stm,Connection conn){

       if(rs!=null)  try{ rs.close();} catch(Exception ee){}

       if(stm!=null)  try{ stm.close();} catch(Exception ee){}

       if(conn!=null) try{ conn.close();} catch(Exception ee){}

    }

    public static void main(String[] args) throws Exception{

       System.out.println(getConnection());

    }

}

 

Connection是线程不安全的,不能在线程间共享

 

=================================

 

1. jdbc 六个步骤

     1)注册Driver

     2)获得连接

     3)创建Statement

     4)执行sql

     5)select--->处理结果集

     6)释放资源(rs,stm,conn)

  2. 注册Driver的三种方式   

     1)Class.forName("oracle.jdbc.driver.OracleDriver");

     2)Driver d=new oracle.jdbc.driver.OracleDriver();

       DriverManager.registDriver(d);

     3)程序里没有指定

       java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver  classname

  3. ResultSet遍历 

     1) next()---->boolean

     2) get***(int)   get***(columnname) 

        eg: getString("name");

     开始时指针指向第一行的上一行,最后指针指向最后一行

     的下一行

  4. 三种execute方法的区别

     1)stm.execute(sql)   all    boolean(ResultSet)

     2)stm.executeQuery(String selectsql) --->ResultSet

     3)stm.executeUpdate(sql)  --->int(db row) 

       ---->delete update  insert   

  5. JdbcUtil

     1)分散代码集中管理(封装)

     2)经常变化的写进文件(配置文件)

       config.xml        config.properties

     3)Properties extends Hashtable<String,String>

       专门处理properties文件,提供load(InputStream is)

     4)在程序加载时读一次文件,所以读文件的代码写在

       静态代码块,里面只能抛一种类型的错误

       ExceptionInInitializerError

     5)利用jvm的类加载器读字节码文件的功能,可以获得

       输入流,

       InputStream is=JdbcUtil.class

             .getResourceAsStream(虚拟路径);

       绝对路径:/是真是的目录里面的根

       虚拟路径:/classpath

    

  6. Driver方展的四个阶段 

     1)Jdbc-odbc

     2)db client

     3)base net pure java

     4)pure java native  纯本地java

    

  7. 写程序,jdbc_users表插入五条记录

     String[] names={"mary","tom","anna","jerry","george"};

 

==================================

 

Statement   PreparedStatement的比较

 1)建立

   stm=conn.createStatement();

   pstm=conn.prepareStatement(sql);

 2)执行

   stm.execute(sql);   包含数据的完整的sql命令

   pstm.execute();     数据

 3)stm 可以执行多条sql

   pstm 只能执行一条sql

 4)使用pstm的环境

   a.执行同构sql,pstm效率高

     执行异构sql,stm效率高   

   b.构成sql语句时需要外部的变量值,pstm

   

   dao:

   public void update(Account a){ 

     sql=update account set username=?,passwd=?,

         personid=?,balance=?;

     pstm=conn.....

     pstm.setString(1,a.getName());

   }

 

========================================================

  

 Transaction: 一组不可再分的sql命令,根具体业务有关

  A:原子性     atom

  C:一致性     coherence

  I:隔离性     insulation

  D:持久性--->commit,rollback

 

  手动划分事务的边界:

   conn.setAutoCommit(false);   

     新事物开始

   conn.commit();

     旧事务的结束,新事务的开始

   conn.rollback();

     旧事务的结束,新事务的开始 

 

   没有手动划分,采用的是默认事务提交策略,

   一条sql一个事务

                     

----------------------------------------------------

  Connection是线程不安全的,不能在线程间共享       

 

  threada   save   withdraw   transfer

  threadb   save   withdraw

 

  1.common: 5 Connection

  2.singleton: 1 Connection               singleton单例模式

  3.一个线程内部共享连接: 2 Connection 

 

    t1.start();

t2.start();

t1.start();

    t2.start();

  class ThreadA extends Thread{  

     private Connection conn1=null;

     public void run(){    

        conn1=JdbcUtil.getConnection();

        save(10000,conn1);

        withdraw();

     } 

     public Connection getConn(){return this.conn1;}

  }

  class Bank{

  public void save(double balance){   

      conn2=Thread.currentThread().getConn();

      sql="update account set balance=?";

      pstm=conn.prepareStatement(sql);

      pstm.set***;

      pstm.executeUpdate();

  }

  public void withdraw(double balance){   

      conn2=this.getConn();

      sql="update account set balance=?";

      pstm=conn.prepareStatement(sql);

      pstm.set***;

      pstm.executeUpdate();

  }      

  }

  每一个线程对象创建好以后,jvm会为其分配一块内存空间,

  用来存放当前线程对象独占数

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics