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. java代码实现目录结构

    今天用java代码来实现.像我们电脑盘符那样的目录结构.在代码开始之前首先.介绍一下.用.java代码实现目录的思想. 第一步:完成基础的.大家想.我们是如何获取文件的.是不是用File类,直接就获取 ...

  2. parse arguments in bash

    There are lots of ways to parse arguments in sh. Getopt is good. Here's a simple script that parses ...

  3. 要胀爆的Angular1.0

    尝试从http请求上遏制缓存: http://blog.csdn.net/u010039979/article/details/54376856 if (!$httpProvider.defaults ...

  4. OGEngine教程:字体工具使用

    1.打开 BitmapFont tool,在红框中输入你要显示的字. 2.写完后保存字体文件 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3Jhbmdl ...

  5. 修改Jmeter配置使能支持更大并发

    Jmeter做并发测试时,报错 java.lang.OutOfMemoryError:gc overhead limit exceeded. 原因是jmeter默认分配内存的参数很小,256M吧.故而 ...

  6. lua(注册c库)

    #include <iostream> #include <string.h> extern "C" { #include "lua-5.2.2/ ...

  7. Storm伪分布式搭建

    配置zookeeper 下载zookeeper tar包 解压:tar -zxvf zookeeper-3.4.10.tar.gz -C /root/training/ 配置 cd /root/tra ...

  8. springboot工程的结构

    1 springboot的工程结构是什么 就是我们组织springboot工程时遵循的代码的目录结构. 2 spring initializr创建的工程的目录结构 源码目录:src/main/java ...

  9. nginx搭建服务

    1.当然首先是安装nginx :http://nginx.org/en/download.html 2.一波安装之后 3.在nginx 文件夹打开命令行:cmd 4.开启nginx 服务命令:star ...

  10. Webpack探索【4】--- entry和output详解

    本文主要讲entry和output相关内容.