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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-6-7 10:21 编辑

就业班_JavaEE_day10_11_JDBC
一概述
                    开发人员
                jdbc接口规范                              sun规定的标准,在 java.sql 包下
    mysql驱动jar包        oracle驱动jar包          数据库厂商提供
    mysql数据库            oracle数据库   
   
二 开发流程
     1注册驱动
        Class.forName("com.mysql.jdbc.Driver");  加载mysql驱动类,实现自动注册。
        因为所有的数据库厂商提供的Driver实现类都添加了静态代码块来自动注册。代码如下:
        static {
            DriverManager.registerDriver(new Driver());   
        }
     2获取连接
         String url = "jdbc:mysql://localhost:3306/store";  jdbc:mysql 表示协议  localhost:3306 表示数据库服务器IP和端口  store 表示数据库名称
         Connection conn = DriverManager.getConnection(String url,String username,String password);
     3获取Statement
        Statement stmt = conn.createStatement();
     4执行sql并返回resultset
        ResultSet rs = stmt.executeQuery(String sql);
     5处理结果集
         while(rs.next()) {    //rs.next() 将结果集的游标向下移动一行。默认在第一行的前面。
            rs.getInt();   
            rs.getString();
         }
     6释放资源
        rs.close()  stmt.close()  conn.close()  先开后关,写在finally中 标准写法如下:
        if(rs != null) {
            try{
                rs.close();
            }catch(SQLException e) {
                e.printStack();
            }
            rs = null;
        }
     
三 API
     1 Driver
     2 DriverManager
        1 DriverManager.regedistDriver(new com.msql.jdbc.Driver());
        2 DriverManager.getConnection(String url,String username,String password);
    3  Connection
        1 statement
        2 事务操作
    4 Statement(实际不用)
        executeQuery(DQL)  executeUpdate(DML,DDL)     批处理
     5 PreparedStatement (mysql5之后默认不支持预编译,需要通过参数设置开启  useServerPrepStmts=true)
            好处:
                * 防止SQL注入 ,屏蔽输入字符串中的mysql关键字功能,当作普通字符串。
                * 提高可读性
                * 提高效率
            预编译原理:
                sql需要先被校验语法,然后被编译,才能被执行。pstmt的sql在第一次会做校验语法和编译,第二次则跳过语法校验和编译过程,从而提高效率。
            SQL模板带有占位符?,占位符索引从1开始  模糊查询的匹配符在参数设置中体现,在sql中不体现。ps.setString("%s%")
     6 CallableStatement  调用存储过程
        注意:ps和cs是statement的子接口
     7 ResultSet
         1 next() 判断下一行是否有数据   默认resultset的行光标在第一行的前面。
         2 getInt()  getString() getDouble() getDate() (返回的是java.sql.Date) getObject()   
            索引或者列名  索引从1开始  如果有别名则是别名  建议用列名来获取。
   
   
四 JDBCUtils自定义工具类
    将注册驱动、获取连接、释放资源的代码 和 jdbc连接的四要素用配置文件进行加载 进行封装。
   
五 批处理
    批处理 url中添加参数rewriteBatchedStatements=true
    Statement批处理
        sql1 sql2 addBatch(sql1)  addBatch(sql2)   executeBatch()  clearBatch()
    PreparedStatement批处理
        sql  setString(1,"name1")  addBatch()  setString(1,"name2")  addBatch()   executeBatch() clearBatch()
        eg:
        String sql = "insert into t_user(username,pwd,email) values(?,?,?)";
            ps = conn.prepareStatement(sql);
            for (int i = 0; i <= 10000; i++) {
                ps.setString(1, "wangwu"+i);
                ps.setString(2, "pwd"+i);
                ps.setString(3, "wangwu"+i+"@163.com");
                ps.addBatch();
                if(i % 1000 == 0){
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            
六 事务
    事务由Connection管理,核心思想是业务的各个逻辑操作要由同一个connection 进行管理。
    操作步骤如下:
    setAutoCommit commit  rollback  setSavePoint
   
七 连接池概述
    1 javax.sql包下的DataSource  连接池接口
    2 连接池原理:在服务器启动时,就初始化一批连接供应用使用,应用使用完不关闭连接,而是归还给连接池。这样就节省了连接的创建和关闭时间。
    3 自定义连接池。增强类的方法有3种方式: 1 子类继承父类重写父类方法 2 装饰者模式 装饰类实现与被装饰类相同的接口,并持有被装饰类的引用。3 动态代理
       eg  MyConnection  implements Connection {
                Connection conn = DriverManager.getConnection(url,username,password);
                public statement createStatement(){
                    conn.createStatement();
                }
                public void close() {
                    //不关闭连接,只释放。
                }
            }
     因为接口中的方法很多,所有可以通过继承模版类来简化编写。模版类中实现了Connection接口,里面也持有Connection的引用,并对所有方法通过引用做了实现。
     我们继承后只需对需要改写的方法进行重写即可。
    5 dbcp
         a  导包 commons-dbcp-1.4.jar  commons-pool-1.3.jar
         b  BasicDataSource  source = new BasicDataSource();
         c  设置连接池基本四要素   驱动类全名称  连接URL  用户名 密码
    6 c3p0
          a 导包 c3p0-0.9.1.2.jar
          b 配置文件  c3p0-config.xml  配置文件名称是固定的
          c ComboPooledDataSource  dataSource = ComboPooledDataSource()
            不带参数默认加载classpath下的c3p0-config.xml中的default-config
            带参数可以加载配置文件中指定名称的config
            对于Java工程项目 classpath对应src目录。
    7 druid
        a 导包 druid-1.0.9.jar
        b 配置文件 druid.properties   配置文件中的key是固定的。 driverClassName  url   username  password  
        c DruidDataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
         
八 DBUtils
     1 导包 commons-dbutils-1.4.jar
     2 QueryRunner   该类对preparedstatement resultset 以及资源的关闭 都做了封装,我们使用完不需要再做释放资源操作。
        可以控制事务的一组方法:
            QueryRunner()
             T query(Connection conn, String sql,  ResultSetHandler<T> rsh, Object... params)
             int update(Connection conn,  String sql, Object... params)
        不可以控制事务的一组方法
            QueryRunner(DataSource ds)
            T query(String sql,  ResultSetHandler<T> rsh, Object... params)
             int update(String sql, Object... params)
    3 QueryRunner的ResultSetHandler需要掌握的5种形式
           BeanHandler
           BeanListHandler
           MapHander        将字段名称与字段值作为键值对
           MapListHandler
           ScalarHandler    单行单列 例如 select count(*) from account


1 个回复

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