jar:

  

先引出database工具类:

 

package cn.itcast.utils;

public class Stu {
private int id;
private String sname;
private int age;
private String gender;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Stu() {
super();
}
public Stu(int id, String sname, int age, String gender) {
super();
this.id = id;
this.sname = sname;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Stu [id=" + id + ", sname=" + sname + ", age=" + age
+ ", gender=" + gender + "]";
} }

Stu

package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JdbcUtils {
/*
* 配置文件的恶魔人配置!要求你必须给出c3p0-config。xnl!
*/
private static ComboPooledDataSource dataSource=new ComboPooledDataSource(); /**
* 使用连接池返回一个连接对象
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
} /**
* 返回连接池对象
* @return
*/
public static DataSource getDataSource(){
return dataSource;
}
}

jdbcUtils

常规操作: 

package cn.itcast.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; import cn.itcast.jdbc.JdbcUtils; public class Demo1 { public int addStu(Stu stu){
Connection con=null;
PreparedStatement pstmt=null;
try {
con=JdbcUtils.getConnection();
String sql="INSERT INTO t_stu VALUES (?,?,?,?)";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1, stu.getId());
pstmt.setString(2, stu.getSname());
pstmt.setInt(3, stu.getAge());
pstmt.setString(4, stu.getGender()); return pstmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
try{
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
}catch(SQLException e){
e.printStackTrace();
}
} }
public int updateStu(Stu stu){
Connection con=null;
PreparedStatement pstmt=null;
try {
con=JdbcUtils.getConnection();
String sql="UPDATE t_stu SET sname = ? , age = ? , gender = ? WHERE id=?";
pstmt=con.prepareStatement(sql);
pstmt.setInt(4, stu.getId());
pstmt.setString(1, stu.getSname());
pstmt.setInt(2, stu.getAge());
pstmt.setString(3, stu.getGender()); return pstmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
try{
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public int deleteStu(int sid){
Connection con=null;
PreparedStatement pstmt=null;
try {
con=JdbcUtils.getConnection();
String sql="DELETE FROM t_stu WHERE id=?";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1, sid);
return pstmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
try{
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
/**
* 我们可以发现增删改具有共性,不同点:
* sql语句
* 参数列表
*/ public Stu load(int id){
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
con=JdbcUtils.getConnection();
String sql="SELECT * FROM t_stu WHERE id=?";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1, id);
rs=pstmt.executeQuery();
Stu stu=new Stu();
if(!rs.next()) return null;
stu.setId(rs.getInt(1));
stu.setSname(rs.getString(2));
stu.setAge(rs.getInt(3));
stu.setGender(rs.getString(4));
return stu;
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
try{
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
/*
* 查询的不同点:
* sql语句
* 参数列表
* 结果类型
* 可以将查询多条数据和单条数据都当成集合处理
*/ @Test
public void fun1(){
// Stu stu=new Stu(1001,"zs",21,"man");
// addStu(stu);
// Stu stu=new Stu(1001,"zs",22,"man");
// updateStu(stu);
// deleteStu(1001);
System.out.println(load(1001));
}
}

增删改查

自定义工具类:

package cn.itcast.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.sql.DataSource; public class QR<T> {
private DataSource dataSource; public QR(DataSource dataSource){
this.dataSource=dataSource;
} public QR(){
super();
} public int update(String sql,Object...params){
Connection conn=null;
PreparedStatement pstmt=null;
try { conn=dataSource.getConnection();
pstmt=conn.prepareStatement(sql);
initParam(pstmt,params); return pstmt.executeUpdate(); } catch (SQLException e) {
throw new RuntimeException(e);
}finally{
try{
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
}catch(SQLException e1){
throw new RuntimeException(e1);
}
}
} public T query(String sql,RsHandler<T> rh,Object...params){
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try { conn=dataSource.getConnection();
pstmt=conn.prepareStatement(sql);
initParam(pstmt,params); rs= pstmt.executeQuery();
return rh.handle(rs); } catch (SQLException e) {
throw new RuntimeException(e);
}finally{
try{
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
}catch(SQLException e1){
throw new RuntimeException(e1);
}
}
} public void initParam(PreparedStatement pstmt,Object...params) throws SQLException{
for(int i=0;i<params.length;i++){
pstmt.setObject(i+1, params[i]);
}
} }
interface RsHandler<T>{
public T handle(ResultSet rs)throws SQLException;
}

模拟dbutils

package cn.itcast.utils;

import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; import cn.itcast.jdbc.JdbcUtils;
@SuppressWarnings({"rawtypes","unchecked"})
public class Demo2 { @Test
public void fun1(){
// Stu s=new Stu(1002,"lisi",23,"woman");
// addStu(s);
Stu s=load(1002);
System.out.println(s); } public void addStu(Stu stu){
QR qr=new QR(JdbcUtils.getDataSource());
String sql="INSERT INTO t_stu VALUES(?,?,?,?)";
Object[] params={stu.getId(),stu.getSname(),stu.getAge(),stu.getGender()};
qr.update(sql, params);
} public Stu load(int sid){
QR qr=new QR(JdbcUtils.getDataSource());
String sql="SELECT * FROM t_stu WHERE id=?";
Object[] params={sid}; RsHandler<Stu> rh=new RsHandler<Stu>(){ @Override
public Stu handle(ResultSet rs) throws SQLException {
if(!rs.next()) return null;
Stu stu=new Stu();
stu.setId(rs.getInt(1));
stu.setSname(rs.getString(1));
stu.setAge(rs.getInt(3));
stu.setGender(rs.getString(4));
return stu;
} };
return (Stu) qr.query(sql, rh, params);
}
}

使用自定义的工具类

dbUtils:

common-dbutils.jar

QueryRunner

update方法:
*int update(String sql,Object...params)-->可执行增、删、改语句
*int update(Connection con,String sql,Object...params),调用者提供Connection,便于事务

query方法
*T query(String sql,ResultSetHandler rsh,Object...params)-->可执行查询
>它会先得到ResultSet,然后调用rsh的handle()把rs转换成需要的;类型
*T query(Connection con,String sql,ResultSetHandler rsh,Object...params)

ResultSetHandler接口:
*BeanHandler(单行)-->构造器需要一个Class类型的参数,用来将一行结果转换成指定类型的javaBean对象
*BeanListHandler(多行)-->构造器也是需要一个Class类型的参数,用来将一行结果转换成一个javaBean,多行就是转换成list对象,一堆javaBean
*MapHandler(单行)-->将一行结果转换为Map对象
>一行记录:
sid sname age gender
1001 zs 99 male
>一个Map:
{sid:1001,sname:zs,age:99,gender:male}
*MapListHandler(多行)-->把一列记录转换成一个Map,多列记录转换成一个Map为子元素的List集合
*ScalarHandler(单列多行)-->通常用于select count(*) from t_stu语句,结果集是单行单列的,它的类型是Object

例子:

package cn.itcast.utils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test; import cn.itcast.jdbc.JdbcUtils; public class Demo3 {
@Test
public void fun1() throws SQLException{
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
String sql="INSERT INTO t_stu VALUES (?,?,?,?)";
Object[] params={1003,"wangwu",23,"woman"}; qr.update(sql,params);
} @Test
public void fun2() throws SQLException{
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
String sql="SELECT * FROM t_stu WHERE id=?";
Object[] params={1003}; ResultSetHandler<Stu> rsh=new ResultSetHandler<Stu>(){ @Override
public Stu handle(ResultSet rs) throws SQLException {
if(!rs.next()) return null;
Stu stu=new Stu();
stu.setId(rs.getInt(1));
stu.setSname(rs.getString(2));
stu.setAge(rs.getInt(3));
stu.setGender(rs.getString(4));
return stu;
} };
/*
*执行query()方法,需要给出结果集处理器,即ResultSetHandler的实现类 对象,完成ResultSet到指定类型的转换
*/
Stu stu=qr.query(sql, rsh,params);
System.out.println(stu);
} /**
* BeanHandler 单行
* Bean有关的需要注意内部可能是使用BeanUtils或者内省实现,需要每一个成员字段都有对应的属性
* @throws SQLException
*/
@Test
public void fun3() throws SQLException{
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
String sql="SELECT * FROM t_stu WHERE id=?";
Object[] params={1003};
ResultSetHandler<Stu> rsh=new BeanHandler<Stu>(Stu.class);
Stu stu=qr.query(sql,rsh ,params);
System.out.println(stu);
}
/**
* BeanListHandler 多行
* @throws SQLException
*/
@Test
public void fun4() throws SQLException{
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
String sql="SELECT * FROM t_stu";
ResultSetHandler<List<Stu>> rsh=new BeanListHandler<Stu>(Stu.class);
List<Stu> stus=qr.query(sql,rsh);
System.out.println(stus);
}
/**
* MapHandler 单行
* @throws SQLException
*/
@Test
public void fun5() throws SQLException{
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
String sql="SELECT * FROM t_stu WHERE id=?";
Object[] params={1003};
ResultSetHandler<Map<String, Object>> rsh=new MapHandler();
Map<String, Object> stu=qr.query(sql,rsh ,params);
System.out.println(stu);
} /**
* MapListHandler 多行
* @throws SQLException
*/
@Test
public void fun6() throws SQLException{
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
String sql="SELECT * FROM t_stu";
ResultSetHandler<List<Map<String, Object>>> rsh=new MapListHandler();
List<Map<String, Object>> stus=qr.query(sql,rsh);
System.out.println(stus);
}
/**
* ScalarHandler 单行单列
* @throws SQLException
*/
@Test
public void fun7() throws SQLException{
QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource());
String sql="SELECT COUNT(*) FROM t_stu";
ResultSetHandler<Object> rsh=new ScalarHandler();
long count=(Long) qr.query(sql,rsh );
System.out.println(count);
}
}

使用common-dbutils进行dao操作的更多相关文章

  1. Apache Common DbUtils

    前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看.大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的 例如大家常用 ...

  2. Dao操作的抽取,BaseDao

    Dao操作通用的步骤: 0. 写SQL语句 1. 获取连接 2. 创建stmt 3. 执行sql a) 更新 b) 查询 4. 关闭/异常 代码: BaseDao /** * 通用的dao,自己写的所 ...

  3. Java通过代理类实现数据库DAO操作

    下面的所有代码示例都取自李兴华的<Java Web开发实战经典>的随书源码,因为觉得设计得很好,所以将代码摘录下来作成笔记. 首先,我们在一个java文件中定义要存储的结构类型: impo ...

  4. 中阶 d03.5 (正篇)完整的Dao 操作数据库

    1.目录结构: util---JDBCUtil.java(工具包,整合建立链接和释放资源的方法) dao---UserDao.java(接口,定义方法) impl---UserDaoImpl.java ...

  5. Java 使用 Dbutils 工具类库 操作mysql

    Dbutils 官网http://commons.apache.org/proper/commons-dbutils/ 结合我个人写的JDBCUtils 写的 Dbutils 的使用demo . JD ...

  6. yii DAO操作总结

    数据库代码: /* Navicat MySQL Data Transfer Source Server         : lonxom Source Server Version : 50524 S ...

  7. Dao操作的抽取

    package com.loaderman.demo.c_jdbc; public class Admin { private int id; private String userName; pri ...

  8. hibernate的dao操作不能提交到数据库问题的解决

    刚学的时候总是各种错误,解决方法也无厘头的很 将UserDAO里面的的save方法修改try { getSession().save(transientInstance); log.debug(&qu ...

  9. 元数据和DbUtils

    使用元数据可以在jdbc中获取数据库的定义,例如:数据库.表.列的定义信息. 在jdbc中可以使用: 数据库元数据.参数元数据.结果集元数据. 1.DataBaseMetaData对象 Connect ...

随机推荐

  1. 排序算法 python

    1.先写个原始数组和测试算法是否正确,输出多次,方便计算算法运算的平均值 2.开始第一个最简单的冒泡排序 3.“”选择排序“”,跟冒泡很像,每次选最大/最小,放进新list中. 3.1发现测试test ...

  2. 【入门】创建express项目

    1.创建项目(图解) 2.访问http://localhost:3000/就看到熟悉的页面了 3.查看项目目录     参考文档:http://jingyan.baidu.com/article/92 ...

  3. 怎样去掉a标签的蓝框

    直接上代码 *{-webkit-tap-highlight-color:rgba(255,0,0,0);} 我是直接给每一个都加了这个属性   其实没有必要 因为 只有a 标签 input 标签 和t ...

  4. Android异步处理三:Handler+Looper+MessageQueue深入详解

    在<Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面>中,我们讲到使用Thread+Handler的方式来实现界面的更新,其实是在非UI线程发送消息到U ...

  5. HTTP/HLS/RTMP超级负载测试工具(转)

    这个负载测试工具是网游分享的工具,可以在http://blog.csdn.net/win_lin/article/details/11835011 或者https://github.com/winli ...

  6. iOS ARC也会有内存泄露

    本文转载至 http://blog.csdn.net/allison162004/article/details/38753219  iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用A ...

  7. Future Promise 模式(netty源码9)

    netty源码死磕9  Future Promise 模式详解 1. Future/Promise 模式 1.1. ChannelFuture的由来 由于Netty中的Handler 处理都是异步IO ...

  8. host更新

    http://alsohosts.herokuapp.com/ google镜像站https://goge.ml/

  9. SMARTFORMS 字段格式化设置

    [转自http://lz357502668.blog.163.com/blog/static/16496743201273153434564/] 在SMARTFORM 输出的时候有时候会遇到数字类型无 ...

  10. Bootstrap学习2--组件-列表组

    备注:最新Bootstrap手册:http://www.jqhtml.com/bootstraps-syntaxhigh/index.html 1.列表组 列表组是Bootstrap框架新增的一个组件 ...