本文共 11007 字,大约阅读时间需要 36 分钟。
今日任务
Ø 使用JDBC完成对分类表的CRUD的操作(JDBC的回顾)Ø 使用DBCP,C3P0连接池完成基本数据库的操作(抽取工具类)Ø 使用元数据抽取一个JDBC的框架.Ø 能够使用DBUtils完成CRUD的操作教学导航教学目标掌握DBCP和C3P0连接池的使用并掌握连接池的原理.掌握使用元数据抽取基本的JDBC通用方法的思想.能够使用DBUtils完成基本的CRUD的操作教学方法案例驱动法1.1 上次课内容回顾:MYSQL:工具类的抽取:public class JDBCUtils {/** * 注册驱动的方法 */public static void loadDriver(){try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 获得连接的方法 */public static Connection getConnection(){Connection conn = null;try {loadDriver();conn = DriverManager.getConnection("jdbc:mysql:///web_07", "root", "123");} catch (SQLException e) {e.printStackTrace();}return conn;}/** * 释放资源的方法 */public static void release(ResultSet rs,Statement stmt,Connection conn){if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. rs = null; }if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. stmt = null; }if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. conn = null; }}public static void release(Statement stmt,Connection conn){if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. stmt = null; }if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. conn = null; }}}带有属性文件的工具类的抽取:定义了一个属性文件:public class JDBCUtils {private static final String driverClass;private static final String url;private static final String username;private static final String password;static {Properties properties = null;// 读取属性文件:使用Java中Properties的对象.try{InputStream is = new FileInputStream("src/jdbc.properties");properties = new Properties();properties.load(is);}catch(Exception e){e.printStackTrace();}driverClass = properties.getProperty("driverClass");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");}/** * 注册驱动的方法 */public static void loadDriver(){try {Class.forName(driverClass);} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 获得连接的方法 */public static Connection getConnection(){Connection conn = null;try {loadDriver();conn = DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();}return conn;}/** * 释放资源的方法 */public static void release(ResultSet rs,Statement stmt,Connection conn){if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. rs = null; }if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. stmt = null; }if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. conn = null; }}public static void release(Statement stmt,Connection conn){if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. stmt = null; }if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } // 垃圾回收尽快回收对象. conn = null; }}}
参见JDBCDemo2类:
1.2.4 总结:1.2.4.1 JDBC的API:【Connection】Ø 创建执行SQL的对象:Ø 进行事务管理:
【Statement】
Ø 执行SQL语句:Ø 执行批处理:
【ResultSet】
Ø 获得结果集中的数据:public class MyDataSource implements DataSource{// 创建一个List集合用于存放多个连接对象.private Listlist = new ArrayList ();// 在程序开始的时候,初始化几个连接,将连接存放到list中.public MyDataSource() {// 初始化3个连接:for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}@Override// 获得连接的方法:public Connection getConnection() throws SQLException {if(list.size() <= 0){for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}Connection conn = list.remove(0);return conn;}// 归还连接的方法:public void addBack(Connection conn){list.add(conn);}...}
【自定义连接池中问题及如何解决】
Ø 问题?1.如果使用自定义连接池,那么需要额外记住自定义连接池中的API.2.能不能使用面向接口的编程方式.Ø 解决:不额外提供API方法,就可以解决上述两个问题!!!能不能还调用Connection的close方法.能不能增强Connection的close方法,原有的销毁变为归还!!!Ø 如何增强Connection的close方法:}
class WaiteressWrapper implements Waiter{ private Waiter waiter;public WaiteressWrapper(Waiter waiter) { this.waiter = waiter;}@Override public void server() { System.out.println("微笑..."); // this.waiter.server(); }
}
【使用装饰者模式增强Connection的close方法】public class MyConnection implements Connection{ private Connection conn;private List<Connection> list;public MyConnection(Connection conn,List<Connection> list) { this.conn = conn;this.list = list;配置文件设置参数:
手动方式:
/public void demo1(){ Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;BasicDataSource dataSource = new BasicDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///web_07");dataSource.setUsername("root");dataSource.setPassword("123");try{ // 获得连接:conn = dataSource.getConnection();// 编写SQL:String sql = "select from category";// 预编译SQL:stmt = conn.prepareStatement(sql);// 执行SQL:rs = stmt.executeQuery();while(rs.next()){ System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));}}catch(Exception e){ e.printStackTrace();}finally{ JDBCUtils.release(rs,stmt, conn);}}@Test
/**配置文件方式:
*/public void demo2(){ Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;Properties properties = new Properties();try{ properties.load(new FileInputStream("src/dbcpconfig.properties")); DataSource dataSource = BasicDataSourceFactory.createDataSource(properties); // 获得连接: conn = dataSource.getConnection(); // 编写SQL: String sql = "select * from category"; // 预编译SQL: stmt = conn.prepareStatement(sql); // 执行SQL: rs = stmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt("cid")+" "+rs.getString("cname")); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtils.release(rs,stmt, conn); }
}
【C3P0连接池的使用】第一步:引入C3P0连接池的jar包.第二步:编写代码:数据库元数据
*/public void demo1(){ Connection conn = null;conn = JDBCUtils2.getConnection();// 获得数据库元数据:try { DatabaseMetaData metaData = conn.getMetaData();System.out.println("获得驱动名称:"+metaData.getDriverName());System.out.println("获得驱动URL:"+metaData.getURL());System.out.println("获得用户名:"+metaData.getUserName());// 获得表中的主键: ResultSet rs = metaData.getPrimaryKeys(null, null, "category"); if(rs.next()){ String name = rs.getString("COLUMN_NAME"); System.out.println(name); } } catch (SQLException e) { e.printStackTrace(); }
}
@Test
/**参数元数据:
*/public void demo2(){ Connection conn = null;PreparedStatement stmt = null;try{ conn = JDBCUtils2.getConnection();String sql = "update category set cname = ? where cid = ?";stmt = conn.prepareStatement(sql);ParameterMetaData metaData = stmt.getParameterMetaData();int count = metaData.getParameterCount();System.out.println(count);}catch(Exception e){}
}
@Test
/**结果集元数据:
/public void demo3(){ Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try{ conn = JDBCUtils2.getConnection();String sql = "select from category";stmt = conn.prepareStatement(sql);rs = stmt.executeQuery();ResultSetMetaData metaData = rs.getMetaData(); int count = metaData.getColumnCount(); for(int i = 1;i<=count ;i++){ String name = metaData.getColumnName(i); String type = metaData.getColumnTypeName(i); System.out.println(name+type); } }catch(Exception e){ }
}
转载于:https://blog.51cto.com/13587708/2095173