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. hihoCoder #1388 : Periodic Signal

    NTT (long long 版) #include <algorithm> #include <cstring> #include <string.h> #inc ...

  2. pycharm中不能安装bs4的解决方案

    首先:什么Beautiful Soup? Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.B ...

  3. python函数-------python2.7教程学习【廖雪峰版】(三)

    任务: 看完函数这一章    已完成 2017年6月8日16:23:491.函数的作用:写较少的代码实现较多的功能,可以多次被调用.2.可见,借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的 ...

  4. J - Max Sum

    J - Max Sum Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  5. android中handler和bundle有什么区别和联系 都是用来传递消息吗都是信息的载体吗

    1.handler是消息处理者,通常重写Handler的handleMessage()方法,在方法中处理接收到的不同消息,例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Ha ...

  6. Linux安装过程记录信息

    全新的linux安装完成后,会在root目录下有一下三个文件,记录了Linux的安装细节 anaconda-ks.cfg 以Kickstart配置文件的格式记录安装过程中设置的选项信息 install ...

  7. 拉普拉斯分布(Laplace distribution)

    拉普拉斯分布的定义与基本性质 其分布函数为 分布函数图 其概率密度函数为 密度函数图 拉普拉斯分布与正太分布的比较 从图中可以直观的发现拉普拉斯分布跟正太分布很相似,但是拉普拉斯分布比正太分布有尖的峰 ...

  8. VOFM 例程

    SAP ERP 实施中,经常会用到例程开发(TCODE:VOFM).这个开发目前我用到的是影响SD和MM的定价过程.创建例程需要ACCESS KEY,这个可以通过申请得到,创建后例程会被包含在一个RE ...

  9. R语言图形base系统(一)

           一般R作图有三大绘图系统:base系统.ggplot2绘图系统.lattice绘图系统.        本篇主要介绍base系统绘图时的图形参数.一般用plot()函数来完成.在R中,若 ...

  10. 导入android sdk samples工程报错"did you mean to use @+id instead of @+android:id?"

    导入“D:\adt-bundle-windows-x86_64-20140702\sdk\samples\android-15”中的工程报错 did you mean to use @+id inst ...