特此说明:本文参考黑马程序员视频讲座 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
经过WEB_10【JDBC连接池】的学习,可以知道,连接池的使用可以大大减少资源开销,提高程序效能,而代码还存在很多冗余,在增删改查的时候有很多重复代码,为了减少代码冗余,可以用传参的方法来解决这个问题。
JavaBean
- 需要实现接口:java.io.Serializable,通常省略了
- 提供私有属性
- 提供getter/setter方法
- 提供无参构造
建议放在.domain包下
User.java
package cn.domain;
public class User {
private Integer user_id;
private String user_name;
private String user_password;
public User() {
// TODO Auto-generated constructor stub
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
}
注意生成getter/setter的方法,右键-source-generate getters and setters
DBUtils
DBUtils封装了jdbc操作,简化了JDBC操作,可以少写代码,三个核心功能:
- QueryRunner提供对sql语句操作的API
- ResultSetHandler接口,用于定义select操作后,怎样封装结果集
- DbUtils类,是个工具类,定义了关闭资源与事务处理的方法
QueryRunner核心类
- QueryRunner(DataSource ds),提供数据源(连接池),DBUtils底层自动维护connection
- update(String sql,Object…params),执行更新数据
- query(String sql,ResultSetHandlerrsh,Object…params),执行查询
ResultSetHandler结果集处理类
- BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中
- BeanListHandler:将结果集的每一条记录封装到指定的javaBean中,再将这些javaBean封装到List集合中
- ScalarHandler:用于单数据。例如select count(*) from操作
其他更多参考文档!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DbUtils工具类
- closeQuietly(Connection conn):关闭连接,如有异常try后不抛
- commitAndCloseQuietly(Connection conn):提交并关闭连接
- rollbackAndCloseQuietly(Connection conn):回滚并关闭连接
代码实现增删改查
首先导包,别忘了
package cn.jdbc.test;
import java.sql.SQLException;
import java.util.List;
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.ColumnListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import cn.domain.User;
import cn.jdbc.utils.C3P0Utils;
/*
* 测试DBUtils工具类
*/
public class TestDBUtils {
/*
* 添加
*/
@Test
public void testAdd() {
try {
//1.创建核心类QueryRunner
QueryRunner qRunner=new QueryRunner(C3P0Utils.getDataSource());
//2.写SQL语句
String sql = "insert into table_user values (null,?,?)";
//3.为占位符设置值
Object[] params = {"Tom","IamTom"};
//4.执行添加操作
int rows=qRunner.update(sql, params);
if(rows>0) {
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 更新
*/
@Test
public void testUpdateById() {
try {
//1.创建核心类QueryRunner
QueryRunner qRunner=new QueryRunner(C3P0Utils.getDataSource());
//2.写SQL语句
String sql = "update table_user set user_password = ? where user_id = ?";
//3.为占位符设置值
Object[] params = {"BigTom",2};
//4.执行添加操作
int rows=qRunner.update(sql, params);
if(rows>0) {
System.out.println("更新成功");
}else {
System.out.println("更新失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 删除
*/
@Test
public void testDeleteById() {
try {
//1.创建核心类QueryRunner
QueryRunner qRunner=new QueryRunner(C3P0Utils.getDataSource());
//2.写SQL语句
String sql = "delete from table_user where user_id = ?";
//3.为占位符设置值
Object[] params = {2};
//4.执行添加操作
int rows=qRunner.update(sql, params);
if(rows>0) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 查询所有
*/
@Test
public void testQueryAll() {
try {
//1.获取核心类QueryRunner
QueryRunner qRunner = new QueryRunner(C3P0Utils.getDataSource());
//2.写SQL语句
String sql = "select * from table_user";
//3.执行查询语句
List<User> users = qRunner.query(sql, new BeanListHandler<User>(User.class));
//4.对结果遍历输出
for(User user:users) {
System.out.println(user.toString());
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*
* 根据id查询
*/
@Test
public void testQueryById() {
try {
//1.获取核心类QueryRunner
QueryRunner qRunner = new QueryRunner(C3P0Utils.getDataSource());
//2.写SQL语句
String sql = "select * from table_user where user_id = ?";
//3.为占位符设置值
Object[] params = {3};
//4.执行查询语句
User user = qRunner.query(sql, new BeanHandler<User>(User.class),params);
System.out.println(user.toString());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*
* 查询所有用户总个数
*/
@Test
public void testQueryCount() {
try {
//1.获取核心类QueryRunner
QueryRunner qRunner = new QueryRunner(C3P0Utils.getDataSource());
//2.写SQL语句
String sql = "select count(*) from table_user";
//3.执行查询语句
Long count = (Long)qRunner.query(sql, new ScalarHandler());
System.out.println(count);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*
* 这里用了ColumnListHandler,还有其他的类,用法类似,参考文档即可
*/
@Test
public void testQuery() {
try {
//1.获取核心类QueryRunner
QueryRunner qRunner = new QueryRunner(C3P0Utils.getDataSource());
//2.写SQL语句
String sql = "select * from table_user";
//4.执行查询语句
List<Object> list = qRunner.query(sql, new ColumnListHandler(2));
for(Object object:list) {
System.out.println(object);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}