首页 > 代码库 > 2.JDBC-02

2.JDBC-02

常见的配置文件格式:
  1.properties
    里面内容的格式 key=value
  2.xml

若我们的配置文件为properties,并且放在src目录下.

名字存为jdbc.properties

1 driverClass = com.mysql.jdbc.Driver
2 url = jdbc:mysql://localhost:3306/day02
3 user = root
4 password = 123456

我们可以通过 ResourceBundle工具快速获取里面的配置信息
  使用步骤:
    1.获取ResourceBundle 对象:
      static ResourceBundle getBundle("文件名称不带后缀名")
    2.通过ResourceBundle 对象获取配置信息
      String getString(String key) :通过执行key获取指定的value

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

public class JdbcUtils01 {
    static final String DRIVERCLASS;
    static final String URL;
    static final String USER;
    static final String PASSWORD;
    
    static{              //静态代码块
        //获取ResourceBundle    ctrl+2 松手按L
        //块编辑 alt+shift+a
        //变大写ctrl+shift+x
        //变小写ctrl+shift+y
        //向下复制一行alt+ctrl+下箭头
        //向上复制一行alt+ctrl+上箭头
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        
        //获取指定内容
        DRIVERCLASS = bundle.getString("driverClass");
        URL = bundle.getString("url");
        USER = bundle.getString("user");
        PASSWORD = bundle.getString("password");
    }
    
    static{
        //注册驱动
        try {
            Class.forName(DRIVERCLASS);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }

    /**
     * 释放资源
     * @param conn 链接
     * @param st 语句执行者
     * @param rs 结果集
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        closeResultSet(rs);
        closeStatement(st);
        closeConn(conn);
    }
    /**
     * 释放链接
     * @param conn 链接
     */
    public static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
    /**
     * 释放语句执行者
     * @param st 语句执行者
     */
    public static void closeStatement(Statement st) {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            st = null;
        }    
    }
    /**
     * 释放结果集
     * @param rs 结果集
     */
    public static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
    }
    
}
 1 //更新操作
 2     //@Test
 3     public void f4(){
 4         Connection conn = null;
 5         ResultSet rs = null;
 6         PreparedStatement st = null;
 7         
 8         try {
 9             conn = JdbcUtils01.getConnection();
10             String sql = "update category set cname = ? where cid = ?";
11             st = conn.prepareStatement(sql);
12             st.setString(1, "手机");
13             st.setString(2, "c006");
14             
15             int i = st.executeUpdate();
16             
17             if(i==1){
18                 System.out.println("success");
19             }else{
20                 System.out.println("fail");
21             }
22             
23         } catch (SQLException e) {
24             e.printStackTrace();
25         }finally{
26             //释放资源
27             JdbcUtils01.closeResource(conn, st, rs);
28         }    
29     }
30     
31     //删除操作
32     @Test
33     public void f5(){
34         Connection conn = null;
35         ResultSet rs = null;
36         PreparedStatement st = null;
37         
38         try {
39             conn = JdbcUtils01.getConnection();
40             String sql = "delete from category where cid = ?";
41             st = conn.prepareStatement(sql);
42             st.setString(1, "c006");
43             
44             int i = st.executeUpdate();
45             if(i==1){
46                 System.out.println("success");
47             }else{
48                 System.out.println("fail");
49             }
50         } catch (SQLException e) {
51             e.printStackTrace();
52         }finally{
53             JdbcUtils01.closeResource(conn, st, rs);
54         }
55     }

 


案例2-通过连接池(数据源)优化我们的操作.
需求:
  使用jdbc的时候,每操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作.
连接池概述:
  管理数据库的连接,
作用:
  提高项目的性能.
  就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.
  所有的连接池必须实现一个接口 javax.sql.DataSource接口

获取连接方法:
  Connection getConnection()
  归还连接的方法就是以前的释放资源的方法.调用connection.close();
  自定义一个连接池(理解思想)

常用连接池:
  DBCP
  C3P0
///////////////////
增前方法
  1.继承
  2.装饰者模式(静态代理)
  3.动态代理
//////////////
装饰者模式:★★★
  使用步骤:
    1.装饰者和被装饰者实现同一个接口或者继承同一个类
    2.装饰者中要有被装饰者的引用
    3.对需要增强的方法进行加强
    4.对不需要加强的方法调用原来方法
////////////////////////////////////
常用的连接池:
  DBCP:(理解)
    apache组织
    使用步骤:
      1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
      2.使用api
        a.硬编码   

1                //创建连接池
2       BasicDataSource ds = new BasicDataSource();
3 
4       //配置信息
5       ds.setDriverClassName("com.mysql.jdbc.Driver");
6       ds.setUrl("jdbc:mysql:///day07");
7       ds.setUsername("root");
8       ds.setPassword("1234");                        

  b.配置文件
    实现编写一个properties文件

1 //存放配置文件
2 Properties prop = new Properties();
3 prop.load(new FileInputStream("src/dbcp.properties"));
4 //设置
5 //prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
6 //创建连接池
7 DataSource ds = new BasicDataSourceFactory().createDataSource(prop);

 


C3P0:(★)
  hibernate和spring使用
  有自动回收空闲连接的功能.
    使用步骤:
      1.导入jar包(c3p0-0.9.1.2.jar)
      2.使用api
        a.硬编码(不推荐)
          new ComboPooledDataSource()
        b.配置文件
          配置文件的名称:c3p0.properties 或者 c3p0-config.xml
          配置文件的路径:src下

编码只需要一句话
new ComboPooledDataSource()//使用默认的配置
new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默认的配置

////////////////////////////
案例3-使用dbutils完成curd操作
技术分析:
dbutils
dbutils:
是apache组织的一个工具类,jdbc的框架,更方便我们使用
使用步骤:
1.导入jar包(commons-dbutils-1.4.jar)
2.创建一个queryrunner类
queryrunner作用:操作sql语句
构造方法:
new QueryRunner(Datasource ds);
3.编写sql
4.执行sql
query(..):执行r操作
update(...):执行cud操作
////////////////////////////
核心类或接口
QueryRunner:类名
作用:操作sql语句
构造器:
new QueryRunner(Datasource ds);
注意:
底层帮我们创建连接,创建语句执行者 ,释放资源.
常用方法:
query(..):
update(..):

DbUtils:释放资源,控制事务 类
closeQuietly(conn):内部处理了异常
commitAndClose(Connection conn):提交事务并释放连接
....

ResultSetHandler:封装结果集 接口

ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler

(了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回
(了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
(了解)ColumnListHandler, 将查询结果的指定一列放入list中返回
(了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值

2.JDBC-02