一、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=
                    #初始化连接
                    initialSize=
                    #最大连接数量
                    maxAcitve=
                    #最大空闲连接
                    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"></property>
<property name="checkoutTimeout"></property>
<property name="initialPoolSize"></property>
<property name="maxIdleTime"></property>
<property name="maxPoolSize"></property>
<property name="minPoolSize"></property>
<property name="maxStatements"></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"></property>
<property name="initialPoolSize"></property>
<property name="maxPoolSize"></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的详细用法和图片来源---木霖森77
 


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程序更改数据库也不过是换参数
 
 
那么-----读取配置文件有那几种方式呢?
       老哥这个笔记写超棒,但找不到链接---就直接把网址复制过来了。
 
 
@看了下别人写的随笔和自己写的随笔,觉得好差劲--突然在想写笔记的目的无非是我们对知识点的感悟和总结,而每次排版的逻辑和内容梳理也很重要,所以我尽量改进。
  
 
  

数据库---JDBC的解析的更多相关文章

  1. java连接mysql数据库详细步骤解析

    java连接mysql数据库详细步骤解析      第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar      第二步:导入下载的J ...

  2. 数据库——JDBC

    数据库--JDBC 数据库优点:降低存储数据的冗余度: 更高的数据一致性: 存储的数据可以共享: 可以建立数据库所遵循的标准: 便于维护数据完整性: 能够实现数据的安全性: 建立数据库: 数据库的存储 ...

  3. 常用数据库 JDBC URL 格式

    一 常用数据库 JDBC URL 格式 1 sqLite  驱动程序包名:sqlitejdbc-v056.jar 驱动程序类名: org.sqlite.JDBC JDBC URL: jdbc:sqli ...

  4. Oracle数据库字符集问题解析

    Oracle数据库字符集问题解析 经常看到一些朋友问ORACLE字符集方面的问题,我想以迭代的方式来介绍一下.第一次迭代:掌握字符集方面的基本概念.有些朋友可能会认为这是多此一举,但实际上正是由于对相 ...

  5. BMP是在Bean中完成对数据库JDBC的各种调用

    BMP是在Bean中完成对数据库JDBC的各种调用 CMP是由EJB容器自动完成对数据库的操作 会话Bean主要处理业务逻辑

  6. Java应用程序连接数据库--JDBC基础

    Java应用程序连接数据库--JDBC基础   Java应用程序连接数据库–JDBC基础 <!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency&g ...

  7. canal 基于Mysql数据库增量日志解析

    canal 基于Mysql数据库增量日志解析  1.前言  最近太多事情 工作的事情,以及终身大事等等 耽误更新,由于最近做项目需要同步监听 未来电视 mysql的变更了解到公司会用canal做增量监 ...

  8. 牛客网数据库SQL实战解析(51-61题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  9. 牛客网数据库SQL实战解析(41-50题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

随机推荐

  1. vue 实现邮戳边缘

    效果: vue: <template> <div class="couponItem"> <div class="itemLeft" ...

  2. vue 全局方法(单个和多个方法)

    参考: https://www.cnblogs.com/zhcBlog/p/9892883.html          https://blog.csdn.net/xuerwang/article/d ...

  3. Groupadd- Linux必学的60个命令

    1.作用 groupadd命令用于将新组加入系统. 2.格式 groupadd [-g gid] [-o]] [-r] [-f] groupname 3.主要参数 -g gid:指定组ID号. -o: ...

  4. golang Linux下编译环境搭建

    1.下载golang1.4和1.10源码(1.4以后的版本都用1.4go编译安装,所以先安装1.4) 2.解压后我的目录结构是: /opt/xxx/golang |-------gopath     ...

  5. 去掉IE提示:internet explorer 已限制此网页运行脚本或Activex控件

    运行加载OCX控件的HTML文件,显示提示如下图: 解决方法是在HTML文件中添加一行注释代码,如下图: 就是红色框内的代码.即:<!-- saved from url=(0014)about: ...

  6. JZOJ5898【NOIP2018模拟10.6】距离统计

    题目 题目大意 给你带边权的树,然后有多高询问,每次询问距离某个点第kkk近的节点的距离. 思考 一眼看下去,首先就是想到如何动态的区间第K大,还要支持区间修改-- 于是想了半天,觉得不可做-- 最终 ...

  7. 模板:KD-Tree

    KD-Tree,用来解决多维空间中的问题,其实就是优化暴力(逃 一般cdq能做的它都能做,而且...既然是优化暴力,那就学习一下了 对与几个n维点,我们将它每一维分割,建立一颗二叉树,方便我们搜索剪枝 ...

  8. #pragma omp parallel for

    #pragma omp parallel for是OpenMP中的一个指令,表示接下来的for循环将被多线程执行,另外每次循环之间不能有关系.示例如下: int main(int argc, char ...

  9. Python实现单神经元分类图片的训练

    1.加载包和数据 numpy is the fundamental package for scientific computing with Python. h5py is a common pac ...

  10. debian下编译安装poco

    系统环境: debian版本:Linux localhost.localdomain 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC ...