JDBC高级入门____

一 数据库连接池的概念

在前面了解了使用JDBC快速实现不同的数据库的连接,
但是在多用户访问的情况不停的创建连接和释放资源,严重影响程序性能和使用体验。
数据库连接池
数据库连接池负责分配管理释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。这项技术能明显提高对数据库操作的性能。
数据库连接是一种关键的、有限的、昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的性能指标,数据库连接池正是针对这个问题提出来。

二 开源数据库连接池

C3P0数据库
1.C3P0数据库连接池使用步骤

1. 导入 jar 包。(MySQL驱动包+c3p0两个jar包)
2. 导入配置文件到 src 目录下。//配置文件需要调整ip地址和端口等
3. 创建 C3P0 连接池对象。CombopoolDateSource
4. 获取数据库连接进行使用。   
  注意:C3P0 的配置文件会自动加载,但是必须叫 c3p0-config.xml 或 c3p0-config.properties 

2.测试

//1.创建C3P0的数据库连接池对象
DataSource dataSource = new CombopoolDataSource();
//2.通过连接池对象获取数据库连接
Connection con = dataSource.getConnection();
//3.执行操作
String sql = "sql语句";
PrepareStatement pst = con.prepareStatement(sql);
//4.执行sql语句 接受结果集
ResultSet rs = pst.executeQuery();
//5.处理结果集 遍历循环或者判断
// if(判断条件){处理语句体}
while(rs.next()){
处理语句体;}
//6.释放资源 可以使用工具类简化
 		rs.close();
        pst.close();
        con.close();

Druid数据库
使用步骤

/*   先导包 
    1.通过Properties集合,加载配置文件
    2.通过Druid连接池工厂类获取数据库连接池对象
    3.通过连接池对象获取数据库连接进行使用
*/
// 获取配置文件的输入流
InputStream is = 类名.class.getClassLoader().getResourceAsStream("druid.properties");
//1.1.通过Properties集合,加载配置文件
Properties prop = new Properties();
prop.load();

//2.通过Druid连接池工厂类获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

//3.通过连接池对象获取数据库连接 进行使用
Connection con = dataSource.getConnection();

String sql = "sql语句";
PreparedStatement pst = con.prepareStatement(sql);

//4执行sql语句,接受结果集
ResultSet rs = pst.executeQuery();//sql语句不同,执行的方法也不同,返回的结果类型也不同

//5.处理结果
while(rs.next()) {}//或者判断
//6.释放资源
		rs.close();
        pst.close();
        con.close();

使用数据库连接池工具类

 //1.通过连接池工具类获取一个数据库连接
        Connection con = DataSourceUtils.getConnection();

        String sql = "SELECT * FROM student";//sql语句自定义,要确保在数据库能执行
        PreparedStatement pst = con.prepareStatement(sql);

        //2.执行sql语句,接收结果集
        ResultSet rs = pst.executeQuery();//视sql语句调整

        //3.处理结果集  根据需求选择处理方式
        while(rs.next()) {
            System.out.println(rs.getInt("sid") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getDate("birthday"));
        }

        //4.释放资源
        DataSourceUtils.close(con,pst,rs);

数据库连接池工具类

public class DataSourceUtils {
    //1.私有构造方法
    private DataSourceUtils() {
    }

    //private DataSource(){}
    //2.声明数据源变量
    private static DataSource dataSource;

    //private static DataSource dataSource;
    //3.提供静态代码块,完成配置文件的加载和获取数据库连接池对象
    static {
        try {
            //完成配置文件的加载
            //a获取配置文件的输入流
            InputStream is = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties");      
            //b.加载配置文件
            Properties prop = new Properties();
            prop.load(is);        
            //获取数据库连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //4.提供一个获取数据库连接的方法
    public static Connection getConnection() {
        // 完整语句 Connection conn = dataSource.getConnection();
        Connection con = null;//提取到try作用域外定义
        try {
            con = dataSource.getConnection();//赋值
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    //5.提供一个获取数据库连接池对象的方法
    public static DataSource getDataSource() {
        return dataSource;
    }

    //6.释放资源
    public static void close(Connection con, Statement stat, ResultSet rs) {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(Connection con, Statement stat) {
        // 简化为调用方法
       // close(con,  stat, null);

        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

自定义JDBC框架

自定义框架的意义
在上述的代码中存在大量的冗余,
定义必要的信息、获取数据库的连接、释放资源都是重复的代码,而我们最终的核心功能仅仅只是执行一条sql 语句,
所以我们可以抽取出一个 JDBC 模板类,来封装一些方法(update、query),专门帮我们执行增删改查的 sql 语句。将之前那些重复的操作,都抽取到模板类中的方法里,就能大大简化我们的使用步骤!
源信息
DataBaseMetaData :数据库的源信息
DatabaseMetaData类是java.sql包中的类,利用它可以获取我们连接到的数据库的结构、存储等很多信息
java.sql.DataBaseMetaData 封装了整个数据库的综合信息

 String getDatabaseProductName():获取数据库产品的名称
  int getDatabaseProductVersion():获取数据库产品的版本号

ParameterMetaData :参数的源信息
java.sql.ParameterMetaData 封装的是预编译执行者对象中每个参数的类型和属性,这个对象可以通过预
编译执行者对象中的 **getParameterMetaData() **方法来获取

 核心功能: int getParameterCount() 用于获取 sql 语句中参数的个数

ResultSetMetaData:结果集的源信息
java.sql.ResultSetMetaData:封装的是结果集对象中列的类型和属性,这个对象可以通过结果集对象中的 **getMetaData()**方法来获取

核心功能:int getColumnCount() 用于获取列的总数,String getColumnName(int i) 用于获取列名

自定义框架流程(了解)

1. 用于执行增删改功能的 update() 方法
2.  update() 方法的测试。
3. 用于执行查询功能的方法
4.  实体类的编写。定义一个类,提供一些成员变量
5. 处理结果集的接口
6. 处理结果集的接口实现类 1
7. 用于查询一条记录并封装对象的方法 queryForObject()
8.  queryForObject() 方法的测试 测试查询一条记录并封装对象
9. 处理结果集的接口实现类 2
10. 用于查询多条记录并封装集合的方法 queryForList()
11. queryForList() 方法的测试
12. 处理结果集的接口实现类 3 
13. 用于执行聚合函数 sql 语句的方法 queryForScalar()
14. queryForScalar() 方法的测试


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值