1、高级软件人才实作培训专家高级软件人才实作培训专家!JDBCJDBC讲师讲师:张晓飞张晓飞高级软件人才实作培训专家高级软件人才实作培训专家!数据持久化l持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用,也称为“固化”。在大多数情况下,服务器或客户端应用中数据的持久化是通过关系型数据库来实现l存储设备:磁盘、硬盘,U盘,光盘等l存储形式:数据库、xml文件、txt文件等数据XML文件数据库其它存储形式知识点1:数据持久化为什么用数据库持久化数据?高级软件人才实作培训专家高级软件人才实作培训专家!Java 中的数据库存储技术l在Java中,数据库存取技术可分为如下几类:J
2、DBC直接访问数据库第三方O/R工具,如Hibernate,ibatis 等lJDBC是java访问数据库的基石,其他技术都是对jdbc的封装知识点2:Java 中的数据存储技术学好JDBC是王道!高级软件人才实作培训专家高级软件人才实作培训专家!JDBCJDBC基础基础lJDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的操作数据库的Interface(一组API),定义了用来访问数据库的标准Java类库,而接口的实现有各个数据库厂商来完成lJDBC驱动程序(jar包):数据库厂商对JDBC接口的一组实现类(jar包)知识点3:什么是JDBC
3、高级软件人才实作培训专家高级软件人才实作培训专家!ODBClODBC(Open Database Connectivity,开放数据库连接)是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API知识点4:什么是ODBC(了解)高级软件人才实作培训专家高级软件人才实作培训专家!JDBC分类目前有四种可供使用的JDBC驱动程序,不同类型的的驱动程序有着不一样的使用方法,所以当我们在连接数据库之前,必须先依照我们的需求选择一个适当的驱动程序,这四种不同类型的驱动程序分别是:1 JDBC-ODBC桥:桥接器型的驱动程序,2 部分本地API部分Java的
4、驱动程序,也是桥接器型驱动程序之一 3 JDBC网络纯Java驱动程序 4 本地协议的纯 Java 驱动程序:这类型的驱动程序是最成熟的JDBC驱动程序,不但无需在使用者计算机上安装任何额外的驱动程序,也不需在服务器端安装任何的中介程序(middleware),所有存取数据库的操作,都直接由驱动程序来完成。知识点5:JDBC的分类(了解)高级软件人才实作培训专家高级软件人才实作培训专家!JDBC-ODBC桥 lJDBCODBC桥是在JDK中由SUN本身开发出来的一套数据库访问操作,在JDBCODBC桥接中它的各种操作API都是最新的,但性能不高l在 JDK 中,提供了 JDBC-ODBC 桥的
5、实现类(sun.jdbc.odbc.JdbcOdbcDriver)Java 应用程序JDBC APIJDBC-ODBC桥ODBC API数据库ODBC层知识点5_1:JDBC-ODBC桥(了解)高级软件人才实作培训专家高级软件人才实作培训专家!部分本地API部分Java的驱动程序l这种类型的 JDBC 驱动程序使用 Java 编写,它调用数据库厂商提供的本地 APIl通过这种类型的 JDBC 驱动程序访问数据库减少了 ODBC 的调用环节,提高了数据库访问的效率l在这种方式下需要在客户的机器上安装本地 JDBC 驱动程序和特定厂商的本地 API Java 应用程序JDBC APIJDBC驱动程
6、序厂商提供的本地 API数据库知识点5_2:部分本地API部分Java的驱动程序(了解)高级软件人才实作培训专家高级软件人才实作培训专家!JDBC网络纯Java驱动程序l这种驱动利用中间件的应用服务器来访问数据库。应用服务器作为一个到多个数据库的网关,客户端通过它可以连接到不同的数据库服务器。l应用服务器通常有自己的网络协议,Java 用户程序通过 JDBC 驱动程序将 JDBC 调用发送给应用服务器,应用服务器使用本地程序驱动访问数据库,从而完成请求。Java 应用程序JDBC APIJDBC驱动程序数据库应用服务器厂商提供的本地 API知识点5_3:JDBC网络纯Java驱动程序(了解)高
7、级软件人才实作培训专家高级软件人才实作培训专家!*本地协议的纯 Java 驱动程序l多数数据库厂商已经支持允许客户程序通过网络直接与数据库通信的网络协议。l这种类型的驱动程序完全使用 Java 编写,通过与数据库建立的 Socket 连接,采用具体与厂商的网络协议把 JDBC 调用转换为直接连接的网络调用Java 应用程序JDBC APIJDBC驱动程序数据库知识点5_4:*本地协议的纯 Java 驱动程序(了解)高级软件人才实作培训专家高级软件人才实作培训专家!JDBC APIJDBC APIDriverManagerConnectionConnectionConnectionStateme
8、ntPreparedStatementCallableStatementResultSetResultSetResultSet知识点6:JDBC API接口介绍高级软件人才实作培训专家高级软件人才实作培训专家!获取与数据库的连接编码实现得到代表与数据库连接的编码实现得到代表与数据库连接的Connection对象对象三种方式三种方式高级软件人才实作培训专家高级软件人才实作培训专家!获取数据库连接方法一:驱动实现类知识点7_1:使用driver接口的mysql实现类连接mysql数据库lJava.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,
9、不同数据库厂商提供不用的实现高级软件人才实作培训专家高级软件人才实作培训专家!获取数据库连接方法二:驱动管理器注册知识点7_2:采用注册驱动的方式DriverManager.registerDriver(driver)向 DriverManager 注册给定驱动程序 高级软件人才实作培训专家高级软件人才实作培训专家!获取数据库连接方法三:加载驱动类字节码知识点7_3:采用class.forName的方式l加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名lDriverManager 类是驱动程序管理器类,负责管理驱动程序l通常不用显
10、式调用 DriverManager 类的 registerDriver()方法来注册驱动程序类的实例,因为 Driver 接口的实现类都都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver()方法来注册自身的一个实例高级软件人才实作培训专家高级软件人才实作培训专家!连接数据库的URLlJDBC URL的标准由三部分组成,各部分间用冒号分隔。协议:协议:JDBC URL中的协议总是jdbc 子协议:子协议用于标识一个数据库驱动程序子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息 知识点7
11、_4:连接数据库的URLjdbc:mysql:/localhost:3306/test 协议协议子协议子协议子名称子名称jdbc:mysql:/localhost:3306/db_namejdbc:mysql:/localhost:3306/db_namelURL的作用:1、找到驱动程序(协议)2、确定连接的数据库(子名称)高级软件人才实作培训专家高级软件人才实作培训专家!操作数据库l数据库连接被用于向数据库服务器发送命令和 SQL 语句,在连接建立后,需要对数据库进行访问,执行 sql 语句l在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:StatementPre
12、patedStatementCallableStatement知识点8_1:jdbc对数据库的调用方式高级软件人才实作培训专家高级软件人才实作培训专家!Statementl通过调用 Connection 对象的 createStatement 方法创建该对象l该对象用于执行静态的 SQL 语句,并且返回执行结果lStatement 接口中定义了下列方法用于执行 SQL 语句:int excuteUpdate(String sql)(针对DDL和DML操作)ResultSet excuteQuery(String sql)(针对DQL操作)知识点8_2:statement对象对数据库的crud操
13、作用用statement实现实现DDL,DML用用statement实现实现DQL的操作的操作高级软件人才实作培训专家高级软件人才实作培训专家!ResultSetl通过调用 Statement 对象的 excuteQuery()方法创建该对象lResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现lResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next()方法移动到下一行lResultSet 接口的常用方法:boolean next()getString()知识
14、点9_1:包含结果集数据的ResultSet高级软件人才实作培训专家高级软件人才实作培训专家!ResultSet高级软件人才实作培训专家高级软件人才实作培训专家!getXxxx方法 Xxxx数据类型高级软件人才实作培训专家高级软件人才实作培训专家!SQL与Java数据类型的对应关系高级软件人才实作培训专家高级软件人才实作培训专家!完成JDBC工具类JDBCUtils封装封装JDBC的工具类的工具类JdbcUtils高级软件人才实作培训专家高级软件人才实作培训专家!练习练习字段名字段名说明说明类型类型idid流水号流水号IntIntnamename姓名姓名Varchar(20)Varchar(2
15、0)sexsex性别性别Char(2)Char(2)gradegrade成绩成绩Double(5,2)Double(5,2)学生表学生表(Student),表结构如下,表结构如下:实现对实现对Student表的表的CRUD操作的操作的DAO类及测试类类及测试类高级软件人才实作培训专家高级软件人才实作培训专家!可滚动的ResultSetl要使用可滚动的结果集,必须使用不同于前面所定义的Statement:l/创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。Statement stmt=conn.createStatement(type,concu
16、rrency);PreparedStatement stmt=conn.prepareStatement(sql,type,concurrency)知识点9_2:可滚动的ResultSet(了解)测试测试mysql和和oracle对对ResultSet结果集滚动性的支持结果集滚动性的支持高级软件人才实作培训专家高级软件人才实作培训专家!可滚动的ResultSetResultSet的的Type说明说明TYPE_FORWARD_ONLY结果集不能滚动,只可向前滚动 TYPE_SCROLL_INSENSITIVE双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来
17、 TYPE_SCROLL_SENSITIVE双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据ResultSet的的Concurrency(并发类型并发类型)说明说明CONCUR_READ_ONLY结果集不可用于更新数据库CONCUR_UPDATABLE结果集可以用于更新数据库知识点9_3:可滚动的ResultSet(了解)l对Mysql数据库无效:总是可以前后滚动l对Oralce数据有效高级软件人才实作培训专家高级软件人才实作培训专家!ResultSet滚动的结果集next()previous()first()last()absolute()relative()before
18、First()afterLast()isFirst()isLast()isBeforeFirst()isAfterLast()在在mysql上测试几个重要的方法上测试几个重要的方法高级软件人才实作培训专家高级软件人才实作培训专家!PreparedStatementl可以通过调用 Connection 对象的 preparedStatement()方法获取 PreparedStatement 对象lPreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句lPreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,
19、调用 PreparedStatement 对象的 setXXX()方法来设置这些参数.setXXX()方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值知识点10:PreparedStatement对象对数据库crud操作用用PreparedStatement实现表数据的实现表数据的CRUD操作操作高级软件人才实作培训专家高级软件人才实作培训专家!Statement的不安全性lSQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,从而利用系统的 SQL引擎完成恶意行
20、为的做法l用 PreparedStatement 取代 Statement 就可以解决String username=“a or 1=1 or 1=;String psw=b;String sql=select count(*)from login where username=+username+and psw=+psw+;select count(*)from login where username=a or 1=1 or 1=and psw=b知识点11_1:PreparedStatement VS Statement高级软件人才实作培训专家高级软件人才实作培训专家!PreparedS
21、tatement与statement比较l代码的可读性和可维护性.lPreparedStatement能保证安全性(解决sql注入问题)lPreparedStatement 能最大可能提高性能:DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这
22、样每执行一次都要对传入的语句编译一次.对Mysql来说几乎没有区别,但对oracle数据库则非常明显知识点11_2:PreparedStatement VS Statement在在mysql和和oracle上分别测试二者在性能上的差别上分别测试二者在性能上的差别测试测试SQL注入问题注入问题高级软件人才实作培训专家高级软件人才实作培训专家!使用Callable Statementl当不直接使用SQL语句,而是调用数据库中的Store Procedure时,要用到CallableStatement知识点12:Callable Statement对象调用存储过程高级软件人才实作培训专家高级软件人才
23、实作培训专家!小结小结ljava.sql.DriverManagerDriverManager用来装载驱动程序,获取数据库连接。ljava.sql.ConnectionConnection完成对某一指定数据库的联接,获取数据库操作对象ljava.sql.StatementStatement在一个给定的连接中作为SQL执行声明的容器,他包含了两个重要的子类型。Java.sql.PreparedSatementPreparedSatement 用于执行预编译的sql声明Java.sql.CallableStatementCallableStatement用于执行数据库中存储过程的调用ljava.s
24、ql.ResultSetResultSet对于给定声明取得结果的途径高级软件人才实作培训专家高级软件人才实作培训专家!引入概念:数据库事务以银行存款为例来说明事务的应用#账户基本信息表 create table account(accountid varchar(18),#账号 balance double(10,2)#余额)#存款表 create table inaccount(accountid varchar(18),#账号 inbalance double(10,2)#存入余额)实现模拟某人向其账户存入实现模拟某人向其账户存入100元的业务元的业务向账户中存入100元:Insert i
25、nto inaccount(accountid,inbalance)values(500612345,100);Insert into account(accountid,balance)values(500612345,100);高级软件人才实作培训专家高级软件人才实作培训专家!数据库事务l在数据库中,所谓事务是指作为单个逻辑工作单元执行的一系列操作。l为确保数据库中数据的一致性一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。l事务的操作:先定义开始一个事务
26、,然后对数据作修改操作,这时如果提交提交(COMMIT),这些修改就永久地保存下来,如果回退回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。知识点13:数据库事务高级软件人才实作培训专家高级软件人才实作培训专家!数据库事务l事务的事务的ACIDACID属性属性1.原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。2.一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)3.隔离性(Isolation)事务的隔离性是指一个事务的执行不能被其他事务干扰,
27、即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。4.持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响高级软件人才实作培训专家高级软件人才实作培训专家!JDBC 事务处理l事务处理:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),要么整个事务回滚(rollback)到最初状态l在JDBC中,事务默认是自动提交的,每次执行一个 SQL 语句时,如果执行成功,就
28、会向数据库自动提交,而不能回滚l为了让多个 SQL 语句作为一个事务执行:调用 Connection 对象的 setAutoCommit(false);以取消自动提交事务在所有的 SQL 语句都成功执行后,调用 commit();方法提交事务在出现异常时,调用 rollback();方法回滚事务l可以通过Connection的getAutoCommit()方法来获得当前事务的提交方式高级软件人才实作培训专家高级软件人才实作培训专家!事务处理:命令行实现事务处理:命令行实现l 1 查看提交模式查看提交模式 select autocommit;l1 用用begin,rollback,commit来
29、实现来实现 begin /开始一个事务开始一个事务 rollback /事务回滚事务回滚 commit /提交事务提交事务 例如例如:mysql begin;mysql insert into test values(9,dd,dd);mysql commit;l2 直接用直接用set来改变来改变mysql的自动提交模式的自动提交模式 MYSQL默认是自动提交的,也就是你提交一个默认是自动提交的,也就是你提交一个QUERY,它就直接执行,它就直接执行 set autocommit=0 禁止自动提交禁止自动提交 set autocommit=1 开启自动提交开启自动提交,来实现事务的处理。来实现
30、事务的处理。*当你用当你用 set autocommit=0 的时候,你以后所有的的时候,你以后所有的SQL都将做为事务处理,直都将做为事务处理,直 到你用到你用commit确认或确认或rollback结束。结束。*注意注意:当你结束这个事务的同时也开启了个新的事务当你结束这个事务的同时也开启了个新的事务 知识点13:命令行实现事务处理命令行实现事务处理高级软件人才实作培训专家高级软件人才实作培训专家!多个事务并发运行时的并发问题多个事务并发运行时的并发问题知识点14:理解事务并发事务并发A表客户端1客户端2高级软件人才实作培训专家高级软件人才实作培训专家!多个事务并发运行时的并发问题多个事务
31、并发运行时的并发问题知识点15:理解事务隔离级别l事务隔离级别(transaction isolation levels):隔离级别就是对事务并发控制的四个等级。分为 1 串行化(SERIALIZABLE)2 可重复读(REPEATABLE READ)3 读已提交(READ COMMITED)4 读未提交(READ UNCOMMITED)高级软件人才实作培训专家高级软件人才实作培训专家!北京传智播客教育 多个事务并发运行时的并发问题多个事务并发运行时的并发问题隔离级别含义读未提交数据Read Uncommitted能查看到其它事务还未提交的数据,,可能导致脏、幻、不可重复读()读已提交数据Re
32、ad Committed只能查到其它事务已提交的数据,而未提交的数据是看不到的。可防止脏读,但幻读和不可重复读仍可发生()可重复读取 Repeatable Read一个事务读取的数据在整个事务过程中,看到的一直不变,看不到其它事务对这些数据的更新,.可防止脏读,不可重复读,但幻读可能发生。序列化Serializable同一DB上的不现事务只能串行执行,不能并发运行。不会发生脏读、不可重复读和幻读知识点16:数据库的四种隔离级别介绍高级软件人才实作培训专家高级软件人才实作培训专家!北京传智播客教育 多个事务并发运行时的并发问题多个事务并发运行时的并发问题1、mysql默认的隔离级别为Repeat
33、able_Read 2、sqlserver 默认的隔离级别为Read Commited3、oracle数据库支持READ COMMITTED和SERIALIZABLE两种事务隔离性级别,不支持READ UNCOMMITTED和REPEATABLE READ这两种隔离性级别,Oracle数据库默认使用的事务隔离性级别却是READ COMMITTED.知识点17:常用数据库默认的隔离级别高级软件人才实作培训专家高级软件人才实作培训专家!多个事务并发运行时的并发问题多个事务并发运行时的并发问题l设置当前设置当前mysql.exe的隔离级别的隔离级别隔离级需要使用SET 命令来设定其语法如下:SET
34、TRANSACTION ISOLATION LEVEL 隔离级别 隔离级别 分为四种:READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE l查询隔离级别查询隔离级别 select tx_isolationl设置数据库系统的全局的隔离级别设置数据库系统的全局的隔离级别 隔离级需要使用SET 命令来设定其语法如下:SET global TRANSACTION ISOLATION LEVEL 隔离级别知识点18:设置数据库的隔离级别高级软件人才实作培训专家高级软件人才实作培训专家!北京传智播客教育 多个事务并发运行时的并发问题多个
35、事务并发运行时的并发问题对于同时运行的多个事务对于同时运行的多个事务,当这些事务访问数据库相同的数据时当这些事务访问数据库相同的数据时,如果没有采取必要的隔离如果没有采取必要的隔离机制,就会产生并发问题机制,就会产生并发问题.脏读脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。不可重复读不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新更新数据。可重复读可重复读:在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。幻读幻读:一个事务读取了几
36、行记录后,另一个事务插入插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。知识点20:数据库并发操作存在的异常情况高级软件人才实作培训专家高级软件人才实作培训专家!北京传智播客教育 测试:多个事务并发运行时的并发问题测试:多个事务并发运行时的并发问题知识点21:以张三在招商银行的账号和存款为例 1、创建一个银行账号、创建一个银行账号Table CREATE TABLE bankaccount(id CHAR(16)NOT NULL,-银行账号username NVARCHAR(32)NOT NULL,-用户balance DOUBLE(15,2)NOT NULL
37、,-余额lastupdate TIMESTAMP)2.准备数据准备数据假设张三在招商银行北京分行开设了一个账号,并向其中存入了100元-北京分行账号INSERT INTO bankaccount(id,username,balance)VALUES(9555500100071120,张三,100.00);高级软件人才实作培训专家高级软件人才实作培训专家!测试:测试:多个事务并发运行时的并发问题多个事务并发运行时的并发问题知识点21:数据库并发操作存在的异常情况脏读设置数据库的隔离级别设置数据库的隔离级别:set global TRANSACTION ISOLATION LEVEL READ U
38、NCOMMITTED;业务情景:业务情景:张三准备用张三准备用ATM机向其北京招行的帐户汇机向其北京招行的帐户汇1000块钱,在汇之前块钱,在汇之前先用其智能手机的手机银行客户端查询到其北京账户还剩先用其智能手机的手机银行客户端查询到其北京账户还剩10000,接着接着他用他用ATM机向其北京帐户打过去机向其北京帐户打过去1000,在提示确认提交时,他又用,在提示确认提交时,他又用手机查看了一下其帐户余额竟然为手机查看了一下其帐户余额竟然为11000。高级软件人才实作培训专家高级软件人才实作培训专家!测试:测试:多个事务并发运行时的并发问题多个事务并发运行时的并发问题知识点21:数据库并发操作存
39、在的异常情况不可重复读设置数据库的隔离级别设置数据库的隔离级别:set global TRANSACTION ISOLATION LEVEL READ COMMITTED;业务情景:业务情景:张三用其智能手机的手机银行客户端查询其招行帐户余额为张三用其智能手机的手机银行客户端查询其招行帐户余额为10000元,他没有马上退出,去做了一会别的事,在此过程中他老婆元,他没有马上退出,去做了一会别的事,在此过程中他老婆在一个在一个ATM机上向其帐户上汇入了机上向其帐户上汇入了1000元,他回来后又刷新了一下元,他回来后又刷新了一下余额,竟然为余额,竟然为11000元。元。高级软件人才实作培训专家高级软
40、件人才实作培训专家!测试:测试:多个事务并发运行时的并发问题多个事务并发运行时的并发问题知识点21:数据库并发操作存在的情况可重复读设置数据库的隔离级别设置数据库的隔离级别:set global TRANSACTION ISOLATION LEVEL REPEATABLE READ;业务情景:业务情景:张三用其智能手机的手机银行客户端查询其招行帐户余额为张三用其智能手机的手机银行客户端查询其招行帐户余额为99.9元,但他需要元,但他需要100元才能支付抢购,他元才能支付抢购,他QQ告知老婆,他老婆立告知老婆,他老婆立马在一个马在一个ATM机上向其帐户上汇入了机上向其帐户上汇入了100元并打电话
41、告知了张三,他元并打电话告知了张三,他立马用手机又刷新了一下余额,竟然还是立马用手机又刷新了一下余额,竟然还是99.9元元.高级软件人才实作培训专家高级软件人才实作培训专家!测试:测试:多个事务并发运行时的并发问题多个事务并发运行时的并发问题知识点21:数据库并发操作存在的异常情况幻读(Magic read)设置数据库的隔离级别设置数据库的隔离级别:set global TRANSACTION ISOLATION LEVEL REPEATABLE READ;业务情景:业务情景:张三用其智能手机的手机银行客户端查询其招行帐户余额为张三用其智能手机的手机银行客户端查询其招行帐户余额为300元,他准
42、备用其中的元,他准备用其中的200去抢购一个商品,在他没付款之前他的老婆去抢购一个商品,在他没付款之前他的老婆取走取走100元,接着他也花了元,接着他也花了200支付了商品,他再次查了一下余额,支付了商品,他再次查了一下余额,竟然发现账户里一毛钱都没有啦!竟然发现账户里一毛钱都没有啦!高级软件人才实作培训专家高级软件人才实作培训专家!测试:测试:多个事务并发运行时的并发问题多个事务并发运行时的并发问题知识点21:数据库并发操作存在的情况 不能并发设置数据库的隔离级别设置数据库的隔离级别:set global TRANSACTION ISOLATION LEVEL SERIALIZABLE;业务
43、情景:业务情景:张三用其智能手机的手机银行客户端查询其招行帐户余额为张三用其智能手机的手机银行客户端查询其招行帐户余额为99.9元,但他需要元,但他需要100元才能支付抢购,他元才能支付抢购,他QQ告知老婆在线等待,告知老婆在线等待,他老婆立马找到一个他老婆立马找到一个ATM机准备向其帐户上汇入了机准备向其帐户上汇入了100元,但钱就是元,但钱就是汇不进去。汇不进去。高级软件人才实作培训专家高级软件人才实作培训专家!批量处理-提高处理速度 l当需要成批插入或者更新记录时。可以采用Java的批量更新更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率lJDB
44、C的批量处理语句包括下面两个方法:addBatch(String):添加需要批量处理的SQL语句或是参数;executeBatch();执行批量处理语句;l通常我们会遇到两种批量执行SQL语句的情况:多条SQL语句的批量处理;一个SQL语句的批量传参;知识点24:批量处理JDBC语句提高处理速度 高级软件人才实作培训专家高级软件人才实作培训专家!多条SQL语句的批量处理lConnection con=null;lStatement stmt=null;ltry lcon=dbManager.getConnection();lstmt=con.createStatement();lString
45、sql=null;lLong begintime=System.currentTimeMillis();lfor(int i=1;i 5000;i+)lsql=insert into person(id,name,email)values(+,name+i+,email+i+);lstmt.addBatch(sql);lif(i+1)%1000=0)l/批量处理lint array=stmt.executeBatch();l/清除stmt中积攒的参数列表lstmt.clearBatch();l llLong endtime=System.currentTimeMillis();lSystem.
46、out.println(endtime-begintime)/1000);高级软件人才实作培训专家高级软件人才实作培训专家!一个SQL语句的批量传参Connection con=null;PreparedStatement pstmt=null;con=dbManager.getConnection();String sql=insert into person(id,name,email)values(?,?,?);Long begintime=System.currentTimeMillis();pstmt=con.prepareStatement(sql);for(int i=1;i10
47、0000;i+)pstmt.setInt(1,i);pstmt.setString(2,name“+i);pstmt.setString(3,email“+i);pstmt.addBatch();if(i+1)%1000=0)/批量处理pstmt.executeBatch();/清空pstmt中积攒的sqlpstmt.clearBatch();Long endtime=System.currentTimeMillis();System.out.println(endtime-begintime)/1000);高级软件人才实作培训专家高级软件人才实作培训专家!MySQL BLOB 类型介绍 lM
48、ySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。BLOB类型实际是个类型系列(TinyBlob、Blob、MediumBlob和LongBlob),除了在存储的最大信息量上不同外,他们是等同的。lMySQL的四种BLOB类型 l实际使用中根据需要存入的数据大小定义不同的BLOB类型。需要注意的是:如果你存储的文件过大,数据库的性能会下降很多。l有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求 知识点25:大对象操作 高级软件人才实作培训专家高级软件人才实作
49、培训专家!使用使用 JDBC JDBC 驱动程序处理元数据驱动程序处理元数据 lJava 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各有关数据库管理系统的各种信息种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。根据这些信息,JDBC可以访问一个事现事先并不了解的数据库。l获取这些信息的方法都是在DatabaseMetaData类的对象上实现的,而DataBaseMetaData对象是在Connection对象上获得的。知识点26:使用使用 JDBC 驱动程序处理元数据驱动程序处理元数据(什么是元数据
50、什么是元数据)高级软件人才实作培训专家高级软件人才实作培训专家!获取数据库元数据lDatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:getURL():返回一个String类对象,代表数据库的URL。getUserName():返回连接当前数据库管理系统的用户名。isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。getDatabaseProductName():返回数据库的产品名称。getDatabaseProductVersion():返回数据库的版本号。getDriverName():返回驱