Java篇-DBUtils与连接池
2018-08-09 本文已影响113人
TianTianBaby223
一 : DBUtils
DBUtils
就是为了简化JDBC
的快发而产生的开发工具包.对JDBC
的一种封装.
核心功能
1. QueryRunner 中提供对sql语句操作的API
update(Connection conn, String sql, Object... params)
用来完成数据表的增删改操作.
增添
//增
public static void insert() throws SQLException{
Object[] par = {"牛油果热辣藤椒鸡超级可塔",23.5};
String sql = "insert into product (pname,price) values (?,?)";
QueryRunner qr = new QueryRunner();
int row = qr.update(con, sql, par);
System.out.println(row);
DbUtils.close(con);
}
删除
//删
public static void delete() throws SQLException{
String sql = "delete from product where id = ?";
QueryRunner qr = new QueryRunner();
int row = qr.update(con, sql, 4);
System.out.println(row);
DbUtils.close(con);
}
更改
//改
public static void update() throws SQLException{
Object[] par = {"肯德基CP堡",28.5,2};
String sql = "update product set pname = ?,price = ? where id = ?";
QueryRunner qr = new QueryRunner();
int row = qr.update(con, sql, par);
System.out.println(row);
DbUtils.close(con);
}
2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
其子类以及功能包括
子类功能列表
JavaBean
介绍,好像是我们通常用的mvc中model模型,其实就是一个类,
提供私有字段 : private类型 字段名;
提供getter/setter方法;
提供无参
构造器,注意:无参构造器一定要提供否则会报错.
也可以实现java.io.Serializable接口
package com.tiantianBaby.java;
public class Product {
private int id;
private String pname;
private String price;
public Product() {
}
public Product(int id, String pname, String price) {
super();
this.id = id;
this.pname = pname;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
@Override
public String toString() {
return "Product [id=" + id + ", pname=" + pname + ", price=" + price + "]";
}
}
-
ArrayHandler
public static void arrayHander() throws SQLException{
String sql = "select * from product";
QueryRunner qr = new QueryRunner();
Object[] arr = qr.query(con, sql, new ArrayHandler());
for(Object obj : arr){
System.out.println(obj);
}
}
打印
1
汉堡王大汉堡
23.0
-
ArrayListHandler:
//ArrayListHandler
public static void ArrayListHandler()throws SQLException {
String sql = "select * from product";
QueryRunner qr = new QueryRunner();
List<Object[]> list = qr.query(con, sql,new ArrayListHandler());
for(Object[] itemarr : list) {
for(Object obj:itemarr) {
System.out.print(obj+" ");
}
System.out.println();
}
}
打印
1 汉堡王大汉堡 23.0
2 肯德基CP堡 28.5
3 苹果笔记本 14000.0
6 板烧鸡腿堡 18.0
7 牛油果热辣藤椒鸡超级可塔 23.5
8 肯德基水果茶 11.8
-
BeanHandler
public static void BeanHandler() throws SQLException{
String sql = "select * from product";
QueryRunner qr = new QueryRunner();
Product pro = qr.query(con, sql,new BeanHandler<Product>(Product.class));
System.out.println(pro);
}
打印
Product [id=1, pname=汉堡王大汉堡, price=23]
-
BeanListHandler
public static void BeanListHandler() throws SQLException{
String sql = "select * from product";
QueryRunner qr = new QueryRunner();
List<Product> list = qr.query(con, sql,new BeanListHandler<Product>(Product.class));
for(Product p : list) {
System.out.println(p);
}
}
打印
Product [id=1, pname=汉堡王大汉堡, price=23]
Product [id=2, pname=肯德基CP堡, price=28.5]
Product [id=3, pname=苹果笔记本, price=14000]
Product [id=6, pname=板烧鸡腿堡, price=18]
Product [id=7, pname=牛油果热辣藤椒鸡超级可塔, price=23.5]
Product [id=8, pname=肯德基水果茶, price=11.8]
-
ColumnListHandler
public static void columnListHandler() throws SQLException{
String sql = "select * from product";
QueryRunner qr = new QueryRunner();
List<String> list = qr.query(con, sql,new ColumnListHandler<String>("pname"));
for(Object obj : list) {
System.out.println(obj);
}
}
打印
汉堡王大汉堡
肯德基CP堡
苹果笔记本
板烧鸡腿堡
牛油果热辣藤椒鸡超级可塔
肯德基水果茶
-
ScalarHandler
public static void ScalarHandler() throws SQLException {
String sql = "select count(*) from product";
QueryRunner qr = new QueryRunner();
long count = qr.query(con, sql,new ScalarHandler<Long>());
System.out.println(count);
}
打印
6
-
MapHandler
public static void mapHandler() throws SQLException{
String sql = "select * from product";
QueryRunner qr = new QueryRunner();
Map<String,Object> map = qr.query(con, sql,new MapHandler());
for(String str : map.keySet()) {
System.out.println(str+"---"+map.get(str));
}
}
打印
id---1
pname---汉堡王大汉堡
price---23.0
-
MapListHandler
public static void mapListHandler() throws SQLException{
String sql = "select * from product";
QueryRunner qr = new QueryRunner();
List<Map<String,Object>> list = qr.query(con, sql, new MapListHandler());
for(Map<String,Object> map : list) {
for(String key : map.keySet()) {
System.out.print(key+"---"+map.get(key)+" ");
}
System.out.println();
}
}
打印
id---1 pname---汉堡王大汉堡 price---23.0
id---2 pname---肯德基CP堡 price---28.5
id---3 pname---苹果笔记本 price---14000.0
id---6 pname---板烧鸡腿堡 price---18.0
id---7 pname---牛油果热辣藤椒鸡超级可塔 price---23.5
id---8 pname---肯德基水果茶 price---11.8
3. DbUtils类,提供了关闭资源与实务的处理方法
DbUtils.close(con);
二 : 连接池
用池来管理Connection
,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,所以通常用连接池结束,来共享连接Connection.这样就不用每次都创建连接,释放链接了,这些操作都交给连接池.
DBCP连接池
DBCP是一个开源的连接池,是Apache Common
成员之一,在企业开发中也比较常见,tomcat
内置的连接池.
导入jar包
导入jar包DataSource接口
DataSource
是java中提供的连接池,作为DriverManager
工具的代替项.
在DBCP提供接口的实现类, 我们要用的具体的连接池
BasicDataSource
类.
-
BasicDataSource类的常见配置
分类 属性 | 描述 |
---|---|
driverClassName | 数据库驱动名称 |
url | 数据库的地址 |
username | 用户名 |
password | 密码 |
maxActive | 最大连接数量 |
minActive | 最小连接数量 |
maxIdle | 最大空闲连接 |
minIdle | 最小空闲连接 |
initialSize | 初始化连接 |
连接
public class DataSourceDemo {
public static void main(String[] args) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/javadatabase");
dataSource.setUsername("root");
dataSource.setPassword("newpass");
try {
Connection con = dataSource.getConnection();
System.out.println(con);
} catch (SQLException e) {
// e.printStackTrace();
throw new RuntimeException("数据库连接失败");
}
}
}
封装工具类
其中地址url,用户名和密码,都可以用文件进行动态配置.
public class JDBCUtils {
private static BasicDataSource datasource = new BasicDataSource();
static{
//数据库连接信息,必须的
datasource.setDriverClassName("com.mysql.jdbc.Driver");
datasource.setUrl("jdbc:mysql://localhost:3306/javadatabase");
datasource.setUsername("root");
datasource.setPassword("newpass");
//对象连接池中的连接数量配置,可选的
datasource.setInitialSize(10);//初始化的连接数
datasource.setMaxActive(8);//最大连接数量
datasource.setMaxIdle(5);//最大空闲数
datasource.setMinIdle(1);//最小空闲
}
public static DataSource getDataSource() {
return datasource;
}
}
测试工具类
public class QueryRunnerTest {
public static void main(String[] args) {
// select();
insert();
}
private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
public static void insert() {
String sql = "insert into product (pname,price) values(?,?)";
Object[] parms = {"肯德基水果茶","11.8"};
try {
int row = qr.update(sql,parms);
System.out.println(row);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException("数据添加失败");
}
}
public static void select() {
String sql = "select * from product";
try {
List<Object[]> list = qr.query(sql, new ArrayListHandler());
for(Object[] obs : list) {
for(Object item : obs) {
System.out.print(item + "\t");
}
System.out.println();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException("数据查询失败");
}
}
}