java jdbc工具类

工具类BaseDao.java(方案一)

package com.accp.jdbc;  

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  

import org.apache.log4j.Logger;  

public class BaseDao {  
    // 使用log4j记录日志  
    private static Logger logger = Logger.getLogger(BaseDao.class);  
    // 连接驱动  
    private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";  
    // 连接路径  
    private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=test";  
    // 用户名  
    private static final String USERNAME = "sa";  
    // 密码  
    private static final String PASSWORD = "sssaaa";  

    //静态代码块  
    static {  
        try {  
            // 加载驱动  
            Class.forName(DRIVER);  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
            logger.error("加载驱动失败", e);  
        }  
    }  

    /* 
     * 获取数据库连接 
     */  
    public Connection getConnection() {  
        Connection conn = null;  
        logger.debug("开始连接数据库");  
        try{  
            //与数据库建立连接  
            conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);  
        }catch(SQLException e){  
            e.printStackTrace();  
            logger.error("数据库连接失败!",e);  
        }  
        logger.debug("数据库连接成功");  
        return conn;  
    }  

    /* 
     * 关闭数据库连接,注意关闭的顺序 
     */  
    public void close(ResultSet rs, PreparedStatement ps, Connection conn) {  
        //注意:最后打开的最先关闭  
        if(rs!=null){  
            try{  
                rs.close();  
                rs=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                logger.error("关闭ResultSet失败",e);  
            }  
        }  
        if(ps!=null){  
            try{  
                ps.close();  
                ps=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                logger.error("关闭PreparedStatement失败",e);  
            }  
        }  
        if(conn!=null){  
            try{  
                conn.close();  
                conn=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                logger.error("关闭Connection失败",e);  
            }  
        }  
    }  

    /* 
     * 查询方法 
     *  
     * sql: 要执行的sql语句 
     * handler:自定义接口 
     * obj:可变参数列表 
     */  
    public <T> T query(String sql,ResultSetHandler<T> handler,Object... obj){  
        Connection conn=getConnection(); //获得连接  
        PreparedStatement ps=null;  
        ResultSet rs=null;  
        try{  
            //创建PreparedStatement对象  
            ps=conn.prepareStatement(sql);  
            //为查询语句设置参数  
            setParameter(ps, obj);  
            //获得ResultSet结果集  
            rs=ps.executeQuery();  
            //返回对象  
            return handler.callback(rs);  
        }catch(SQLException e){  
            e.printStackTrace();  
            logger.error("数据库操作异常",e);  
        }finally{  
            //关闭连接  
            close(rs,ps,conn);  
            logger.debug("释放资源成功");  
        }  
        return null;  
    }  

    /* 
     * 增加、修改、删除,的方法 
     *  
     * obj: 可变参数列表 
     */  
    public int update(String sql,Object...obj ){  
        Connection conn=getConnection(); //获得连接  
        PreparedStatement ps=null;  
        int rows=0;  
        try{  
            //创建PreparedStatement对象  
            ps=conn.prepareStatement(sql);  
            //为查询语句设置参数  
            setParameter(ps, obj);  
            //获得受影响的行数  
            rows=ps.executeUpdate();  
        }catch(SQLException e){  
            e.printStackTrace();  
            logger.error("数据库操作异常",e);  
        }finally{  
            //关闭连接  
            close(null,ps,conn);  
            logger.debug("释放资源成功");  
        }  
        return rows;  
    }  

    /* 
     * 为预编译对象设置参数 
     */  
    public void setParameter(PreparedStatement ps,Object... obj)  
                                throws SQLException {  
        if(obj!=null && obj.length>0){  
            //循环设置参数  
            for (int i = 0; i < obj.length; i++) {  
                ps.setObject(i+1, obj[i]);  
            }  
        }  
    }  
}  

//自定义接口  
interface ResultSetHandler<T>{  
    public T callback(ResultSet rs);  
} 

操作类,进行增删改查 UserDao.java(方案一)

package com.accp.jdbc;  

import java.sql.Connection;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.sql.Statement;  
import java.util.ArrayList;  
import java.util.List;  

import com.accp.entity.User;  

public class UserDao extends BaseDao {  
    public static void main(String[] args) {  
        UserDao user=new UserDao();  
        List<User> list=new ArrayList<User>();  
        //查询id<10的数据  
        list=user.queryUser();  
        //遍历结果集  
        for(User u:list){  
            System.out.println(u);  
        }  

        //查询单条数据  
        System.out.println(user.queryUserById(10));  

        //更新数据  
        User u=new User();  
        u.setId(2);  
        u.setName("张龙");  
        u.setAge(22);  
        System.out.println("更新"+user.updateUser(u)+"条数据");  

        //删除数据  
        System.out.println("删除"+user.deleteUser(15)+"条数据");  

        //插入数据  
        User u1=new User();  
        u1.setName("张三");  
        u1.setAge(18);  
        user.insertUser(u1);  
    }  

