JDBC基础_建立连接

来源:互联网 发布:淘宝客怎么采集 编辑:程序博客网 时间:2024/06/05 03:05
        JDBC是sun公司制定的一系列接口,各个数据库厂商设计自己数据库的驱动来实现这些接口
1-java中用static修饰的方法可以通过“类.方法名”的方式调用,而无需创建该类的实例。static修饰的代码块(注意是代码块而不是方法)只会执行一次,就是在代码装入虚拟机的时候。
        2-java中的final修饰方法时,表示该方法不能被重写,修饰类时该类不能被继承。
        3-缺省的方法属性可以被同一包中的类使用。
一个不严谨的建立连接的程序:
package cn.hsh.jdbc;
import java.sql.Connection; //选择这些包时会提示你也可以选择com.mysql.jdbc.***,但是注意最好选java.sql.***,因为
import java.sql.DriverManager; //com.mysql.jdbc.***是与具体数据库相关的,会牺牲掉程序的可移植性,
import java.sql.ResultSet;        //com.mysql.jdbc.***是对java.sql.***接口的实现
import java.sql.SQLException;
import java.sql.Statement;
public class Base {
 public static void main(String[] args) throws ClassNotFoundException, SQLException {
  test();
 static void test() throws SQLException, ClassNotFoundException{
//驱动注册
  Class.forName("com.mysql.jdbc.Driver"); //com.mysql.jdbc.Driver加载到JVM而不创建实例,会执行里面的static代码块,该代码块的作用是注册驱动;
//建立连接
  Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/mydata",
    "root","root");
//创建语句,相当于给数据库发送sql语句的载体
  Statement st = conn.createStatement();
//执行语句,将结果返回给rs
  ResultSet rs = st.executeQuery("SELECT * FROM pet");
  while(rs.next()){
   System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));

  }
  rs.close();
  st.close();
  conn.close();
  
}
不严谨之处在于:
        驱动只需注册一次,上书写法每调用一次test()都会注册一次;与具体参数有关的注册驱动Class.forName()和建立连接DriverManager.getConnection(),会降低程序的复用性,而且若前面出现异常则conn.close()不会执行,连接不会关闭。
所以为了确保连接会关闭需要把关闭连接语句放入finally{}里。
改进版1:
package cn.hsh.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Base {
 public static void main(String[] args) throws Exception {
  template();
 }
 static void template() throws Exception {
  Connection conn = null;
  Statement st = null;
  ResultSet rs = null;
  try{
   conn = DriverManager.getConnection(
     "jdbc:mysql://localhost:3306/mydata",
     "root","root");
   st = conn.createStatement();
   rs = st.executeQuery("SELECT * FROM pet");
   while(rs.next()){
    System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));
   }
  }finally{
   try{
    rs.close();
   }finally{
    try{
     st.close();
    }finally{
     conn.close();//嵌套这么多层是为了确保这一句会执行
    }
   }
  }    
 }
}
这段代码的缺点是注册驱动可能会重复执行,最后还有一大段try不简洁
终极版:
写一个工具类JdbcUtils 
package cn.hsh.jdbc;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
public final class JdbcUtils {
 private static String url = "jdbc:mysql://localhost:3306/mydata";
 private static String user = "root";
 private static String password = "root";
 private JdbcUtils() {
  //作为工具的类不需要构造器构造实例,故用private修饰构造器,限制他人构造实例
 }
 static {                                                      //static代码块只会让驱动注册一次
  try{
   Class.forName("com.mysql.jdbc.Drive");
  }catch(ClassNotFoundException e) {
   //异常处理我还不太会这里就没写
  }
 }
 public static Connection getConnection() throws SQLException {
  return DriverManager.getConnection(url,user,password);
 }
 public static void free(ResultSet rs,Statement st,Connection conn){
  try {
   rs.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }finally{
   try {
    st.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }finally{
    try {
     conn.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   
 }
 }
 
 
}
这样实际执行数据库访问的部分会简洁很多,不再有url等具体的值
package cn.hsh.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Base {
 public static void main(String[] args) throws Exception {
  template();
 }
 static void template() throws Exception {
 
  Connection conn = null;
  Statement st = null;
  ResultSet rs = null;
  try{
   conn = JdbcUtils.getConnection();
   st = conn.createStatement();
   rs = st.executeQuery("SELECT * FROM pet");
   while(rs.next()){
    System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));
   }
  }finally{
   JdbcUtils.free(rs, st, conn);
   }
 
 }
}



0 0