Jdbc基础 工具类 连接池到dbutils

来源:互联网 发布:ff14 npc捏脸数据库 编辑:程序博客网 时间:2024/06/07 04:54

jdbc最基础的就是使用statement 一共有几步
1注册驱动
2.获得连接
3.获得语句执行者平台
4.执行sql语句
5处理结果
6释放资源
当然 得先导包

public class ejdbc {     public static final String url = "jdbc:mysql://localhost:3306/chartroom";       public static final String name = "com.mysql.jdbc.Driver";       public static final String user = "root";       public static final String password = "admin";       public static void main(String[] args) {     String  sql ="select * from user";    try {        //获取驱动        Class.forName(name);        //获得连接         Connection  conn=DriverManager.getConnection(url,user,password);       //获取语句执行者         Statement   pst =conn.createStatement();        ResultSet rs = pst.executeQuery(sql);        while(rs.next()){            System.out.println(rs.getString("username")+"   "+rs.getInt("password"));        }    } catch (Exception e) {        e.printStackTrace();    }}}

二 因为有sql注入攻击的问题 而且statement使用起来比较麻烦 ,为了使用sql语句占位符 所以把statement舍弃了 使用preperstatement

public class papresta {     public static final String url = "jdbc:mysql://localhost:3306/chartroom";       public static final String name = "com.mysql.jdbc.Driver";       public static final String user = "root";       public static final String password = "admin";        public static void main(String[] args) {          String  sql ="select * from user where username=?";        try {            Class.forName(name);            Connection conn =DriverManager.getConnection(url, user, password);            PreparedStatement psd = conn.prepareStatement(sql);            psd.setString(1, "aaa");            ResultSet rs = psd.executeQuery();            while(rs.next()){                System.out.println(rs.getString("username")+"   "+rs.getInt("password"));            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

三 后来因为每次使用都得注册驱动 获得连接 还有释放资源 很麻烦 所以把这些抽取出来做成一个工具类 以后使用的时候就可以直接调用方法获得连接 释放资源

public class Jdbcutils_v1 {    static Connection conn =null;/** * 获取连接 *   */    public static Connection getConnection() {        try {            Class.forName("com.mysql.jdbc.Driver");            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/chartroom","root", "admin");        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return conn;    }    public static void  release(Connection conn,PreparedStatement pst,ResultSet rs){        if(rs!=null){            try {                rs.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if(pst!=null){            try {                pst.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if(conn!=null){            try {                conn.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

使用起来是这个样子

