Jdbc基础 工具类 连接池到dbutils

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.Driver
url=jdbc:mysql://localhost:3306/chartroom?useUnicode=true&characterEncoding=utf8
username=root
password=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();
            }

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值