    //查询多条信息  
    public List<User> queryUser(){  
        String sql="select * from users where id<10";  
        //匿名实现自定义接口  
        ResultSetHandler<List<User>> handler=new ResultSetHandler<List<User>>(){  
            @Override  
            public List<User> callback(ResultSet rs) {  
                List<User> list=new ArrayList<User>(); //用于存放结果的集合,User类型  
                User user=null;  
                try {  
                    while(rs.next()){  
                        user=new User(); //实例化一个User对象  
                        user.setId(rs.getInt("id"));  
                        user.setAge(rs.getInt("age"));  
                        user.setName(rs.getString("name"));  
                        list.add(user); //添加到list集合  
                    }  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
                return list;  
            }  
        };  
        return query(sql,handler);  
    }  

    //查询单条数据  
    public User queryUserById(int id){  
        String sql="select * from users where id=?";  
        //匿名实现自定义接口  
        ResultSetHandler<User> handler=new ResultSetHandler<User>() {  
            User user=new User();  
            @Override  
            public User callback(ResultSet rs) {  
                try {  
                    while(rs.next()){  
                        user.setAge(rs.getInt("age"));  
                        user.setId(rs.getInt("id"));  
                        user.setName(rs.getString("name"));  
                    }  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
                return user;  
            }  
        };  
        return query(sql,handler,id);  
    }  

    //更新数据  
    public int updateUser(User user){  
        String sql="update users set name=?,age=? where id=?";  
        return update(sql, user.getName(),user.getAge(),user.getId());  
    }  

    //删除数据  
    public int deleteUser(int id){  
        String sql="delete from users where id=?";  
        return update(sql,id);  
    }  

    //插入数据,并返回自动增长的的主键值  
    public void insertUser(User user){  
        Connection conn=getConnection(); //获得连接  
        PreparedStatement ps=null;  
        ResultSet rs=null;  
        String sql="insert into users values(?,?)";  
        try{  
            // 创建能返回自动生成的主键的值的预编译对象  
            ps=conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);  
            ps.setString(1,user.getName());  
            ps.setInt(2, user.getAge());  
            int rows=ps.executeUpdate();  
            // 获得自动增长的的主键值  
            rs=ps.getGeneratedKeys();  
            rs.next();  
            //获得id  
            int id=rs.getInt(1);  
            System.out.println("成功添加:"+rows+"条数据,id是:"+id);  
        }catch(SQLException e){  
            e.printStackTrace();  
        }finally{  
            close(rs,ps,conn);  
        }  
    }  
}  

插入测试数据 InsertTest.java(方案一)

package com.accp.jdbc;  

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

public class InsertTest extends BaseDao  {  
    public static void main(String[] args) {  
        InsertTest user=new InsertTest();  
        user.insertUser();  
    }  

    public void insertUser() {  
        String sql = "insert into users values(?,?)";  
        Connection conn = getConnection();  
        PreparedStatement ps = null;  
        try {  
            // 禁止自动提交事务  
            conn.setAutoCommit(false);  
            // 创建能返回自动生成的主键的值的预编译对象  
            ps = conn.prepareStatement(sql);  
            //开始时间的毫秒数  
            Long start=System.currentTimeMillis();  
            for (int i = 0; i < 10000; i++) {  
                ps.setString(1, i+"");  
                ps.setInt(2, 22);  
                ps.addBatch();// 添加到批处理命令中  
            }  
            ps.executeBatch();// 执行批处理  
            conn.commit();// 提交事务  
            //结束时间的毫秒数  
            Long stop=System.currentTimeMillis();  
            //得到总耗时  
            Long ms=stop-start;   
            System.out.println("插入一万记录耗时:"+ms+"毫秒");  
        } catch (SQLException e) {  
            e.printStackTrace();  
            //取消事务  
            try{  
                conn.rollback();  
            }catch(SQLException ee){  
                ee.printStackTrace();  
            }  
        } finally {  
            //打开自动提交事务  
            try {  
                conn.setAutoCommit(true);  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
            close(null, ps, conn);  
        }  
    }  

}  

工具类BaseDao.java(方案二)

package com.accp.jdbc;  

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.ResultSetMetaData;  
import java.sql.SQLException;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  

import org.apache.log4j.Logger;  

public class BaseDao {  
    // 使用log4j记录日志  
    private static Logger logger = Logger.getLogger(BaseDao.class);  
    // 连接驱动  
    private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";  
    // 连接路径  
    private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=test";  
    // 用户名  
    private static final String USERNAME = "sa";  
    // 密码  
    private static final String PASSWORD = "sa";  

