前言:使用C3P0连接池连接MySql
1.导入相应的JARs
MySQL驱动jar包:mysql-connector-Java-5.1.28-bin.jar
C3P0需要的jar包:c3p0-0.9.2-pre1.jar和mchange-commons-0.2.jar
2.在src下添加C3P0配置文件:c3p0-config.xml
3.封装为JdbcUtils,用来获取Connection对象,以及开启和关闭事务。有以下接口:
Connection getConnection():从c3p0连接池获取Connection对象,所以需要提供c3p0-config.xml配置文件;
beginTransaction():为当前线程开启事务;
commitTransaction():提交当前线程的事务;
rollbackTransaction():回滚当前线程的事务;
releaseConnection(Connection):如果参数连接对象不是当前事务的连接对象,那么关闭它,否则什么都不做;
4.测试JdbcUtils
5.封装TxQueryRunner,使用JdbcUtils连接数据库,使用QueryRunner简化数据库操作
引入jar包:commons-dbutils-1.4.jar,有以下接口:
int[] batch(String sql, Object[][] params):执行批处理,参数sql是SQL语句模板,params为参数;
T query(String sql, ResultSetHandler
T query(String sql, ResultSetHandler
int update(String sql):执行增、删、改语句,参数sql是要执行的SQL语句;
int update(Stringsql, Object param):执行增、删、改语句,参数sql是要执行的SQL语句,参数param是参数(一个参数);
正文:JAVA中DBUtils的QueryRunner类实现增删改查详解
一.QueryRunner类实现增删改
public static void main(String[] args) throws Exception{ //使用自己的工具类,获取数据库的连接对象
Connection conn = MyJDBCUtils.getConnection(); //创建QueryRunner类对象
QueryRunner qr = new QueryRunner();
String sql = "UPDATE gjp_ledger set money=? , ldesc=? where lid=?";
Object[] params = {998,"买钻石",3};
int result = qr.update(conn, sql, params);
System.out.println(result); DbUtils.close(conn);
}
二.QueryRunner类获取查询结果集ResultSetHandler
1.常用Handler * ArrayHandler 将结果集第一行转成对象数组
public static void main(String[] args) throws Exception{
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger where lid=?"; //结果集处理方式,ArrayHandler 第一行转成对象数组
QueryRunner qr = new QueryRunner();
Object[] objects = qr.query(conn, sql, new ArrayHandler(),3);
for(Object obj : objects){
System.out.println(obj);
}
}
* ArrayListHandler 将结果集中的每一行数据都转成一个对象数组,再将转成的多个对象数组存放到List中
public static void main(String[] args) throws Exception{
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger";
QueryRunner qr = new QueryRunner();
//执行query方法,传递连接对象,SQL语句,结果集处理方式ArrayListHandler
List
for(Object[] objects : list)
{ for(Object obj : objects){
System.out.print(obj+" ");
}
System.out.println();
}
}
* BeanHandler 将结果集第一行数据封装到一个对应的业务类实例中 (1): 定义业务数据类Ledger(实体类,javaBean)
public class Ledger {
//要生成空参、有参构造、set和get方法、toString方法
private int lid;
private String parent;
private double money;
private int sid;
private String account;
private String createtime;
private String ldesc;
}
(2)测试案例代码
public static void main(String[] args) throws Exception{
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger";
QueryRunner qr = new QueryRunner();
//BeanHandler泛型 ,构造方法(和反射有关系的对象)
Ledger legder = qr.query(conn, sql, new BeanHandler
System.out.println(legder);
}
* BeanListHandler 将结果集中的每一行数据都封装到一个对应的业务类实例中,再将多个业务类实例对象存放到List里。
public static void main(String[] args) throws Exception {
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger";
//结果集处理方式,BeanListHandler 每一行数据封装到业务数据类中
QueryRunner qr = new QueryRunner();
List
for(Ledger ledger : list)
{
System.out.println(ledger);
}
}
* MapHandler 将结果集中的第一行数据封装到一个Map中,key是列名,value是对应的值。
public static void main(String[] args) throws Exception {
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger";
//结果集处理方式,MapHandler 封装到一个Map集合中,存储键值对集合
QueryRunner qr = new QueryRunner();
Map
for(String key : map.keySet()){
System.out.println(key+" "+map.get(key));
}
}
* MapListHandler 将结果集中的每一行数据都封装到一个Map里,然后再将多个Map存放到List
public static void main(String[] args) throws Exception{
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger";
//结果集处理方式,MapListHandler 数据中的每一行封装成Map集合,多个Map集合存储到List集合
QueryRunner qr = new QueryRunner();
List
for(Map
for(String key : map.keySet()){
System.out.print(key+" "+map.get(key));
}
System.out.println();
}
}
* ColumnListHandler 将结果集中某一列的数据存放到List中
public static void main(String[] args)throws Exception {
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger";
//结果集处理方式,ColumnListHandler 数据中一个列,数据存储到List集合
QueryRunner qr = new QueryRunner(); //ColumnListHandler构造方法中,写字符串列名
List
for(Double money : list){ System.out.println(money);
}
}
* ScalarHandler 进行单值查询,如:select count(*) from
public static void main(String[] args) throws Exception{
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT count(*)as count FROM gjp_ledger"; //结果集处理方式,ScalarHandler 满足只有1列,1个数据
QueryRunner qr = new QueryRunner(); //ColumnListHandler构造方法中,写字符串列名
Long i = qr.query(conn, sql, new ScalarHandler
System.out.println(i);
}
* KeyedHandler将结果集中的每一行数据都封装为一个Map(List
Connection conn = MyJDBCUtils.getConnection();
String sql = "SELECT * FROM gjp_ledger"; //结果集处理方式,KeyedHandler
QueryRunner qr = new QueryRunner();
Map
System.out.println(map);
}