JDBC操作数据库 封装好的工具类

mysql sqlserver  oracle 数据库的驱动jar包
http://download.csdn.net/download/csdn576038874/8833683
package
cn.hp.svse.jdbc; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * 使用本类的方法,必须提供c3p0-copnfig.xml文件 * @author qdmmy6 */ public class JdbcUtils { // 饿汉式 private static DataSource ds = new ComboPooledDataSource(); /** * 它为null表示没有事务 * 它不为null表示有事务 * 当开启事务时,需要给它赋值 * 当结束事务时,需要给它赋值为null * 并且在开启事务时,让dao的多个方法共享这个Connection */ private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); public static DataSource getDataSource() { return ds; } /** * dao使用本方法来获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException { /* * 如果有事务,返回当前事务的con * 如果没有事务,通过连接池返回新的con */ Connection con = tl.get();//获取当前线程的事务连接 if(con != null) return con; return ds.getConnection(); } /** * 开启事务 * @throws SQLException */ public static void beginTransaction() throws SQLException { Connection con = tl.get();//获取当前线程的事务连接 if(con != null) throw new SQLException("已经开启了事务,不能重复开启!"); con = ds.getConnection();//给con赋值,表示开启了事务 con.setAutoCommit(false);//设置为手动提交 tl.set(con);//把当前事务连接放到tl中 } /** * 提交事务 * @throws SQLException */ public static void commitTransaction() throws SQLException { Connection con = tl.get();//获取当前线程的事务连接 if(con == null) throw new SQLException("没有事务不能提交!"); con.commit();//提交事务 con.close();//关闭连接 con = null;//表示事务结束! tl.remove(); } /** * 回滚事务 * @throws SQLException */ public static void rollbackTransaction() throws SQLException { Connection con = tl.get();//获取当前线程的事务连接 if(con == null) throw new SQLException("没有事务不能回滚!"); con.rollback(); con.close(); con = null; tl.remove(); } /** * 释放Connection * @param con * @throws SQLException */ public static void releaseConnection(Connection connection) throws SQLException { Connection con = tl.get();//获取当前线程的事务连接 if(connection != con) {//如果参数连接,与当前事务连接不同,说明这个连接不是当前事务,可以关闭! if(connection != null &&!connection.isClosed()) {//如果参数连接没有关闭,关闭之! connection.close(); } } } }
package cn.hp.svse.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

public class TxQueryRunner extends QueryRunner {

    //批量操作
    @Override
    public int[] batch(String sql, Object[][] params) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        int[] result = super.batch(con, sql, params);
        JdbcUtils.releaseConnection(con);
        return result;
    }
    //带多个参数的查询
    @Override
    public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
            throws SQLException {
        Connection con = JdbcUtils.getConnection();
        T result = super.query(con, sql, rsh, params);
        JdbcUtils.releaseConnection(con);
        return result;
    }
    //不带参数的查询
    @Override
    public <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        T result = super.query(con, sql, rsh);
        JdbcUtils.releaseConnection(con);
        return result;
    }
    //不带参数的增,删,改的操作
    @Override
    public int update(String sql) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        int result = super.update(con, sql);
        JdbcUtils.releaseConnection(con);
        return result;
    }
    //带一个参数的增,删,改的操作
    @Override
    public int update(String sql, Object param) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        int result = super.update(con, sql, param);
        JdbcUtils.releaseConnection(con);
        return result;
    }
    //带多个参数的增,删,改的操作
    @Override
    public int update(String sql, Object... params) throws SQLException {
        Connection con = JdbcUtils.getConnection();
        int result = super.update(con, sql, params);
        JdbcUtils.releaseConnection(con);
        return result;
    }
}
package com.wenjie;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
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;
import cn.itcast.jdbc.TxQueryRunner;

/**
 * dao层要操作数据库
 * 调用测试代码
 * new一个 QueryRunner qr = new TxQueryRunner();
 * 
 * qr.query(),qr.update()...所有的方法都是不需要获取连接的 因为在TxQueryRunner这个类中 每个方法都写了Connection con = JdbcUtils.getConnection();
 * 获取连接所以调用方法时,无需再获取连接
 * @author 00
 *
 */
public class JdbcTest {
    /**
     * 添加
     * 给stuinfo插入一条数据
     * @throws Exception
     */
    @Test
    public void update1() throws Exception{
        QueryRunner qr = new TxQueryRunner();
        //sql语句
        String sql = "insert into stuinfo(stuname,stuno,stuage,stuaddress,stuemail) values(?,?,?,?,?)";
        //参数
        Object[] params = {"aa","123","22","asdasd","asd@qq.com"};
        qr.update(sql, params);
    }
    
