一、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. No context type was found in the assembly

    如果解决方法中有多个项目存在,记住要在默认项目中选择你需要的项目进行 enable-migrations    add-migration 以及updatebase

  2. 计算机程序是怎么通过cpu,内存,硬盘运行起来的?

    虽然以前知道计算机里有CPU,内存,硬盘,显卡这么些东西,我还真不知道这些东西是怎么协作起来完成一段程序的,能写出程序却不懂程序,也不会向别人解释他们的关系,所以特意总结了一下,写的比较浅显,和我一样 ...

  3. CPA专业阶段单科成绩有5年有效期限,即从通过科目考试的第一年算起

    你为什么不去参加注册会计师考试? 注册会计师考试出考率极低,大家都有自己的原因,可以客观地说,每年注会考场出考人数不足三成,到底是什么原因不去考试呢?大家是这么说的. 1.没有好好复习呗,还怎么去考试 ...

  4. 事务一致性理解 事务ACID特性的完全解答

    A  原子性 事务管理者多个小操作,他们同时完成或者同时不完成就是原子性 C 一致性 一致性,是一个很相对的,很主观的概念, 一致性 描述的是 事务 从一个一致的状态变成 另一个一致的状态. 一致性需 ...

  5. Spring AOP(三)--XML方式实现

    本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了: 一.创建一个连接点 1⃣️定义接口 注意⚠️:可以定 ...

  6. service network restart 报错重启失败

    Job for network.service failed because the control process exited with error code. See “systemctl st ...

  7. 第03章 科学计算库Numpy

    016.Numpy数据结构    关于矩阵运算的库 矩阵 017.Numpy基本操作 判断每一个元素的 018.Numpy矩阵属性 019.Numpy矩阵操作 020.Numpy常用函数 按列拼接就用 ...

  8. 二进制日志过期时间设置expire_logs_days

    # expire_logs_days参数只支持整数,且范围是[0,99] show variables like 'expire_logs_days';set global expire_logs_d ...

  9. 使用Python的requests库作接口测试——对HTTP动词的支持

    Requests提供了几乎所有HTTP动词的功能:GET,OPTIONS, HEAD,POST,PUT,PATCH和DELETE. 动词GET-查看提交信息 HTTP GET是一个幂等的方法,从给定的 ...

  10. NOIP2017到都不签签记

    day 0: 校内开运动会,但是还是在机房学习了一天. 感觉上并没有多大用处,主要只是活跃一下思维而已. 然后就晚上上车出发去酒店. 下了个游戏王. 晚上叫了波宅急送,然后硬是腐了一个晚上. day ...