JDBC

概念: java data source Connectivity  数据连接
        
JDBC 开发步骤
          1 注册驱动
            2 获得连接        
            3 创建执行sql语句
            4 释放资
        代码实现:
                    抽取工具类:
package com.itheima.jdbc.utils;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
 
/**
 * JDBC的工具类
 * @author apple
 *
 */
public class JDBCUtils {
   public static final String DRIVERCLASS;
   public static final String URL;
   public static final String USERNAME;
   public static final String PASSWORD;
  
   static{
          // 获得属性文件中的数据.
          Properties properties = new Properties();
          try {
                 properties.load(new FileInputStream("src/db.properties"));
          } catch (FileNotFoundException e) {
                 e.printStackTrace();
          } catch (IOException e) {
                 e.printStackTrace();
          }
         
          DRIVERCLASS = properties.getProperty("jdbc.driverClass");
          URL = properties.getProperty("jdbc.url");
          USERNAME = properties.getProperty("jdbc.username");
          PASSWORD = properties.getProperty("jdbc.password");
   }
  
   // 加载驱动:
   public static void loadDriver(){
          try {
                 Class.forName(DRIVERCLASS);
          } catch (ClassNotFoundException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
          }
   }
  
   // 获得连接:
   public static Connection getConnection(){
          loadDriver();
          Connection conn = null;
          try {
                 conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
          } catch (SQLException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
          }
          return conn;
   }
  
   // 释放资源:
   public static void release(Statement stmt,Connection conn){
          if(stmt != null){
                 try {
                        stmt.close();
                 } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                 }
                 stmt = null;
          }
         
          if(conn != null){
                 try {
                        conn.close();
                 } catch (SQLException e) {
                        e.printStackTrace();
                 }
                 conn = null;
          }
   }
  
   public static void release(ResultSet rs,Statement stmt,Connection conn){
          if(rs!= null){
                 try {
                        rs.close();
                 } catch (SQLException e) {
                        e.printStackTrace();
                 }
                 rs = null;
          }
          if(stmt != null){
                 try {
                        stmt.close();
                 } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                 }
                 stmt = null;
          }
         
          if(conn != null){
                 try {
                        conn.close();
                 } catch (SQLException e) {
                        e.printStackTrace();
                 }
                 conn = null;
          }
   }
}        


连接池
 Connection对象在JDBC使用的时候.使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了.每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.程序初始化的时候,初始化多个连接,将多个连接放入到池中(内存中).每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.

修改类的方法:
                       
                        1  继承
                        2 装饰者模式
                                            * 装饰者模式的使用条件:
                                            * 2.1增强的类和被增强的类实现相同的接口.
                                            * 2.2在增强的类中能够获得被增强的类的引用.
                                            * 接口中方法过多,只增强其中的一个方法.其他方法都需要原样调用原有方法. 

                        3 动态修改
                                            * JDK的动态代理使用条件:
                                             * 被代理的对象必须实现接口.

DBCP: 
        @Test
   /**
    * DBCP的一个入门:手动设置参数
    */
   public void demo1(){
          Connection conn = null;
          PreparedStatement pstmt = null;
         
          // 创建连接池:
          BasicDataSource dataSource = new BasicDataSource();
          dataSource.setDriverClassName("com.mysql.jdbc.Driver");
          dataSource.setUrl("jdbc:mysql:///web07");
          dataSource.setUsername("root");
          dataSource.setPassword("1234");
          try{
                 // 获得连接:
                 conn = dataSource.getConnection();
                 // 编写SQL语句.
                 String sql = "insert into category values (null,?)";
                 // 预编译SQL:
                 pstmt = conn.prepareStatement(sql);
                 // 设置参数:
                 pstmt.setString(1, "鞋靴箱包");
                 //执行SQL
                 pstmt.executeUpdate();
          }catch(Exception e){
                 e.printStackTrace();
          }finally{
                 JDBCUtils.release(pstmt, conn);
          }
   }
 
   @Test
   /**
    * DBCP的带有配置文件的方式
    */
   public void demo2(){
          Connection conn = null;
          PreparedStatement pstmt = null;
         
          // 创建连接池:
          try{
                 Properties properties = new Properties();
                 properties.load(new FileInputStream("src/dbcp.properties"));
                 DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
                 // 获得连接:
                 conn = dataSource.getConnection();
                 // 编写SQL语句.
                 String sql = "insert into category values (null,?)";
                 // 预编译SQL:
                 pstmt = conn.prepareStatement(sql);
                 // 设置参数:
                 pstmt.setString(1, "生活用品");
                 //执行SQL
                 pstmt.executeUpdate();
          }catch(Exception e){
                 e.printStackTrace();
          }finally{
                 JDBCUtils.release(pstmt, conn);
          }
   }
 
