11.15Java学习进度

JDBC事务,批处理,连接池:

JDBC事务:
在dos命令行操作oracle时,执行DML,需要结束事务(commit提交 或 rollback回退)
在JDBC中,事务是自动提交的,每执行一条DML语句,事务就自动提交一次
我们可以通过JDBC的事务API,开始事务的手动提交,将多条DML语句看作一个整体要么一起成功,要么一起失败.

事务特性:
特性:

事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

JDBC事务操作格式:
注意: 开启事务的手动提交,是通过连接对象完成的.
某个数据连接对象的事务开启手动提交后,这个连接对象的事务需要手动控制,其他连接对象不受影响.
操作方法:

  1. 开始事务的手动提交:

    conn.setAutoCommit(boolean flag);
    参数含义: true表示自动提交 , false表示手动提交.
    
  2. 提交事务:

     conn.commit();
    
  3. 回退事务到上次提交:
     rollback();
    

预编译sql:

PreparedStatement prepareStatement = conn.prepareStatement("sql语句");  

注意: 方法名是prepareStatement,而返回类型是PreparedStatement

execute、executeUpdate区别:

不同1:

execute可以执行查询语句,然后通过getResultSet,把结果集取出来。

executeUpdate不能执行查询语句。

不同2:

execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等。

executeUpdate返回的是int,表示有多少条数据受到了影响。

批处理:
将多条SQL语句放到一起批量处理,
批处理将多次对于数据库的操作次数,减少到了一次,提高了大量SQL语句一起执行时的性能.

使用步骤:

批处理使用Statement类操作
步骤1. 将一条SQL语句加入到批处理中

    ```
    statement.addBatch(String sql);
    ```  

步骤2. 执行批处理中的所有语句  
    ```
    Statement.executeBatch();
    ```  

properties文件与类:
常用于java的配置文件,
因为Properties文件 可以快速的与Properties类 进行转换.
里面不能中文,会被转换为Unicode编码。

文件:
注释: #开头表示注释行
键值对: 键与值之间使用等号连接,多个键值对之间使用换行分割

如何将一个Properties文件,转换为java中的Map集合对象:
步骤:

  1. 创建Properties对象

    Properties ppt = new Properties();
    
  2. 创建Properties文件的字节输入流

    InputStream is = // 可以通过 new FileInputStream, 也可以通过ClassLoader等等  
    
  3. 将流加载到Properties对象

    ppt.load(is);
    

连接池:
有连接池创建连接,维护连接
我们需要使用连接是,从连接池中获取连接,
如果池中存在空闲连接,则拿去使用.
如果不存在空闲连接,且池未满,则再连接池中创建新的连接使用.
如果不存在空闲连接,且池已满,则排队等待空闲连接.

使用步骤:

  1. 引入相关的jar文件
  • dbcp : 连接池的代码
  • poll : 连接池的依赖库
  1. 创建一个properties文件,描述连接池的配置,内容如下:
  • 数据库连接地址
    url=jdbc:oracle:thin:@localhost:1521:xe
  • 数据库驱动地址
    driverClassName=oracle.jdbc.OracleDriver
  • 数据库账号
    username=system
  • 数据库密码
    password=123456

扩展配置:

  • 初始化连接池时,创建的连接数量:
    initialSize=5
  • 最大允许存在的连接数量
    maxActive=200
  • 空闲时允许保留的最大连接数量
    maxIdle=10
  • 空闲时间允许保留的最小连接数量
    minIdle=5
  • 排队等候的超时时间
    maxWait=20000
  1. 将properties文件,转化为Properties对象.
    Properties ppt = new Properties();
    ppt.load(文件输入流);

  2. 通过连接池工厂类(BasicDataSourceFactory),创建连接池对象(一次程序启动,创建一个连接池就够了.)
    DataSource ds =BasicDataSourceFactory.createDataSource(ppt);

  3. 通过连接池对象,获取池中的连接
    Connection conn = ds.getConnection();

  4. 正常JDBC操作
    实例:

    public class Demo {
     public static void main(String[] args) throws Exception {
    
         // 3. properties文件转换为Properties对象
         Properties ppt = new Properties();
         // 4. 加载文件的输入项
         InputStream is = Demo.class.getClassLoader().getResourceAsStream("dbcp.properties");
         ppt.load(is);
         // 5. 通过工厂类床创建连接池
         DataSource ds = BasicDataSourceFactory.createDataSource(ppt);
         // 6. 通过连接池,获取其中的连接,并使用
         Connection conn = ds.getConnection();
    
         //正常的JDBC操作
         PreparedStatement state = conn.prepareStatement("insert into STUDENTS values (STUDENTS_STUID_SEQ.nextval,'小刚',25)");
         int count = state.executeUpdate();
         System.out.println(count>0?"数据插入成功":"数据插入失败");
     }
    }