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. 百度地图API简介

    百度地图API简介 在此申明不是我写的,用的是别人的,仅限自己学习 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能 ...

  2. Unity 插件收集(持续更新)

    MGS Machinery Unity绑定机械关节,铰链,机构插件包.    MGS Mechanical Drive 用于绑定场景中的机械驱动器的Unity插件   Unity Wave Propa ...

  3. USB-HID鼠标、键盘通讯格式(转) 与本人实际测试结果

    内容为网络转载,如有版权问题请联系删除 USB鼠标键盘协议介绍. 鼠标发送给PC的数据每次4个字节:BYTE1 BYTE2 BYTE3 BYTE4.定义分别是:BYTE1 -- |--bit7:    ...

  4. 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树

    [BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...

  5. GCD(st表+二分)

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  6. PHP计算多少秒/分/时/天/周/月/年之前 : timeago

    function timeago( $ptime ) { $etime = time() - $ptime; if ($etime < 59) return '刚刚'; $interval = ...

  7. PostMan的使用注意事项

    1json格式要设置头尾application/json 2body中raw的{"userName":"123","passWord":&q ...

  8. 移动端web常见问题解决方案

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对i ...

  9. VS2013 Pro版本密钥

    Visual Studio Professional 2013 KEY(密钥): XDM3T-W3T3V-MGJWK-8BFVD-GVPKY

  10. Advanced GET 9.1 修正汉化版(免注册、页面加载、保存都正常)

    http://www.55188.com/viewthread.php?tid=2846679 Advanced GET 9.1 修正汉化版(免注册.页面加载.保存都正常) 网上流传的很多GET9.1 ...