数据库---JDBC的解析

一曲冷凌霜 提交于 2019-12-02 11:36:47

一、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程序更改数据库也不过是换参数
 
 
那么-----读取配置文件有那几种方式呢?
       老哥这个笔记写超棒,但找不到链接---就直接把网址复制过来了。
 
 
@看了下别人写的随笔和自己写的随笔,觉得好差劲--突然在想写笔记的目的无非是我们对知识点的感悟和总结,而每次排版的逻辑和内容梳理也很重要,所以我尽量改进。
  
 
  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!