JavaWeb- JDBC编程进阶(自定义数据源+开源数据源:DBC

作者:杭州车成汽车事务代理服务部 来源:www.guohuicar.com 发布时间:2018-04-07 09:48:21
JavaWeb- JDBC编程进阶(自定义数据源+开源数据源:DBCP、C3P0) JDBC编程进阶(自定义数据源+开源数据源:DBCP、C3P0) 一、调用存储过程

a、存储过程是什么?

将一组SQL组合在一起,类似于java代码里面的函数 现实当中SQL命令不可能一条一条调用。 目的为了打包存储调用。 放在服务器上,已经编译好。 买烟的例子(一次买一根还是买一包?)

b、代码:如何操作?

这些代码可以用java代码类比。 在代码框架里可以调用多行sql语句。 在代码中可以定义结束符号。 以后接触需要输入代码的机会少,因为别人需要程序员做的就是提供给程序员接口,给过程输入代码。 二、批处理

Statement和PreparedStatement都可以做批量处理

首先使用Statement来处理:Statement中的addBatch()方法:用来放入批量SQL语句 然后执行呢?executeBatch()方法批量执行 最后clearBatch(),清空此Statement对象的当前SQL命令列表 这是整个处理流程。

使用Statement实现批处理的特点

1、可以执行不同的sql语句 2、但参数是必须确定的

使用PreparedStatement实现

特点:执行的SQL相同,但参数不同,通常用于批量添加,或删除。 三、事务

1、事务的概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。

2、用sql语言怎么控制事务?

例如:A——B转帐,对应于如下两条sql语句

update account set money=money-100 where name=‘a’; update account set money=money+100 where name=‘b’;

最后确然语句是否成立?

rollback;//该句让以上的语句无效,即不提交

那么如何提交?

commit();

数据库开启事务命令DTL

start transaction 开启事务 Rollback 回滚事务 Commit 提交事务

3、那么在jdbc中怎么控制事务的?

利用prepareStatement来编程

st = con.prepareStatement(update account set money = money-? where id = ?); st.setInt(1,100); st.setInt(2,1); int i = 1/0;//为了抛出异常,去执行回滚 st.executeUpdate(); st = con.prepareStatement(update account set money = money+? where id = ?); st.setInt(1,100); st.setInt(2,2); st.executeUpdate();

以上如何开事务?

查文档:Connection去找开启事务的方法

setAutoCommit()

在以上代码前开启事务:

con.setAutoCommit(false);//不自动提交,开启事务

如没有问题,就在代码最后提交事务:

con.commit();

如果有问题,

那么就在就在catch(Exception e){con.rollback();}//因为如果以上代码异常了,那么con.commit()也执行不了了。

如果以上代码不加事务机制,那么会怎样?

那么会-100的代码执行了,而+100的代码没执行,因为有异常。所以该处能体现事务机制的好处

4、事务的特性和隔离级别(必须清楚:数据安全):涉及多线程

多线程同时操作同一事务。引起操作数据冲突。

那么事务有什么特性呢?

a.原子性:处于同一个事务中的多条语句,要么全都成功,要么全都不成成功。 b.一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账:转账前a+b=2000,转账后a+b=2000 c.隔离性:多线程并发时,一个事务不能被其他事务所干扰。 d.持久性:数据应该被永久性的保存起来。(硬盘,而不是内存)

如果不考虑事务的隔离性,会导致以下不正确的问题:

a、脏读:指一个事务读到了另外一个事务中未提交的数据 b、不可重复读:指一个事务读到了另外一个事务update后(事务提交了)的数据 c、虚读:指一个事务读到了另外一个事务insert的数据

数据库有四个隔离级别:

READ UNCOMMITTED:脏读、不可重复读、虚读都有可能发生。 READ COMMITTED:防止脏读发生;不可重复读、虚读都有可能发生。 REPEATABLE READ:(MySQL默认级别)防止脏读、不可重复读;虚读有可能发生。 SERIALIZABLE:防止脏读、不可重复读、虚读的发生 特点:从上到下,隔离级别越高,数据越安全,但是效率越低

在SQL中如何输入代码?

select @@tx_isolation; 查看当前数据库的隔离级别 set transaction isolation level 四个级别之一;更改当前事务的隔离级别 各种不同的数据库的默认隔离级别不一样。

实验:项目架构:day1600procedure

jdbccfg.properties

TestBatch.java

package com.itheima.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import com.itheima.utils.JdbcUtil; public class TestBatch { public static void main(String[] args) { //testBatch1(); //testBatch2(); testBatch3(); } private static void testBatch3() { Connection con = null; PreparedStatement st = null; try { con = JdbcUtil.getConnection(); st = con.prepareStatement(insert into usersw values(?,?)); //使用PreparedStatement实现批处理特点: 1.可以执行相同的SQL语句,2.但参数是不同的,通常用于实现批量添加,或删除 for (int i = 0; i <38; i++) {//这是个坑 st.setInt(1, i+100); st.setString(2, aj+i); //用于将参数加入到批处理命令中 st.addBatch(); if(i%10==0){ st.executeBatch(); st.clearBatch(); } } //2.执行批处理 st.executeBatch(); //3.清空命令列表 st.clearBatch(); } catch (Exception e) { e.printStackTrace(); } finally{ JdbcUtil.release(null, st, con); } } private static void testBatch2() { Connection con = null; PreparedStatement st = null; try { con = JdbcUtil.getConnection(); st = con.prepareStatement(insert into usersw values(?,?)); //使用PreparedStatement实现批处理特点: 1.可以执行相同的SQL语句,2.但参数是不同的,通常用于实现批量添加,或删除 for (int i = 0; i <10000000; i++) {//这是个坑 st.setInt(1, i+10); st.setString(2, aj+i); //用于将参数加入到批处理命令中 st.addBatch(); } //2.执行批处理 st.executeBatch(); //3.清空命令列表 st.clearBatch(); } catch (Exception e) { e.printStackTrace(); } finally{ JdbcUtil.release(null, st, con); } } private static void testBatch1() { Connection con = null; Statement st = null; try { con = JdbcUtil.getConnection(); st = con.createStatement(); //使用Statement实现批处理特点: 1.可以执行不同的SQL语句,2.但参数是必须确定的 st.addBatch(create table usersw(id int primary key,name varchar(20))); st.addBatch(insert into usersw values(1,'cgx')); st.addBatch(update usersw set name='aj' where id=1); //2.执行批处理 st.executeBatch(); //3.清空命令列表 st.clearBatch(); } catch (Exception e) { e.printStackTrace(); } finally{ JdbcUtil.release(null, st, con); } } }

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:江岸网站建设 http://www.jawzjs.com.cn

  • 上一篇:Python标准库:内置函数eval(expression, globals=Non
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 杭州车成汽车事务代理服务部 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100