Java web基础知识 第八节 JDBC数据库连接池

第八节 JDBC数据库连接池

      • 一、JDBC概述
        • 1、JDBC
        • 2、JDBC常用API:
        • 3、实现一个JDBC程序
        • 4、PrepareStatement对象:
        • 5、ResultSet对象:
      • 二、JDBC数据库连接池
        • 1、JDBC数据库连接池
        • 2、DBUtils工具
        • 3、QueryRunner类:
        • 4、ResultSetHeadler接口:(结果对象处理)
        • 5、DataSource接口:
      • 三、代码:使用JDBC数据库完成增删改查

一、JDBC概述

1、JDBC

  1. 通过Java语言连接数据库,用jdbc向数据库发送sql语句操作数据库。

  2. JDBC驱动器又称JDBC驱动程序,提供者是数据库厂商,sun公司制定规范。
    JDBC驱动器API是由SUN公司负责制定,而JDBC驱动器是由数据库厂商创建

  3. 数据库驱动包由数据库厂商提供,sun公司提供规范,数据库厂商按规范提供驱动包。(一种接口)

  4. JDBC原理:jdbc操作数据库:mysql、oracle、DB2等数据库。(导入数据库驱动程序包

  5. 程序员掌握接口即可。

  6. jdbc驱动管理的主要实现类:java.sql.DriverManager类

  7. jdbc驱动器API主要接口是:java.sql.Driver接口。

  8. 连接mysql下的mydb数据库的url:jdbc:mysql://localhost:3306/mydb

  9. JDBC实现:JDBC驱动管理器、JDBC驱动器API、JDBC驱动器

  10. 编写JDBCUtils工具包含的操作:加载数据库驱动、建立数据库连接、关闭数据库连接

  11. 为了避免代码的重复书写,实际开发时通常开发出工具类JDBCUtils,以实现获取连接,关闭数据库资源。

  12. 数据源所实现的标准接口是:javax.sql.DataSource

  13. LinkedList:用于模拟自定义连接池时,由于频繁的增删特性,而使用的集合。

  14. 数据库连接池,可有效的解决频繁创建和断开Connection对象的操作,从而提高数据库的访问效率。

2、JDBC常用API:

  1. JDBC帮助文档:J2SE6.0_API.
  2. Driver:在java.sql包下。常用方法可以获取数据库驱动程序的版本号(开发中暂时无用)
  3. DriverManager类:在java.sql包下。(JDBC唯一的类
    方法一:注册数据库驱动:registerDriver(Driver driver)
    方法二:获取数据库链接:Connection con=getConnection(url,username,password);
    url:与数据库链接的地址;username:安装数据库用户名;password:数据库密码
  4. Connection接口:在java.sql包下,获取发送sql语句对象。
    方法一:Statement st= createStatement();
    方法二:preparedStatement pst=preparedStatement(sql语句);
  5. Statement接口:在java.sql包下。向数据库发送sql语句,操控数据库
    方法一:对数据添加、删除、修改,创建表等操作。
    对数据库进行DML(添加insert、删除delete、修改update)、DDL(create,drop)操作。
    int row= executeUpdate(String sql);
    方法二:对数据库进行查询操作。
    ResultSet rs= executeQuery(String sql);
  6. preparedStatement接口:在Java.sql包下。是Statement子接口。
    方法一:对数据添加、删除、修改,创建表等操作。
    对数据库进行DML(添加insert、删除delete、修改update)、DDL(create,drop)操作。
    int row= executeUpdate();
    方法二:对数据库进行查询操作。
    ResultSet rs= executeQuery();
  7. ResultSet接口:在Java.sql包下。封装查询到的结果。
    如:获取字段类型varchar的值,getString(字段名称或字段编号)
    获取字段类型int的值,grtInt(字段名称或字段编号)
  8. 用于返回表示数据库元数据的方法:getMetaData()
  9. 将游标从当前位置向下移一行:next()

3、实现一个JDBC程序

  1. 实现一个JDBC案例:
    通过Java源代码操作数据库具体步骤:
    	0、导入jar包
    	1、注册并加载驱动:
    			DriverManager。registerDriver(Driver driver);
    	2、获取Connection连接对象:
    			Connection con= DriverManager.getConnection(url,username,password);
    	3、获取操作数据库的Statement对象(或PreparedStatement)Statement stmt= con.createStatement();
    	4、向数据库发送sql语句,执行操作。
    			String sql="select * from users";调用executeQuery(sql)(查询)
    	5、执行查询操作,返回ResultSeti结果集对象,结果激励封装查询对象。
    			遍历ResuleSet,获取查询数据。
    	6、关闭链接,释放资源。(先出现的,后关闭)
    
    准备工作:
    	1、创建数据库:jdbc,在数据库里创建表,插入几条数据。
    		create database jdbc;
    		use jdbc;
    		create table users(id int primary key auto_increment,name varchar(32),password varchar(32),email varchar(100),birthday Date);
    		insert into users(name,password) values('ylqx','123');
    		insert into users(name,password,email,birthday) values('ylqx','123','[email protected]','1999-01-01');
    		insert into users(name,password,email,birthday) values('qx','123','[email protected]','1999-01-01');
    
    	2、创建项目:略。
    注:1. 开发中通常使用(Class.forName("com.mysql.jdbc.Driver");)注册mysql驱动,不用DriverManager注册驱动方法(因为注册驱动两次)。
    	2. 关闭资源代码要放在finally块里。(因为数据裤连接资源有限。)
    

4、PrepareStatement对象:

PrepareStatement和Statement区别:

  1. 功能:都可以向数据库发送给sql语句,对数据库进行crud操作。
  2. Statement:对多个相同的sql语句,每次都会编译,效率低。
    PrepareStatement:会提前预编译,执行多个相同sql语句,效率会提高.
  3. java.sql.Dateyu java.util.date关系:(数据库中插入日期一定要用Java.sql.Date)
    1. java.sql.Date是子类,java.util.Date是父类
    2. 两个Date之间相互转换,
      java.util.Date utilDate = new java.util.Date(); //多态
      java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime()); //构造方法墙强转

5、ResultSet对象:

	结果集对象用来封装查询出来的数据,调用next方法跳转到下一行,逐个获取数据。
	如果想支持结果集的滚动效果,在创建Statement对象时,就需支持滚动效果。

二、JDBC数据库连接池

1、JDBC数据库连接池

  1. 目前市面流行的连接池技术:DBCP和C3P0

  2. dbcp连接数据库的驱动名称的方法是:setDriverClassName(String driverClassName)

  3. 数据库连接池
    使用jdbc编程时,若网站访问量过大,则对数据库访问和断开回过大,进而降低效率。
    由此产生数据库连接池技术:管理连接对象。

    应用程序不需要创建和断开连接对象,而是交给数据库连接池管理。
    数据库连接池断开,不是销毁对象,而是把链接对象归还给数据库连接池。

  4. 数据库连接池基本参数:

    1. 初始化大小:数据库连接池里面初始连接对象个数。
    2. 最大连接数:数据库连接池里面最大连接对象个数。
    3. 最大等待时间:用户通过数据库连接池连接对象,需要等待时间。
    4. 最大空闲连接:数据库连接池里面,在哟过户访问趋于稳定时,最大空闲连接个数。
    5. 最小空闲链接:用户访问趋于顶峰时,数据库链接池里剩余最小链接对象个数。
  5. 数据库连接池技术:
    由sun公司提供规范(数据库连接池接口),不同厂商实现规范,提供具体体现。
    目前市面流行的连接池技术:DBCP和C3P0


  1. DBCP数据源:(DateBase Connection Pool),apache组织提供的开源免费数据库连接池。
    1. 使用DBCP基本步骤:
      1、导入DBCP的jar包common-dbcp.jar(核心包),commons-pool.jar(依赖包)
      2、获取连接对象,设置连接参数(四个连接参数:driverName、url、username、passsword)
    2. DBCP获取连接对象的具体方式:
      第一种:直接使用BasicDateSource类创建连接对象
      第二种:通过读取配置文件创建连接对象(dbcp.properties
  2. C3P0数据源:当前流行的数据库连接池之一,性能更加优越,为后期数据框架hibernate提供很好支持,开源免费。
    1. C3P0数据源中最主要的核心类是:ComboPooledDataSource
    2. 使用C3P0数据源时,当传入的参数为空或者不存在时,则会出现使用默认的配置方式创建数据源的问题。
    3. 使用C3P0基本步骤:
      1、导入C3P0的jar包
      2、获取连接对象,设置连接参数:(四个连接参数:driverName、url、username、passsword)
    4. C3P0获取连接对象方式:
      第一种:ComboPooledDataSource的构造方法获取数据源对象,从而获取连接对象。
      第二种:通过配置文件获取数据源对象,从而获取连接对象。(必须为c3p0-config.xml)

2、DBUtils工具

  1. DBUtils由Apache提供,是commons组织资源,开源免费。
  2. DBUtils对jdbc简单封装,减少操作数据库代码。需导入commons-dbutils.jar包
  3. DBUtils类中装载并注册JDBC驱动的方法是loadDriver()方法
  4. DBUtils类中可用于关闭数据连接的方法是:close()方法、closeQuietly()方法、commitAndCloseQuietly()方法。
  5. DBUtils类中提供的方法:close()方法、closeQuietly()方法、commitAndCloseQuietly()方法、loadDriver()方法。
  6. DBUtils类的closeQuietly ()方法与close()方法相比,略。

3、QueryRunner类:

  1. QueryRunner类时DBUtils下的核心类,对jdbc代码进行了简单封装,对Connection,sql语句,preparedStament,param等进行封装。
  2. 通常和ResultSetHandler接口配合使用。
    QueryRunner类中定义的常用方法:query(执行查询语句)、update(执行增删改语句)
    update()方法可执行的操作语句:insert、update、delect语句
    update属于QueryRunner类中用于执行增删改语句的方法
    delete属于QueryRunner类的query()方法可执行的操作语句
  3. QueryRunner类的使用方式:
    第一种:
    QueryRunner runner=new QueryRunner();
    runner.query(connection,sql,处理器对象,params);
    runner.update(connection,sql,处理器对象,params);
    第二种:
    QueryRunner runner=new QueryRunner(dataSource对象);
    runner.query(sql,处理器对象,params);
    runner.update(sql,处理器对象,params);

4、ResultSetHeadler接口:(结果对象处理)

  1. 用来处理ResultSet结果集对象,将结果集对象里面封装数据转换成所需对象或集合。
  2. ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。
  3. ResultSetHandler接口实现类是:BeanListHandler、BeanMapHandler、ScalarHandler
  4. BeanHandle:把结果集里封装的第一行数据,转换成javaBean对象(查看源码过程:BeanHander——RowProcesser(接口)——BasicRowProcessor——BeanProcessor里面的toBean()方法)
  5. BeanListHandler:将结果集里封装的数据,把每一行数据转换成JavaBean对象,最后添加到list集合中。
  6. ScalarHangler:把结果集里的数据,转换成一个对象。

  1. ScalarHandler:作用将单行单列的值,转换成Object对象
    开发中,常用ScalarHandler处理聚集函数
    聚集函数:sum、max、min、avg、count

5、DataSource接口:

  1. DataSource接口中用于获得数据库连接的是:getConnection
  2. 数据源所实现的标准接口:java.sql.DataSource
  3. DataSourceBasic属于DataSource的实现类
  4. DataSource接口实现类的是:BasicDataSource(更加基本)

【其它:】

  1. setInitialSize(int initialSize):用于设置dbcp连接池初始化连接数目的方法
  2. ArrayList集合:应对自定义连接池,频繁的增删特性

??3、已知SQL语句: select count(*) from customer;则下面Handler中,最适合转换的是:ScalarHandler


三、代码:使用JDBC数据库完成增删改查

1.步骤:

  1. 创建javabean封装数据:User
  2. 创建工具类:JDBCUtils,在开发中提取工具类,为了简化代码,使用方便
  3. 创建Dao类:UsersDao,连接数据库
  4. 创建测试类:
    测试添加方法的类:JdbcInsertTest
    测试查询所有方法的类:FindAllUserTest
    测试查询一个对象的类:FindUserByIdTest
    测试查询修改方法的类:UpdateUserTest
    测试删除方法的类:DeleteUserTest
  5. 代码:略。

End.

你可能感兴趣的:(Java,web基础学习)