zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    STM32Cube IDE配置串口发送与接收
    STM32CubeIDE Debug Configurations
    STM32CubeMX FreeRTOS定时器的使用
    单片机处理串口逗号分隔符命令
    自定义任务状态来操作FreeRTOS任务的挂起,恢复,删除
    Halcon WPF C#采集图像区域灰度值
    STM32CubeMX FreeRTOS no definition for "osThreadGetState" 解决办法
    Hyper-V应用
    AutoFixture 数据对象生成器
    visual studio的XAML无法热更新
  • 原文地址:https://www.cnblogs.com/wenjie123/p/4643506.html
Copyright © 2011-2022 走看看