1.DBUtils
它是JDBC的简化开发工具包
需项目导入commons-dbutils-1.6.jar
3个核心功能:
- QuerryRunner:提供对SQL语句操作的API
- ResultSetHandler:接口,用于定义select操作后,怎样封装结果集
- DBUtils类:一个工具类,定义了关闭资源与事务处理的方法
2.QuerryRunner
update(Connection conn,String sql,Object...params):用于完成表数据的增删改;
query(Connection conn,String sql,ResultSetHandler<T> rsh,params):用于完成表数据的查询操作
2.1添加
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="INSERT INTO zhangwu(name,money,parent VALUES(?,?,?))";
Object[] params={"股票收入","5500","收入"};//分别对应3个?
Connextion xonn=JDBCUtils.getCOnextion();
int line=qr.update(conn,sql,params);
System.out.println("line"+line);
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.2更新
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="UPDATE zhangwu SET money=money+1000 WHERE name=?";
Object[] params={"股票收入"};
Connextion xonn=JDBCUtils.getCOnextion();
int line=qr..update(conn,sql,params);
System.out.println("line"+line);
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.3删除
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="DELETE FROM zhangwu WHERE name=?";
Object[] params={"股票收入"};
Connextion conn=JDBCUtils.getCOnextion();
int line=qr..update(conn,sql,params);
System.out.println("line"+line);
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.4查询
ResultSetHandler结果集处理类
2.4.1 ArrayHandler
将结果集中的第一条记录封装到一个Object[ ]数组中,数组中的每个元素就是这条记录中的每一个字段的值。
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="SELECT * FROM zhangwu";
Object params={};
Connextion conn=JDBCUtils.getCOnextion();
Object[] objArray=qr.query(conn,sql,new ArrayHandler(),params);
System.out.println(Arrays.toString(objArray));
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.4.2 ArrayListHandler
将结果集中的每一条记录封装到一个Object[ ]数组中,然后将这些数组在封装到List集合中。
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="SELECT * FROM zhangwu WHERE money=?";
Object params={2000};
Connextion conn=JDBCUtils.getCOnextion();
List<Object[]> list=qr.query(conn,sql,new ArrayListHandler(),params);
for(Object[] arr:list){
System.out.println(Arrays.toString(objArray));
}
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.4.3 BeanHandler
将结果集中的第一条记录封装到一个JavaBean中。
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="SELECT * FROM zhangwu WHERE money=?";
Object params={2000};
Connextion conn=JDBCUtils.getCOnextion();
zhangwu zw=qr.query(conn,sql,new BeanHandler<zhangwu>(zhangwu.class),params);
System.out.println(zw);
}catch(SQLException e){
throw new RuntimeException(e);
}
}
- JavaBean:是一种Java语言写成的可重用组件。(http://www.runoob.com/jsp/jsp-javabean.html)
- 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。
- 特点:
- 提供一个默认的无参构造函数。
- 需要被序列化并且实现了Serializable接口。
- 可能有一系列可读写属性(私有字段:private 类型 字段名)
- 可能有一系列的"getter"或"setter"方法
- 属性:
- 一个JavaBean对象的属性应该是可访问的。这个属性可以是任意合法的Java数据类型,包括自定义Java类。
- 一个JavaBean对象的属性可以是可读写,或只读,或只写。JavaBean对象的属性通过JavaBean实现类中提供的两个方法来访问:
getPropertyName() | 举例来说,如果属性的名称为myName,那么这个方法的名字就要写成getMyName()来读取这个属性。这个方法也称为访问器。 |
setPropertyName() | 举例来说,如果属性的名称为myName,那么这个方法的名字就要写成setMyName()来写入这个属性。这个方法也称为写入器。 |
- 示例:
public class StudentsBean implements java.io.Serializable{
private String name = null;
private int age = 0;
public StudentsBean() {
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
2.4.4 BeanListHandler
将结果集中的每一条记录封装到一个JavaBean中。再将这些JavaBean封装到List集合中。
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="SELECT * FROM zhangwu WHERE money=?";
Object params={2000};
Connextion conn=JDBCUtils.getCOnextion();
List<zhangwu> list=qr.query(conn,sql,new BeanListHandler<zhangwu>(zhangwu.class),params);
for(zhangwu zw:list){
System.out.println(zw);
}
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.4.5 ColumnListHandler
将结果集中指定的列的字段值封装到一个List集合中。
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="SELECT * FROM zhangwu WHERE money=?";
Object params={2000};
Connextion conn=JDBCUtils.getCOnextion();
List<String> list=qr.query(conn,sql,new ColumnListHandler<String>(zhangwu.class),params);
for(String str:list){
System.out.println(str);
}
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.4.6 ScalerHandler
用于单数据,eg. select count(*) from user。
public void insert(){
try{
QuerryRunner qr=new QuerryRunner();
String sql="SELECT MAX(money) FROM zhangwu";
Object params={};
Connextion conn=JDBCUtils.getCOnextion();
Double max=qr.query(conn,sql,new ScalarHandler<Double>(),params);
System.out.println("max="+max);
}catch(SQLException e){
throw new RuntimeException(e);
}
}
2.4.7 MapHandler
将结果集中第一行数据封装到Map集合中,key列名,value该列数据。
2.4.8 MapListHandler
将结果集的每一行封装到一个Map中,再将这些Map封装到List中。
3.连接池
用池管理连接Connection,以达到复用Connection的目的。
不用自己创建,通过池来获取Connection对象。
调用Connection的close()方法,并不会关闭Connection,而是将它还给池,池可再分配它。
javax.sql.DataSource
Java为数据库连接池提供的公共接口。
各个厂商应让自己的连接池实现这个接口,以便应用程序可以方便切换不同厂商的连接池。
常见的连接池:DBCP、C3PO
3.1DBCP
tomcat内置的连接池。
导入jar包。
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
DataSource:java提供的连接池规则接口,作为DriverManager工具的替代项。
在DBCP中提供了其实现类:BasicDataSource
创建连接池
public static BasicDataSource datasource=new BasicDataSource();
public static final String DRIVERNAME="com.mysql.jdbc.Driver";
public static final String URL="JDBC:MYSQL://LOCALHOST:3306/mydb";
public static final String USERNAME="root";
public static final String PAEEWORD="root";
static{
datasource.serDriverClassName(DRIVER);
datasource.setUrl(URL);
datasource.setUsername(USERNAME);
datasource.sePassword(PASSWORD);
}
返回连接池对象
public static DataSource getDataSource{
return datasource;
}
使用
public void insert(){
try{
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
String sql="INSERT INTO zhangwu (name,monet,parent) VALUES(?,?,?);
Object[] params={"股票交易","5500","收入"};
int line=qr.update(sql,params);//没有conn这个参数了
System.out.println("line="+line);
}catch(SQLException E){
throw new RuntimeException(e);
}
}
public void search(){
try{
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
String sql="INSERT INTO zhangwu (name,monet,parent) VALUES(?,?,?);
Object[] params={"股票交易","5500","收入"};
Product p=qr.query(sql,new BeanHandler<Product>(Product.class),params);
System.out.println("line="+line);
}catch(SQLException E){
throw new RuntimeException(e);
}
}
常见配置项
必须项
- driverClassName
- url
- username
- password
基本项(扩展)
- maxActive:最大连接数量
- minIdle:最小空闲连接
- maxIdle:最大空闲连接
- initialsize:初始化连接