    /**
     * 修改
     * 把stuid=10020的学生的名字改为关凤
     * @throws SQLException
     */
    @Test
    public void update2() throws SQLException{
        String sql = "update stuinfo set stuname=? where stuid=?";
        QueryRunner qr = new TxQueryRunner();
        Object[] params = {"关凤","10020"};
        qr.update(sql, params);
    }
    
    /**
     * 删除
     * 将stuid=10021的学生删除掉
     * @throws SQLException
     */
    @Test
    public void update3() throws SQLException{
        String sql = "delete from stuinfo where stuid=?";
        QueryRunner qr = new TxQueryRunner();
        Object[] params = {"10021"};
        qr.update(sql, params);
    }
    
    /**
     * 查询
     * 根据id查询  一个参数的查询 查询出stuid=10000的学生的信息  这里query的第二个参数要为BeanHandler<User>(User.class)
     * 因为查询出来必是一个对象  最后加上参数param
     * @throws SQLException
     */
    @Test
    public void query1() throws SQLException{
        String sql = "select * from stuinfo where stuid=?";
        QueryRunner qr = new TxQueryRunner();
        Object param = 10000;
        User user = qr.query(sql, new BeanHandler<User>(User.class),param);
        System.out.println(user);
    }
    
    /**
     * 查询所有
     * query的第二个参数要为BeanListHandler<User>(User.class)  查询多月没有参数 
     * @throws SQLException
     */
    @Test
    public void query2() throws SQLException{
        String sql = "select * from stuinfo";
        QueryRunner qr = new TxQueryRunner();
        List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
        for (int i = 0; i < users.size(); i++) {
            System.out.println(users.get(i));
        }
    }
    
    /**
     * 根据id查询  吧查询出来的结果映射成map对象  如果是单表操作的话  MapHandler和BeanHandler没有区别 
     * 但是如果你要操作的表 与其他表有外键关系的话  用BeanHandler那么外键就映射不到为空值
     * 你必须先用MapHandler 然后得到所有的列的数据 然后再转换成实体  这个大家自己试试就知道了
     * @throws SQLException
     */
    @Test
    public void query3() throws SQLException{
        String sql = "select * from stuinfo where stuid=?";
        QueryRunner qr = new TxQueryRunner();
        Object param = 10001;
        Map<String, Object> map = qr.query(sql, new MapHandler(),param);
        System.out.println(map);
    }
    
    @Test
    public void query4() throws SQLException{
        String sql = "select * from stuinfo";
        QueryRunner qr = new TxQueryRunner();
        List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
        for (int i = 0; i < mapList.size(); i++) {
            System.out.println(mapList.get(i));
        }
    }
    
    /**
     * 查询记录数 
     * 用ScalarHandler得到一个对象 转换成Number对象 再用number.intValue()返回int类型的值
     * @throws SQLException
     */
    @Test
    public void query5() throws SQLException{
        String sql = "select count(*) from stuinfo";
        QueryRunner qr = new TxQueryRunner();
        Number number = (Number) qr.query(sql, new ScalarHandler());
        int i = number.intValue();
        System.out.println(i);
    }
    
    /**
     * 批量删除
     * @throws SQLException
     */
    @Test
    public void query6() throws SQLException{
        String sql = "delete from stuinfo where stuid=?";
        Object params[][] = {{"10020"},{"10024"},{"10022"},{"10023"}};
        QueryRunner qr = new TxQueryRunner();
        qr.batch(sql, params);
    }
    
    
    /**
     * 事物操作
     * @throws SQLException
     */
    @Test
    public void query7() throws SQLException{
        try {
            //直接调用写好的jdbcUtils帮助类
            JdbcUtils.beginTransaction();//开启事物
            //修改第一个表的一条数据
                //被事物包含的操作 如果有异常 事物就会回滚  量表的数据都没发生改变
            //修改第二条表的数据
            JdbcUtils.commitTransaction();//两条语句都执行成功后 提交事物
        } catch (SQLException e) {
            try {
                JdbcUtils.rollbackTransaction();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        
        
    }
    
}
//数据库连接的配置文件 必须放在src目录下面  而且名字必须为c3p0-config.xml  以下是以mysql为例 oracle  sqlserver都可以 只要提供相应的驱动jar包即可
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <default-config> 
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">123</property>
        
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>

 

posted @ 2015-07-13 17:47  闻杰  阅读(549)  评论(0编辑  收藏  举报