JDBC和数据库连接池

JDBC简述

JDBC(Java DataBase Connectivity,java数据库连接)
是Java访问数据库的标准规范
是由各大数据库厂商来实现对应接口

JDBC简单使用

 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.SQLException;
 4 import java.sql.Statement;
 6 public class Demo01_jdbc入门程序 {
 8      public static void main(String[] args) {
10         Connection conn = null;
11         Statement st = null;
12         try {
13             //1 加载驱动
14             Class.forName("com.mysql.jdbc.Driver");
16             //2 获得连接
17             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db0814","root","123");
19             //3创建通道
20             st = conn.createStatement();
22             String sql = "insert into student values(null,'李四',21,'1998-10-10')";
24             //4执行sql
25             int result = st.executeUpdate(sql);  // 5.处理结果集  ,返回值表示数据库中受影响的数据的条数
26             System.out.println(result);
27             //6关闭资源
28             st.close();
29             conn.close();   
31         } catch (Exception e) {
32             e.printStackTrace();
33         }finally{    
51         }
53     }
55 }

JDBC预通道

 1 import com.offcn.util.DateUtil;
 2 import com.offcn.util.JDBCUtil;
 3 public class Demo01_PreparedStatement使用 {
 4     /*
 5      * PreparedStatement是Statement的子接口
 6      * 
 7      * Statement的缺点:
 8      *   1 拼接SQL过于繁琐
 9      *   2 多条相似SQL 会每条SQL都进行编译,效率低
10      *   3 SQL注入攻击问题
11 
12      * PreparedStatement:
13      *    1 不用拼接SQL 而是用? 占位,绑定参数的方式
14      *    2 预编译功能,相似操作只编译一次,提高效率
15      *    3 防止SQL注入攻击问题
16      * 
17      * */
18     public void test2(){
19         Connection conn = null;
20         PreparedStatement ps = null;
21         try{
22             conn = JDBCUtil.getConnection();
23             String sql = "insert into student values(null,?,?,?)";
24             ps = conn.prepareStatement(sql);  // 这里就把sql进行了预编译,把sql编译成一个可执行的函数   例如: MYINSERT(?,?,?)
26             ps.setObject(1, name);
27             ps.setObject(2, Integer.parseInt(age));
28             ps.setObject(3, DateUtil.stringToDate(birthday));
29             
30             int result1 = ps.executeUpdate();
31             
32             ps.setObject(1, name2);
33             ps.setObject(2, Integer.parseInt(age2));
34             ps.setObject(3, DateUtil.stringToDate(birthday2));
35             
36             int result2 = ps.executeUpdate();
37             
38             System.out.println(result1+"	"+result2);
40         }catch(Exception e){
41             e.printStackTrace();
42         }finally{
43             JDBCUtil.closeAll(null, ps, conn);
44         }    
45     }

连接池简述

原始:
        创建连接
        使用连接
        销毁连接
连接池:
        创建连接池
        取用连接
        归还连接

官方定义接口 DataSource 由厂商去实现

  DBCP连接池、C3p0连接池、Druid连接池(阿里)

    DBCP连接池和c3p0连接池的对比:

    Dbcp:效率高,但是安全性一般   Apache软件基金会  

    C3p0:安全性很高,效率偏低

C3P0连接池

 1   import java.sql.Connection;
 2   import java.sql.PreparedStatement;
 3   import java.sql.ResultSet;
 4   
 5   import javax.sql.DataSource;
 6   import com.mchange.v2.c3p0.ComboPooledDataSource;
 7   import com.offcn.util.C3P0Util;
 8   
 9   public class Demo01_C3P0使用 {
10      public static void main(String[] args) throws Exception{
11          DataSource ds = new ComboPooledDataSource();  //默认加载src下的 c3p0-config.xml中的<default-config>的配置
12          DataSource ds = new ComboPooledDataSource("offcn");//加载src下c3p0-config.xml中  <named-config name="offcn">的配置
14          Connection conn = ds.getConnection();
15          
16          PreparedStatement ps = conn.prepareStatement("select * from student");
17          ResultSet rs = ps.executeQuery();
18          while(rs.next()){
19             System.out.println(rs.getInt("id")+"	"+rs.getString("name")+"	"+rs.getInt("age")+"	"+rs.getDate("birthday"));
20          }
22          rs.close();
23          ps.close();
24          conn.close();
25      }
26 
27  }

C3P0Util

 1 import java.sql.Connection;
 3 import javax.sql.DataSource;
 5 import com.mchange.v2.c3p0.ComboPooledDataSource;
 7 public class C3P0Util { 
10     private static DataSource ds; 
12     static{  
14         ds = new ComboPooledDataSource();
15     }
18     public static DataSource getDataSource(){
19         return ds;
22     public static Connection getConnection() throws Exception{
23         return ds.getConnection();
24     }
26 }

DBUtils工具

  DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
  DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写很多代码
  Dbutils三个核心功能介绍     QueryRunner中提供对sql语句操作的API.(CRUD增删改查)     ResultSetHandler接口,用于定义select操作后,怎样封装结果集.     DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法(事务)
  数据更新    update(String sql,Object…param)   数据查询   query(String sql,handler,Object[] param)
  ResultSetHandler结果集处理程序    BeanHandler    将结果集中第一条记录封装到一个指定的javaBean中。    BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中    MapListHandler 将结果集中每一条记录封装到了Map
<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。

数据库事务

四大特性(ACID)
   原子性(Atomicity)    事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  一致性(Consistency)    事务前后数据的完整性必须保持一致
  隔离性(Isolation)    是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个 并发事务之间数据要相互隔离,不能相互影响。
  持久性(Durability)    指一个事务一旦被提交(commit),它对数据库中数据的改变就是永久性的,接下来即使数据库发 生故障也不应该对其有任何影响
我凝视这恒星,等待这那场风暴,我已经准备好了
原文地址:https://www.cnblogs.com/cheng5350/p/11466490.html