    public void testusername(){        try{               String sql ="select * from user where username=?";              conn =Jdbcutils_v1.getConnection();              pst =  conn.prepareStatement(sql);              pst.setString(1, "aaa");             rs =pst.executeQuery();            while(rs.next()){                    System.out.println(rs.getString("username")+"   "+rs.getInt("password"));                }            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }finally{                Jdbcutils_v1.release(conn, pst, rs);            }    }    }

再后来感觉每次换数据库什么的得修改代码 为了不修改代码 所以把这些url什么的抽取出来 到一个文件中 用代码去获取这些文件 每次换数据库就可以直接修改这个文件就行了就不用再修改代码了 所以把

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/chartroom?useUnicode=true&characterEncoding=utf8username=rootpassword=admin

放到jdbc.peoperties文件中 获取方法有两个
第一个使用ResourceBundle bundle = ResourceBundle.getBundle(“Jdbc”);获取
工具类代码是

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ResourceBundle;public class Jdbcutils_v2 {    private static String driver;    private static String url;    private static String username;    private static String password;    static{        ResourceBundle bundle = ResourceBundle.getBundle("Jdbc");        driver = bundle.getString("driver");        url = bundle.getString("url");        username = bundle.getString("username");        password = bundle.getString("password");    }    static Connection conn =null;    /**     * 获取连接     *       */        public static Connection getConnection() {            try {                Class.forName(driver);                conn=DriverManager.getConnection(url,username, password);            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            return conn;        }        public static void  release(Connection conn,PreparedStatement pst,ResultSet rs){            if(rs!=null){                try {                    rs.close();                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }            if(pst!=null){                try {                    pst.close();                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }            if(conn!=null){                try {                    conn.close();                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }}

测试

public void testadd(){        try{               String sql ="insert into user values(5,?,?,null)";              conn =Jdbcutils_v2.getConnection();              pst =  conn.prepareStatement(sql);            pst.setString(1, "你好");            pst.setInt(2, 123);        int  rows     =pst.executeUpdate();        if(rows>0){            System.out.println("成功");        }else{            System.out.println("shibai");        }            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }finally{                Jdbcutils_v1.release(conn, pst, rs);            }    }

还有一种获取方法是通过类加载器获得

public class Jdbcutils_v3 {    private static String driver;    private static String url;    private static String username;    private static String password;    static{        try {            //通过当前类获取类加载器            ClassLoader classloader=Jdbcutils_v3.class.getClassLoader();            //通过类加载器获得输入流            InputStream is =classloader.getResourceAsStream("Jdbc.properties");            //创建一个properties对象            Properties pro = new Properties();            //加载输入流            pro.load(is);            //获取相关参数值            driver =pro.getProperty("driver");            url = pro.getProperty("url");            username = pro.getProperty("username");            password = pro.getProperty("password");        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    static Connection conn =null;    /**     * 获取连接     *       */        public static Connection getConnection() {            try {                Class.forName(driver);                conn=DriverManager.getConnection(url,username, password);            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            return conn;        }        public static void  release(Connection conn,PreparedStatement pst,ResultSet rs){            if(rs!=null){                try {                    rs.close();                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }            if(pst!=null){                try {                    pst.close();                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }            if(conn!=null){                try {                    conn.close();                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }}

测试

    public void dele(){        try{               conn =Jdbcutils_v3.getConnection();              String sql ="delete  from user where id=?";              pst =  conn.prepareStatement(sql);            pst.setInt(1, 6);        int  rows     =pst.executeUpdate();        if(rows>0){            System.out.println("成功");        }else{            System.out.println("shibai");        }            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }finally{                Jdbcutils_v3.release(conn, pst, null);            }    }

四 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序.
在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池.
c3p0导包 然后设置设置配置文件这个网上一大堆 就不写了

public class ctest {    @Test  public  void adduser(){      Connection conn=null;      PreparedStatement pst=null;      ComboPooledDataSource DataSource = new ComboPooledDataSource();      try {        conn=DataSource.getConnection();        String sql ="insert into user values(6,?,?,null)";        conn =Jdbcutils_v2.getConnection();        pst =  conn.prepareStatement(sql);        pst.setString(1, "你好");        pst.setInt(2, 123);        int  rows     =pst.executeUpdate();    if(rows>0){        System.out.println("成功");    }else{        System.out.println("shibai");    }    } catch (SQLException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }finally{        Jdbcutils_v3.release(conn, pst, null);    }  }}

这里的释放不是以前的关闭了 c3p0使用装饰者模式重写了connection中的获取连接 这里改变了

五 DButils
我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
1.MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
2.MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;

3.BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
4.BeanListHandler:多行处理器!把结果集转换成List;
5.ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
6.ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。

public class dbutils {  public void adduser(){      try {          //创建核心类QueryRunner          QueryRunner qr = new QueryRunner(C3p0utils.getDataSourse());          String  sql = "insert into user values(1,?,?,?)";          Object[] params ={"abc","123","admin"};          //执行查询操作        int rows=qr.update(sql, params);        if(rows>0){            System.out.println("成功");        }else{            System.out.println("失败");        }    } catch (SQLException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }  }    @Test      public void selectuser(){            try {                 //创建核心类QueryRunner                  QueryRunner qr = new QueryRunner(C3p0utils.getDataSourse());                  String  sql = "select * from user ";                  //执行查询操作                List<User> users=qr.query(sql, new BeanListHandler<User>(User.class));                for(User user:users){                    System.out.println(user.toString());                }            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }    }}