    //静态代码块  
    static {  
        try {  
            // 加载驱动  
            Class.forName(DRIVER);  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
            logger.error("加载驱动失败", e);  
        }  
    }  

    /* 
     * 获取数据库连接 
     */  
    public Connection getConnection() {  
        Connection conn = null;  
        logger.debug("开始连接数据库");  
        try{  
            //与数据库建立连接  
            conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);  
        }catch(SQLException e){  
            e.printStackTrace();  
            logger.error("数据库连接失败!",e);  
        }  
        logger.debug("数据库连接成功");  
        return conn;  
    }  

    /* 
     * 关闭数据库连接,注意关闭的顺序 
     */  
    public void close(ResultSet rs, PreparedStatement ps, Connection conn) {  
        //注意:最后打开的最先关闭  
        if(rs!=null){  
            try{  
                rs.close();  
                rs=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                logger.error("关闭ResultSet失败",e);  
            }  
        }  
        if(ps!=null){  
            try{  
                ps.close();  
                ps=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                logger.error("关闭PreparedStatement失败",e);  
            }  
        }  
        if(conn!=null){  
            try{  
                conn.close();  
                conn=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                logger.error("关闭Connection失败",e);  
            }  
        }  
    }  

    /* 
     * 查询多个对象的方法 
     *  
     * sql: 要执行的sql语句 
     * obj:可变参数列表 
     */  
    public List<Map<String,Object>> queryList(String sql,Object... obj){  
        List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();  
        Connection conn=getConnection(); //获得连接  
        PreparedStatement ps=null;  
        ResultSet rs=null;  
        try{  
            //创建PreparedStatement对象  
            ps=conn.prepareStatement(sql);  
            //为查询语句设置参数  
            setParameter(ps, obj);  
            //获得ResultSet结果集  
            rs=ps.executeQuery();  
            //获得结果集信息  
            ResultSetMetaData rsmd=rs.getMetaData();  
            // 获得列的总数  
            int columnCount=rsmd.getColumnCount();  
            Map<String,Object> row=null;  
            // 遍历结果集,根据信息封装成Map  
            while(rs.next()){  
                row=new HashMap<String, Object>();  
                for(int i=0;i<columnCount;i++){  
                    String columnLabel=rsmd.getColumnLabel(i+1);  
                    row.put(columnLabel, rs.getObject(columnLabel));  
                }  
                data.add(row);  
            }  
        }catch(SQLException e){  
            e.printStackTrace();  
            logger.error("数据库操作异常",e);  
        }finally{  
            //关闭连接  
            close(rs,ps,conn);  
            logger.debug("释放资源成功");  
        }  
        return data;  
    }  

    /* 
     * 查询一个对象的方法 
     *  
     * sql: 要执行的sql语句 
     * obj:可变参数列表 
     */  
    public Map<String,Object> query(String sql,Object... obj){  
        Map<String,Object> data=null;  
        Connection conn=getConnection(); //获得连接  
        PreparedStatement ps=null;  
        ResultSet rs=null;  
        try{  
            //创建PreparedStatement对象  
            ps=conn.prepareStatement(sql);  
            //为查询语句设置参数  
            setParameter(ps, obj);  
            //获得ResultSet结果集  
            rs=ps.executeQuery();  
            //获得结果集信息  
            ResultSetMetaData rsmd=rs.getMetaData();  
            // 获得列的总数  
            int columnCount=rsmd.getColumnCount();  
            // 遍历结果集,根据信息封装成Map  
            while(rs.next()){  
                data=new HashMap<String, Object>();  
                for(int i=0;i<columnCount;i++){  
                    String columnLabel=rsmd.getColumnLabel(i+1);  
                    data.put(columnLabel, rs.getObject(columnLabel));  
                }  
            }  
        }catch(SQLException e){  
            e.printStackTrace();  
            logger.error("数据库操作异常",e);  
        }finally{  
            //关闭连接  
            close(rs,ps,conn);  
            logger.debug("释放资源成功");  
        }  
        return data;  
    }  

