在开发中只使用JDBC会使得代码冗余过多,为简化代码对相同的地方进行抽取,使用DBUtils类对JDBC进行封装
由于返回的会是JavaBean类对象,所以我们要编写自己的JavaBean类。一般放在domain文件夹中。
JavaBean类
1、实现接口java.io.Serializable 可省略
2、提供私有字段
3、提供getter/setter方法
4、提供无参构造方法
如下:编写了一个User类用来接受对象
public class User {
private int pid;
private String pname;
private double price;
private int cid;
public User(){}
public int getPid() {return pid;}
public void setPid(int pid) {this.pid = pid;}
public String getPname() {return pname;}
public void setPname(String pname) {this.pname = pname; }
public double getPrice() {return price;}
public void setPrice(double price) {this.price = price;}
public int getCid() {return cid;}
public void setCid(int cid) {this.cid = cid;}
}
DBUtils
三个核心功能的介绍
1、QueryRunner类提供了对sql操作的api
QueryRunner(DataSource ds) 提供连接池,底层自动维护连接Connection。update方法执行更新数据,query执行操作数据。
2、ResultSetHandler接口定义了select操作后怎样封装结果集。用来将ResultSet转换为目标类的工具。
MapHandler:单行处理器!把结果集转换成Map
MapListHandler:多行处理器!把结果集转换成List;
BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
BeanListHandler:多行处理器!把结果集转换成List
ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
3、DbUtils类,工具类,定义了关闭资源和事务处理的方法。
closeQuietly 关闭连接 commitAndCloseQuietly 提交并关闭连接 rollbackAndCloseQuietly 回滚并关闭i链接
测试DBUtils
import java.sql.SQLException;
import java.util.List;
import _3_javabean.domain.*;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import _1_C3P0连接池.C3P0Utils;
public class TestDBUtils {
//查询所有
@Test
public void testQueryAll(){
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from product";
List users = qr.query(sql, new BeanListHandler(User.class));//注意参数,查询列表 返回javabean的列表
for(User user :users)
System.out.println(user.getPname()+" "+user.getPid());
} catch (SQLException e) {
e.printStackTrace();
}
}
//查询ID
@Test
public void testQueryID(){
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from product where pid = ?";
Object[] params = {5};
User user =qr.query(sql, new BeanHandler(User.class), params); //查询一个,bean操作,必须编写javabean
System.out.println(user.getPname()+" "+user.getPid());
} catch (SQLException e) {
e.printStackTrace();
}
}
//查询用户个数
@Test
public void testQueryID1(){
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select count(*) from product ";
Long i = (Long) qr.query(sql, new ScalarHandler());//单数据 返回的是lang,
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}
}
//添加方法
@Test
public void testAddUser(){
try {
//创建核心类
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
//编写SQL语句
String sql = "insert into product values(null,?,?,null,1)";
//占位符设置值
Object[] params = {"柳岩",23.2};
//执行
int row = qr.update(sql, params);
System.out.println(row);
} catch (SQLException e) {
e.printStackTrace();
}
}
//修改方法
@Test
public void testUpdateUser(){
try {
//创建核心类
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
//编写SQL语句
String sql = "update product set pname = ? where pid = ?";
//占位符设置值
Object[] params = {"吕布",25};
//执行
int row = qr.update(sql, params);
System.out.println(row);
} catch (SQLException e) {
e.printStackTrace();
}
}
//删除方法
@Test
public void testdeleteUser(){
try {
//创建核心类
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
//编写SQL语句
String sql = "delete from product where pid = ?";
//占位符设置值
Object[] params = {25};
//执行
int row = qr.update(sql, params);
System.out.println(row);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
所学的东西:
①Junit 可代替main方法
②JDBC (开发步骤) 数据库接口 每次都需要获得连接和释放资源,因此抽取一个工具类JdbcUtils
③配置文件 xx.properties 使用ResourceBundle加载
④连接池 共享连接 自定义连接池/C3P0/DBCP
C3P0
配置文件 c3p0-config.xml 放于src文件中 编写了一个连接池的工具类 C3P0Utils
⑤DBUtils 简化JDBC
编写JavaBean (开发步骤)