DBCP的参数的设置:
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=1234
 
#<!-- 初始化连接 -->
initialSize=10
 
#最大连接数量
maxActive=50
 
#<!-- 最大空闲连接 -->
maxIdle=20
 
#<!-- 最小空闲连接 -->
minIdle=5
 
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


c3p0:

        代码实现:
   @Test
   /**
    * 手动设置参数的方式:
    */
   public void demo1(){
          Connection conn = null;
          PreparedStatement stmt = null;
          // System.err.println("");
          try{
                 // 创建连接池:
                 ComboPooledDataSource dataSource = new ComboPooledDataSource();
                 // 设置参数:
                 dataSource.setDriverClass("com.mysql.jdbc.Driver");
                 dataSource.setJdbcUrl("jdbc:mysql:///web07");
                 dataSource.setUser("root");
                 dataSource.setPassword("1234");
                
                 conn = dataSource.getConnection();
//               编写SQL
                 String sql = "insert into category values (null,?)";
                 // 预编译SQL:
                 stmt = conn.prepareStatement(sql);
                 // 设置参数:
                 stmt.setString(1, "食品饮料");
                 stmt.executeUpdate();
          }catch(Exception e){
                 e.printStackTrace();
          }finally{
                 JDBCUtils.release(stmt, conn);
          }
   }
 
   @Test
   /**
    * 配置文件的方式:
    */
   public void demo2(){
          Connection conn = null;
          PreparedStatement stmt = null;
          // System.err.println("");
          try{
                 // 创建连接池:
                 ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql11111");
                
                 conn = dataSource.getConnection();
//               编写SQL
                 String sql = "insert into category values (null,?)";
                 // 预编译SQL:
                 stmt = conn.prepareStatement(sql);
                 // 设置参数:
                 stmt.setString(1, "食品饮料222");
                 stmt.executeUpdate();
          }catch(Exception e){
                 e.printStackTrace();
          }finally{
                 JDBCUtils.release(stmt, conn);
          }
   }
【使用C3P0改写了工具类】
public class JDBCUtils2 {
  
   private static final ComboPooledDataSource DATASOURCE =new ComboPooledDataSource();
  
   public Connection getConnection(){
          Connection conn = null;
          try {
                 conn = DATASOURCE.getConnection();
          } catch (SQLException e) {
                 e.printStackTrace();
          }
          return conn;
   }
     ...
}


DBUtils

DBUtils
【概述】
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍
l  QueryRunner中提供对sql语句操作的API.
l  ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
l  DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
 
【QueryRunner核心类】
l  QueryRunner(DataSource ds) ,提供数据源(连接池),DBUtils底层自动维护连接connection
l  update(String sql, Object... params) ,执行更新数据
l  query(String sql, ResultSetHandler<T> rsh, Object... params) ,执行查询
 
【ResultSetHandler结果集处理类】
ArrayHandler将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
ArrayListHandler将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
BeanHandler将结果集中第一条记录封装到一个指定的javaBean中。
BeanListHandler将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
ColumnListHandler将结果集中指定的列的字段值,封装到一个List集合中
KeyedHandler将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
MapHandler
将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值
 
MapListHandler将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
ScalarHandler它是用于单数据。例如select count(*) from 表操作。
 
【DbUtils】
closeQuietly(Connection conn) 关闭连接,如果有异常 try 后不抛。
commitAndCloseQuietly(Connection conn) 提交并关闭连接
rollbackAndCloseQuietly(Connection conn) 回滚并关闭连接






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值