    /* 
     * 增加、修改、删除,的方法 
     *  
     * obj: 可变参数列表 
     */  
    public int update(String sql,Object...obj ){  
        Connection conn=getConnection(); //获得连接  
        PreparedStatement ps=null;  
        int rows=0;  
        try{  
            //创建PreparedStatement对象  
            ps=conn.prepareStatement(sql);  
            //为查询语句设置参数  
            setParameter(ps, obj);  
            //获得受影响的行数  
            rows=ps.executeUpdate();  
        }catch(SQLException e){  
            e.printStackTrace();  
            logger.error("数据库操作异常",e);  
        }finally{  
            //关闭连接  
            close(null,ps,conn);  
            logger.debug("释放资源成功");  
        }  
        return rows;  
    }  

    /* 
     * 为预编译对象设置参数 
     */  
    public void setParameter(PreparedStatement ps,Object... obj)  
                                throws SQLException {  
        if(obj!=null && obj.length>0){  
            //循环设置参数  
            for (int i = 0; i < obj.length; i++) {  
                ps.setObject(i+1, obj[i]);  
            }  
        }  
    }  
}  

操作类,进行增删改查 UserDao.java(方案二)

package com.accp.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;

import com.accp.entity.User;

public class UserDao extends BaseDao {
    public static void main(String[] args) {
        UserDao user=new UserDao();
    /*      //查询id<20的数据
        user.queryUser();

        //查询单条数据
        user.queryUserById(10);

        //更新数据
        User u=new User();
        u.setId(2);
        u.setName("张龙");
        u.setAge(22);
        System.out.println("更新"+user.updateUser(u)+"条数据");

        //删除数据
        System.out.println("删除"+user.deleteUser(15)+"条数据");

        //插入数据
        User u1=new User();
        u1.setName("张三");
        u1.setAge(18);
        user.insertUser(u1);  */
    }

    //查询多条信息
    public void queryUser(){
        List<Map<String,Object>> dataUser=queryList("select * from users where id<20");
        //遍历结果集
        for(Map<String,Object> u:dataUser){
            System.out.println(u);
        }
    }

    //查询单条数据
    public void queryUserById(int id){
        System.out.println(query("select * from users where id=?",id));
    }

    //更新数据
    public int updateUser(User user){
        String sql="update users set name=?,age=? where id=?";
        return update(sql, user.getName(),user.getAge(),user.getId());
    }

    //删除数据
    public int deleteUser(int id){
        String sql="delete from users where id=?";
        return update(sql,id);
    }

    //插入数据,并返回自动增长的的主键值
    public void insertUser(User user){
        Connection conn=getConnection(); //获得连接
        PreparedStatement ps=null;
        ResultSet rs=null;
        String sql="insert into users values(?,?)";
        try{
            // 创建能返回自动生成的主键的值的预编译对象
            ps=conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.setString(1,user.getName());
            ps.setInt(2, user.getAge());
            int rows=ps.executeUpdate();
            // 获得自动增长的的主键值
            rs=ps.getGeneratedKeys();
            rs.next();
            //获得id
            int id=rs.getInt(1);
            System.out.println("成功添加:"+rows+"条数据,id是:"+id);
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            close(rs,ps,conn);
        }
    }
}

插入测试数据 InsertTest.java(方案二)

package com.accp.jdbc;

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

public class InsertTest extends BaseDao  {
    public static void main(String[] args) {
        InsertTest user=new InsertTest();
        user.insertUser();
    }

    public void insertUser() {
        String sql = "insert into users values(?,?)";
        Connection conn = getConnection();
        PreparedStatement ps = null;
        try {
            // 禁止自动提交事务
            conn.setAutoCommit(false);
            // 创建能返回自动生成的主键的值的预编译对象
            ps = conn.prepareStatement(sql);
            //开始时间的毫秒数
            Long start=System.currentTimeMillis();
            for (int i = 0; i < 10000; i++) {
                ps.setString(1, i+"");
                ps.setInt(2, 22);
                ps.addBatch();// 添加到批处理命令中
            }
            ps.executeBatch();// 执行批处理
            conn.commit();// 提交事务
            //结束时间的毫秒数
            Long stop=System.currentTimeMillis();
            //得到总耗时
            Long ms=stop-start; 
            System.out.println("插入一万记录耗时:"+ms+"毫秒");
        } catch (SQLException e) {
            e.printStackTrace();
            //取消事务
            try{
                conn.rollback();
            }catch(SQLException ee){
                ee.printStackTrace();
            }
        } finally {
            //打开自动提交事务
            try {
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            close(null, ps, conn);
        }
    }

}

转载自:
http://blog.csdn.net/qy1387/article/details/7947545
http://blog.csdn.net/qy1387/article/details/7954608

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值