A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2017-8-31 18:18 编辑

『黑马程序员济南』JavaEE就业笔记串讲--JDBC


【JDBC的概述】
  • JDBC:Java DataBase Connectivity Java数据库的连接.
* 是SUN公司统一提供的一套接口规范(JDBC).各个数据库生产商提供实现.
  • 驱动:两个硬件设备之间通信的桥梁.
【JDBC的开发步骤】
  • 注册驱动:
  • 获得连接:
  • 获得执行SQL语句对象:
  • 释放资源:
【Connection】
  • 创建执行SQL的对象:
     createStatement();
     prepareStatement(sql)
     prepareCall(sql)
  • 进行事务管理:
     setAutoCommit(boolean)
     commit()
     rollback()
【Statement】
  • 执行SQL语句:
     executeQuery(sql)
     executeUpdate(sql)
     execute(sql)
  • 执行批处理:
     addBatch(sql)
     clearBatch()
     executeBatch()
【ResultSet】
  • 获得结果集中的数据:
     * getXXX(int idx);
     * select cname,cid from category;
     * getXXX(String name);        
  • 默认情况下:next();
     * 正常的情况下结果集只能向下的.
【自定义连接池】
     * SUN公司提供了一个连接池的接口.(javax.sql.DataSource).
     * 定义一个连接池:实现这个接口.
     * 使用List集合存放多个连接的对象.
【自定义连接池的代码】
[Java] 纯文本查看 复制代码
public class MyDataSource implements DataSource{
        // 创建一个List集合用于存放多个连接对象.
        private List<Connection> list = new ArrayList<Connection>();
        // 在程序开始的时候,初始化几个连接,将连接存放到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方法:
    * 增强一个Java类中的某个方法有几种方式???
    * 一种方式:继承的方式.
        * 能够控制这个类的构造的时候,才可以使用继承.
    * 二种方式:装饰者模式方式.
        * 包装对象和被包装的对象都要实现相同的接口.
        * 包装的对象中需要获得到被包装对象的引用.
        ***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.
    * 三种方式:动态代理的方式.
        * 被增强的对象实现接口就可以.
【常见的开源的数据库连接池】:
  • DBCP:
       DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
  • C3P0:
     C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
  • Tomcat内置连接池:
【DBCP连接池的使用】
  第一步:引入DBCP连接池的jar包.
  第二步:编写DBCP代码:
    * 手动设置参数:
    * 配置文件设置参数:
【DBCP连接池的使用】
        
[Java] 纯文本查看 复制代码
@Test[/size]
        /**
         * 手动方式:
         */
        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);
                }
        }
        
        
[Java] 纯文本查看 复制代码
@Test[/size]
        /**
         * 配置文件方式:
         */
        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包.
   第二步:编写代码:
     * 手动设置参数:
     * 配置文件设置参数:
【C3P0改造工具类】
[Java] 纯文本查看 复制代码
public class JDBCUtils2 {
        private static final ComboPooledDataSource DATA_SOURCE =new ComboPooledDataSource();
        /**
         * 获得连接的方法
         */
        public static Connection getConnection(){
                Connection conn = null;
                try {
                        conn = DATA_SOURCE.getConnection();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return conn;
        }
...
}

【JDBC的元数据MataData】
  • DatabaseMetaData:获得数据库连接的信息,获得数据库的表的信息.
     * 获得数据库元数据:Connection中getMetaData();
  • ParameterMetaData:获得SQL中的参数的个数及类型.
     * 获得参数元数据:PreparedStatement中getParameterMetaData()
  • ResultSetMetaData:获得结果集中的列名及列的类型.
     * 获得结果集元数据:ResultSet中getMeta()
【元数据的使用】
        
[Java] 纯文本查看 复制代码
@Test[/size]
        /**
         * 数据库元数据
         */
        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();
                }
        }
                
[Java] 纯文本查看 复制代码
@Test[/size]
        /**
         * 参数元数据:
         */
        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){
                        
                }
        }
                
[Java] 纯文本查看 复制代码
@Test[/size]
        /**
         * 结果集元数据:
         */
        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){
                        
                }
        }

点进这个帖子的同学肯定是要奋发图强,学技术拿高薪的有志青年,这里我看你骨骼惊奇,是个绝世的练武奇才,你我有缘,今天我就把这个武林秘籍如来神掌传授于你! 什么?不想学如来神掌?不要紧!这里有各个门派的武林绝学,链接拿好!!哈哈哈哈



1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马