第八节 JDBC数据库连接池
一、JDBC概述
1、JDBC
-
通过Java语言连接数据库,用jdbc向数据库发送sql语句操作数据库。
-
JDBC驱动器又称JDBC驱动程序,提供者是数据库厂商,sun公司制定规范。
(JDBC驱动器API是由SUN公司负责制定,而JDBC驱动器是由数据库厂商创建) -
数据库驱动包由数据库厂商提供,sun公司提供规范,数据库厂商按规范提供驱动包。(一种接口)
-
JDBC原理:jdbc操作数据库:mysql、oracle、DB2等数据库。(导入数据库驱动程序包)
-
程序员掌握接口即可。
-
jdbc驱动管理的主要实现类:java.sql.DriverManager类
-
jdbc驱动器API主要接口是:java.sql.Driver接口。
-
连接mysql下的mydb数据库的url:jdbc:mysql://localhost:3306/mydb
-
JDBC实现:JDBC驱动管理器、JDBC驱动器API、JDBC驱动器
-
编写JDBCUtils工具包含的操作:加载数据库驱动、建立数据库连接、关闭数据库连接
-
为了避免代码的重复书写,实际开发时通常开发出工具类JDBCUtils,以实现获取连接,关闭数据库资源。
-
数据源所实现的标准接口是:javax.sql.DataSource
-
LinkedList:用于模拟自定义连接池时,由于频繁的增删特性,而使用的集合。
-
数据库连接池,可有效的解决频繁创建和断开Connection对象的操作,从而提高数据库的访问效率。
2、JDBC常用API:
- JDBC帮助文档:J2SE6.0_API.
- Driver:在java.sql包下。常用方法可以获取数据库驱动程序的版本号(开发中暂时无用)
- DriverManager类:在java.sql包下。(JDBC唯一的类)
方法一:注册数据库驱动:registerDriver(Driver driver)
方法二:获取数据库链接:Connection con=getConnection(url,username,password);
url:与数据库链接的地址;username:安装数据库用户名;password:数据库密码 - Connection接口:在java.sql包下,获取发送sql语句对象。
方法一:Statement st= createStatement();
方法二:preparedStatement pst=preparedStatement(sql语句); - Statement接口:在java.sql包下。向数据库发送sql语句,操控数据库。
方法一:对数据添加、删除、修改,创建表等操作。
对数据库进行DML(添加insert、删除delete、修改update)、DDL(create,drop)操作。
int row= executeUpdate(String sql);
方法二:对数据库进行查询操作。
ResultSet rs= executeQuery(String sql); - preparedStatement接口:在Java.sql包下。是Statement子接口。
方法一:对数据添加、删除、修改,创建表等操作。
对数据库进行DML(添加insert、删除delete、修改update)、DDL(create,drop)操作。
int row= executeUpdate();
方法二:对数据库进行查询操作。
ResultSet rs= executeQuery(); - ResultSet接口:在Java.sql包下。封装查询到的结果。
如:获取字段类型varchar的值,getString(字段名称或字段编号)
获取字段类型int的值,grtInt(字段名称或字段编号) - 用于返回表示数据库元数据的方法:getMetaData()
- 将游标从当前位置向下移一行:next()
3、实现一个JDBC程序
- 实现一个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','ylqx@qq.com','1999-01-01'); insert into users(name,password,email,birthday) values('qx','123','qx@qq.com','1999-01-01'); 2、创建项目:略。 注:1. 开发中通常使用(Class.forName("com.mysql.jdbc.Driver");)注册mysql驱动,不用DriverManager注册驱动方法(因为注册驱动两次)。 2. 关闭资源代码要放在finally块里。(因为数据裤连接资源有限。)
4、PrepareStatement对象:
PrepareStatement和Statement区别:
- 功能:都可以向数据库发送给sql语句,对数据库进行crud操作。
- Statement:对多个相同的sql语句,每次都会编译,效率低。
PrepareStatement:会提前预编译,执行多个相同sql语句,效率会提高. - java.sql.Dateyu java.util.date关系:(数据库中插入日期一定要用Java.sql.Date)
- java.sql.Date是子类,java.util.Date是父类
- 两个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数据库连接池
-
目前市面流行的连接池技术:DBCP和C3P0
-
dbcp连接数据库的驱动名称的方法是:setDriverClassName(String driverClassName)
-
数据库连接池
使用jdbc编程时,若网站访问量过大,则对数据库访问和断开回过大,进而降低效率。
由此产生数据库连接池技术:管理连接对象。应用程序不需要创建和断开连接对象,而是交给数据库连接池管理。
数据库连接池断开,不是销毁对象,而是把链接对象归还给数据库连接池。 -
数据库连接池基本参数:
- 初始化大小:数据库连接池里面初始连接对象个数。
- 最大连接数:数据库连接池里面最大连接对象个数。
- 最大等待时间:用户通过数据库连接池连接对象,需要等待时间。
- 最大空闲连接:数据库连接池里面,在哟过户访问趋于稳定时,最大空闲连接个数。
- 最小空闲链接:用户访问趋于顶峰时,数据库链接池里剩余最小链接对象个数。
-
数据库连接池技术:
由sun公司提供规范(数据库连接池接口),不同厂商实现规范,提供具体体现。
目前市面流行的连接池技术:DBCP和C3P0
- DBCP数据源:(DateBase Connection Pool),apache组织提供的开源免费数据库连接池。
- 使用DBCP基本步骤:
1、导入DBCP的jar包,common-dbcp.jar(核心包),commons-pool.jar(依赖包)
2、获取连接对象,设置连接参数(四个连接参数:driverName、url、username、passsword) - DBCP获取连接对象的具体方式:
第一种:直接使用BasicDateSource类创建连接对象
第二种:通过读取配置文件创建连接对象(dbcp.properties)
- 使用DBCP基本步骤:
- C3P0数据源:当前流行的数据库连接池之一,性能更加优越,为后期数据框架hibernate提供很好支持,开源免费。
- C3P0数据源中最主要的核心类是:ComboPooledDataSource
- 使用C3P0数据源时,当传入的参数为空或者不存在时,则会出现使用默认的配置方式创建数据源的问题。
- 使用C3P0基本步骤:
1、导入C3P0的jar包
2、获取连接对象,设置连接参数:(四个连接参数:driverName、url、username、passsword) - C3P0获取连接对象方式:
第一种:ComboPooledDataSource的构造方法获取数据源对象,从而获取连接对象。
第二种:通过配置文件获取数据源对象,从而获取连接对象。(必须为c3p0-config.xml)
2、DBUtils工具
- DBUtils由Apache提供,是commons组织资源,开源免费。
- DBUtils对jdbc简单封装,减少操作数据库代码。需导入commons-dbutils.jar包
- DBUtils类中装载并注册JDBC驱动的方法是loadDriver()方法
- DBUtils类中可用于关闭数据连接的方法是:close()方法、closeQuietly()方法、commitAndCloseQuietly()方法。
- DBUtils类中提供的方法:close()方法、closeQuietly()方法、commitAndCloseQuietly()方法、loadDriver()方法。
- DBUtils类的closeQuietly ()方法与close()方法相比,略。
3、QueryRunner类:
- QueryRunner类时DBUtils下的核心类,对jdbc代码进行了简单封装,对Connection,sql语句,preparedStament,param等进行封装。
- 通常和ResultSetHandler接口配合使用。
QueryRunner类中定义的常用方法:query(执行查询语句)、update(执行增删改语句)
update()方法可执行的操作语句:insert、update、delect语句
update属于QueryRunner类中用于执行增删改语句的方法
delete属于QueryRunner类的query()方法可执行的操作语句 - 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接口:(结果对象处理)
- 用来处理ResultSet结果集对象,将结果集对象里面封装数据转换成所需对象或集合。
- ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。
- ResultSetHandler接口实现类是:BeanListHandler、BeanMapHandler、ScalarHandler
- BeanHandle:把结果集里封装的第一行数据,转换成javaBean对象(查看源码过程:BeanHander——RowProcesser(接口)——BasicRowProcessor——BeanProcessor里面的toBean()方法)
- BeanListHandler:将结果集里封装的数据,把每一行数据转换成JavaBean对象,最后添加到list集合中。
- ScalarHangler:把结果集里的数据,转换成一个对象。
- ScalarHandler:作用将单行单列的值,转换成Object对象
开发中,常用ScalarHandler处理聚集函数
聚集函数:sum、max、min、avg、count
5、DataSource接口:
- DataSource接口中用于获得数据库连接的是:getConnection
- 数据源所实现的标准接口:java.sql.DataSource
- DataSourceBasic属于DataSource的实现类
- DataSource接口实现类的是:BasicDataSource(更加基本)
【其它:】
- setInitialSize(int initialSize):用于设置dbcp连接池初始化连接数目的方法
- ArrayList集合:应对自定义连接池,频繁的增删特性
??3、已知SQL语句: select count(*) from customer;则下面Handler中,最适合转换的是:ScalarHandler
三、代码:使用JDBC数据库完成增删改查
1.步骤:
- 创建javabean封装数据:User
- 创建工具类:JDBCUtils,在开发中提取工具类,为了简化代码,使用方便
- 创建Dao类:UsersDao,连接数据库
- 创建测试类:
测试添加方法的类:JdbcInsertTest
测试查询所有方法的类:FindAllUserTest
测试查询一个对象的类:FindUserByIdTest
测试查询修改方法的类:UpdateUserTest
测试删除方法的类:DeleteUserTest - 代码:略。
End.