zoukankan      html  css  js  c++  java
  • 数据库---JDBC的解析

    一、JDBC是什么?

    JDBC:Java Database Connectivity(Java数据库连接池)。指定了统一的访问各种关系型数据库的标准接口-----桥梁作用。

       功能:【与数据库建立连接】【向数据库发送SQL请求】【处理从数据库返回的结果】

     步骤如下:A. 加载并注册数据库驱动----【数据库不同驱动链接不同】

                  Class.forName("com.mysql.cj.jdbc.Driver"); 
                                     B. 通过DriverManager获取数据库连接
              Connection conn=DriverManager.getConnection(String url,String username,String password);
                                     C. 通过Connection对象获取Statement对象
              stat=conn.createStatement();
                                          D. 使用Statement执行SQL语句         
              int num1=sta.executeUpdate(sql);  或者  res = stat.executeQuery(sql);
                                     E. 操作ResultSet结果集
                    ResultSet.next()
                    用JavaBean封装查询出来的数据对象
                                     F. 关闭连接,释放资源
                            stat.close();//这里并非最好的关闭方式
                            res.close();
                            conn.close();

            关闭流的顺序---推荐反着来----先关ResultSet---Statement----Connection---推荐显式关闭---并关闭前判断是否为空

           原因是:关闭Conneciton,且Statement若不手动关闭,将由GC机制自动关闭,且再关闭前Statement对象和ResultSet对象将被占用。

              若在自动关闭前-----数据库连接池的连接数量达到最大允许值--此时将会抛异常。

            Driver接口:JDBC程序必须实现的接口,专门提供给提供数据库厂商使用。
           DriverManager类:管理数据库中所有的驱动程序,用于加载JDBC驱动,在数据库的驱动程序之间建立连接。
           Connection接口:代表与特定的数据库的连接,只有获得其连接对象才能访问数据库,在上下文中执行SQL语句的返回结果。
          Statement接口:用于执行静态的SQL语句,并返回一个结果对象。
              execute():可以执行任何SQL语句。
              executeUpdate()执行增删改语句,返回一个int的值,即影响的行数。    
              executeQuery()执行查询语句,返回一个查询结果的ResultSet对象
             PreparedStatement接口:是Statement的子接口,执行预编译的SQL语句。
                用占位符“?”来代替其他参数,再通过SetXxx()方法赋值。预编译SQL语句。
           ResultSet接口:类似一个临时表,用来暂时存放数据库查询操作所返回的结果集,封装在一个逻辑表格中。
              该接口中存有一个指向表格数据行的游标(或指针),调用next()方法游标移动下一行,若无数据,返回false。
                 定义getXxx()方法既可以通过字段的元素指引获取数据,也可以通过字段的名称来获取指定元素
            
    注意:mysql8.0以上版本-----url中要加入时区信息:serverTimezone=UTC。
              且Mysql的驱动链接有改变:com.mysql.cj.jdbc.Driver
              使用JavaBean文件的setXxx方法要与数据库的字段名相同。

      二、如何更好的优化JDBC? 
         当用户量过多时,每次都需要创建Connection对象,这是件很消耗性能的事情。因此,诞生了数据库连接池
        
      数据库连接池:负责分配、管理、释放数据库连接,允许应用程序重复使用现有的数据库来接。
          数据源:实现了Javax.sql.DataSource接口的类称为数据源,即数据源中存储了所有建立数据库连接的信息,即数据来源。
          DataSource接口:为获取数据库连接对象(Connection),负责与数据库建立连接,并定义返回值为Connection对象的方法。
      
    DBCP数据源:数据库连接池(DataBase Connection Pool)的简称,apache组织下的开源连接池的实现。
       BasicDataSource:是DataSource接口的实现类,主要包括设置数据源对象的方法。a.需要手动给数据源对象设置属性值,然后获取数据库连接对象。
         BasicDataSourceFactory:是创建BasicDataSource对象的工厂类,
          它包含一个返回值为BasicDataSource对象的方法createDataSource()方法。
          该方法通过读取配置文件的信息生成数据源对象并返回给调用者。
    dpcpconfig.properties       #连接设置
                        driverClassName=com.mysql.cj.jdbc.Driver
                        url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
                        username=root
                        password=123456
                        #初始化连接
                        initialSize=5
                        #最大连接数量
                        maxAcitve=10
                        #最大空闲连接
                        maxIdle=10
    通过配置文件读取数据源得到连接
    public static DataSource ds=null;

      static {

      Properties prop=new Properties();//新建配置文件对象
      InputStream in = new Dbcp2().getClass(). //通过类加载器找到文件路劲,读配置文件
      getClassLoader().getResourceAsStream("dbcpconfig.properties");
      prop.load(in);//以输入流的形式加载到配置对象中
      ds=BasicDataSourceFactory.createDataSource(prop);}//创建数据源
     

     
     
     C3P0数据源:实现了DataSource数据源接口,开源框架Hibernate和Spring都支持该数据源。
          ComboPooledDataSource:是DataSource接口的实现类,创建数据源对象
               a.使用ComboPooledDataSource()构造方法创建数据源对象,需要手动给数据源对象设置属性值,然后获取数据库连接对象。
               b.使用ComboPooledDataSource(String configName)构造方法读取c3p0.xml配置文件,从而创建数据源对象,再获取数据库连接对象。
    <c3p0-config>
        <default-config>
            <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
            <property name="jdbcUrl">
            jdbc:mysql://localhost:3306/demo?useUnicode=true&amp; characterEncoding=UTF-8&amp; useSSL=false&amp; serverTimezone=GMT%2B8
            </property>
            <property name="user">root</property>
            <property name="password">123456</property>
            <property name="checkoutTimeout">3000</property>
            <property name="initialPoolSize">10</property>
            <property name="maxIdleTime">30</property>
            <property name="maxPoolSize">100</property>
            <property name="minPoolSize">10</property>
            <property name="maxStatements">200</property>
        </default-config>
        <named-config name="itcast">
            <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
            <property name="jdbcUrl">
                    jdbc:mysql://localhost:3306/demo?useUnicode=true&amp; characterEncoding=UTF-8&amp; useSSL=false&amp; serverTimezone=GMT%2B8
            </property>
            <property name="user">root</property>
            <property name="password">123456</property>
            <property name="initialPoolSize">10</property>
            <property name="maxPoolSize">200</property>
        </named-config>
    </c3p0-config>

    通过配置数据源得到数据库连接连接池连接
    public static DataSource ds = null;

    static {
      
      ComboPooledDataSource cpds=new ComboPooledDataSource("itcast");

       ds=cpds;
         }

      注:配置文件名必须为c3p0-config.xml或者c3p0.properties,并且位于该项目的scr根目录下。
                 当传入的configName值为空或者不存在时,则使用默认的配置方式创建数据源。
     
    还有阿里巴巴提供的数据源----druid
      
     
    关于 druid的详细用法和图片来源---
     


    DBUtils工具:Apache提供的第三方工具,实现了对JDBC的封装。----对于操作的可观性,提供了很大的便利。
      QueryRunner类:简化了执行SQL语句的代码,与ResultSetHandler组合在一起能完成大部分数据库操作。
       常见方法:
        query(String sql,ResultSetHandler rsh,Object...params):执行查询操作,能从提供给构造方法的数据源或使用SetDataSource()方法中获得连接。
        update(String sql,Object...params)方法:执行插入、更新、或删除操作,params可置换多个参数。
      ResultSetHandler接口: 处理ResultSet结果集,可以将结果集中的数据转为不同的形式。
        BeanHandler和BeanListHandler实现类:将结果集中的数据封装到对应的JavaBean实例中。
        ScalarHandler:输出结果集中一行数据的指定字符段值。
        MapHandler:把一行结果转为Map对象。
    QueryRunner qr=new QueryRunner(DButils.getDataSource());//得到数据源(得到连接)并创建执行器对象
    List  list=(List)qr.query(sql, new BeanListHandler<User>(User.class));
     注意:数据库连接池只是代为管理Connection---意思是:数据库连接的连接数有限,咱若不关闭,它过段时间见帮咱关闭。
      这里的关闭,是指把Connection重新放回带连接池,等待下一次取用。当访问量过多,会出现如下情况:
        数据库连接连接池的连接数达到上限,无连接可用,持续等待中----有可能抛异常。
     
    问题来了:既然Java代码可以编写JDBC程序,那么为什么还普遍会用配置文件XML或properties???
       .............好像是框架采用配置文件加载JDBC,便于更改数据库,但是Java程序更改数据库也不过是换参数
     
     
    那么-----读取配置文件有那几种方式呢?
           老哥这个笔记写超棒,但找不到链接---就直接把网址复制过来了。
     
     
    @看了下别人写的随笔和自己写的随笔,觉得好差劲--突然在想写笔记的目的无非是我们对知识点的感悟和总结,而每次排版的逻辑和内容梳理也很重要,所以我尽量改进。
      
     
      
  • 相关阅读:
    pysocketserver
    协程
    py模块和包
    py网络编程
    GridView绑定技巧终结者
    iOS 证书/私钥/代码签名/描述文件
    八拜之交
    POJ3230(Travel)
    POJ2553(The Bottom of a Graph)
    动态规划的实质
  • 原文地址:https://www.cnblogs.com/Tanggula-pioneer/p/11708781.html
Copyright © 2011-2022 走看看