1)调用Class类的forName()方法,加载并注册数据库驱动。
2)调用DriverManager类的getConnection()方法,建立到数据库的连接
3)调用Connection对象的createStatement()方法,访问数据库
4)调用Statement对象的executeQuery()方法得到ResultSet对象。
5) 调用ResultSet对象的getObject()方法,处理结果。
6)释放资源(连接应该尽可能晚建立,释放资源应尽可能早释放。)
下面是初始代码:
package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** *利用JDBC连接数据库 * @author Haowang */ public class Base { public static void main(String[] args) throws Exception{ prime(); } /** * 初始代码,了解连接数据库的基本步骤 * @throws ClassNotFoundException * @throws SQLException */ private static void prime() throws ClassNotFoundException, SQLException { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //推荐使用这种方式,不会对具体的驱动类产生依赖 // DriverManager.registerDriver(new Driver()); //会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖 // System.setProperty("jdbc.Drivers", "com.mysql.jdbc.Driver"); //虽然不会对具体的驱动类产生依赖,但注册不太方便,所以很少使用 //2.建立连接(Connection) String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); //3.创建语句(Statement) Statement st = conn.createStatement(); //4.执行语句 ResultSet rs = st.executeQuery("Select * from Students;"); //5.处理结果 while(rs.next()) { System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t"+rs.getObject(4)); } //6.释放资源 rs.close(); st.close(); conn.close(); } }
上面代码有很多缺陷,在实际使用过程中应进行优化:
释放资源时应该保证即使前面代码出现异常也能正常释放资源;
驱动只注册一次,采用单例模式(采用静态代码块也可以);
新建一个工具类JdbcUtils,通过这个工具类来访问数据库;
package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** *Jdbc工具类 * @author HaoWang */ public class JdbcUtils { private static String url = "jdbc:mysql://localhost:3306/test"; private static String user = "root"; private static String password = "123456"; private JdbcUtils() { } static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException ex) { throw new ExceptionInInitializerError(ex); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, user, password); } public static void free(Connection conn, Statement st, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(st!=null) { st.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(conn!=null){ conn.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } } } } }
package jdbc; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * * @author Haowang */ public class Optimization { public static void main(String[] args) { optimize(); } public static void optimize() { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //conn = JdbcUtils.getInstance().getConnection(); st = conn.createStatement(); rs = st.executeQuery("Select * from Students;"); while (rs.next()) { System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t" + rs.getObject(4)); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { JdbcUtils.free(conn, st, rs); } } }
下面是用单例模式编写的代码:
package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** *Jdbc工具类 * @author HaoWang */ public class JdbcUtilsSimple { private static String url = "jdbc:mysql://localhost:3306/test"; private static String user = "root"; private static String password = "123456"; private static JdbcUtilsSimple instance = null; private JdbcUtilsSimple() { } public static JdbcUtilsSimple getInstance() { if(instance == null) { synchronized (JdbcUtilsSimple.class) { if(instance == null) { instance = new JdbcUtilsSimple(); } } } return instance; } static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException ex) { throw new ExceptionInInitializerError(ex); } } public Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, user, password); } public void free(Connection conn, Statement st, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(st!=null) { st.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } finally { try { if(conn!=null){ conn.close(); } } catch (SQLException ex) { System.out.println(ex.toString()); } } } } }