readmehtml
1.JDBC的简介:SUN公司提供,操做数据库的一套规范(一组接口),实现类是数据库的生产商。 2.驱动包提供的,使用什么数据库,相应的驱动包(jar包) 3.JDBC开发的入门步骤 * 注册驱动 -- DriverManager * 获取连接 -- Connection * 获取执行SQL语句 -- Statement (PreparedStatement -- 预编译) * 若是有查询结果 -- ResultSet * 释放资源 4.DriverManager * 注册驱动 * Class.forName("com.mysql.jdbc.Driver"); * 获取连接 * getConnection(url,username,password) * url: jdbc:mysql://localhost:3306/数据库 5.Connection接口 * 获取执行SQL对象 * Statement * PreparedStatement -- 预编译 防止SQL注入 * 管理事物 * set autocommit(false) -- 设置事物不自动提交 * commit() -- 提交 * rollback() -- 回滚 6.Statement接口 * 执行SQL * executeQuery(sql) -- 查询语句(ResultSet) * executeUpdate(sql) -- 执行增删改语句(int) * 批处理 7.ResultSet接口 * 有一个游标默认指向第一行数据以前。 * 默认只能向下移动(rs.next()) * 获取数据 (getXXX(int) getXXX(String)) * 设置滚动的结果集 8.释放资源 * 步骤 9.DAO的开发模式 * SUN提供的开发模式 * WEB层 -- 业务层 -- 持久层 10.登录的案例(SQL注入) * 产生:拼接SQL的字符串 * PreparedStatement -- 编写SQL语句的时候使用?占位符代替的参数,预编译 11.PreparedStatement完成DAO单表的增删改查的操做 12.MyJdbcUtil的工具类 * 注册驱动 * 获取连接 * 释放资源 13.大数据 14.批处理
事物java
1.什么是事物:一组逻辑上的操做,要么全都成功,要么全都失败。 2.模拟事物的操做 create database day18; use day18; create table t_account( id int primary key auto_increment, username varchar(30), money double ); insert into t_account values (null,'聪聪',10000); insert into t_account values (null,'美美',10000); insert into t_account values (null,'小凤',10000); insert into t_account values (null,'如花',10000); insert into t_account values (null,'邦邦',10000);
MySQL使用事物mysql
1.在MySQL使用命令 start transaction; -- 开启一个事物 sql1... sql2... commit; -- 把事物提交了 rollback; -- 把事物回滚了 2.MySQL数据库中国,事物是默认提交的。 * show variables like '%commit%'; 能够经过该命令查看数据库是事物是不是默认提交的。 * 设置MySQL不让默认提交的 (set autocommit = off或者0;) sql1.. sql2.. commit; -- 把事物提交了 rollback; -- 把事物回滚了 3.进行测试 * 第一种方式 * 开启事物 * start transaction; * update t_account set money = money - 1000 where username = '聪聪'; * update t_account set money = money + 1000 where username = '美美'; * 提交或者回滚 * commit; 或者 rollback; * 测试第二种 * 设置MySQL不让默认提交 * set autocommit = 0或者off; * update t_account set money = money - 1000 where username = '聪聪'; * update t_account set money = money + 1000 where username = '美美'; * 提交或者回滚 * commit; 或者 rollback;
JDBC代码中使用事物git
1.哪一个对象能够操做事物?使用Connection接口操做事物。 * void setAutoCommit(boolean autoCommit) -- 设置默认不默认提交 * void commit() -- 提交事物 * void rollback() -- 回滚事物
保存点github
1.Savepoint sp = conn.setSavepoint(); 2.conn.rollback(sp); 3.回滚到保存点的位置,事物没有结束,必须还要提交或者回滚事物才结束。
事物的特性(面试)web
1.原子性 :强调事物的不可分隔特性。 2.一致性 :强调数据的完整性保存一致。 3.隔离性 :强调是的一个事物的执行,不该该受到另外的事物的打扰。 4.持久性 :强调是事物结束(提交或者回滚),数据永久的保存到数据库中。
不考虑隔离性,产生一些问题面试
1.脏读 :一个事物读取到了另外一个事物未提交的数据 2.不可重复读 :一个事物度读取了(10000),另一个事物作了修改的操做,提交了。第一个事物又作了一次查询,此次的查询结果变成了12000,产生了不可重复读。只要是在一个事物中,屡次的查询结果必须是一致的。 3.虚读(幻读) :一个事物度读取了(10000),另一个事物作了插入的操做,提交了。第一个事物又作了一次查询,此次的查询结果变成了12000,产生了不可重复读。只要是在一个事物中,屡次的查询结果必须是一致的。
设置事物的隔离级别sql
1.read uncommitted :未提交读 脏读、不可重复读、虚读均可能发生 2.read committed :提交读 避免脏读,可是不可重复读和虚读有可能发生 3.repeatable read :可重复读 避免脏读和不可重复读,可是虚读有可能发生 4.serializable :避免脏读、不可重复读、虚读 * 安全性:read uncommitted < read committed < repeatable read < serializable * 效率:read uncommitted > read committed > repeatable read > serializable * 在数据库的设置隔离级别中,根据安全性和效率考虑,确定不会用read uncommitted和serializable * 在MySQL中默认的隔离级别:repeatable read * 在Oracle中默认的隔离级别:read committed
演示上述过程的发生和解决方案数据库
* 查询数据库的隔离级别 select @@tx_isolation * 设置数据库的隔离级别 set session transaction isolation level XXX; (XXX表明上述4种级别) 1.测试脏读 2.开启两个窗口A窗口和B窗口 3.分别登录MySQL数据库,使用day18数据库。 4.设置隔离级别 * set session transaction isolation level read uncommitted; 5.在AB两个窗口中分别开启事物 * start transaction; 6.在B窗口中完成一些操做(转帐的操做) * update t_account set money = money - 1000 where username = '聪聪'; * update t_account set money = money + 1000 where username = '美美'; * 提交了吗?没有提交!! 7.在A窗口作查询的操做 * select * from t_account; 8.产生了脏读
避免脏读和演示不可重复读canvas
1.设置A窗口的隔离级别 * set session transaction isolation level read committed; 2.在AB两个窗口中分别开启事物 * start transaction; 3.在B窗口中完成一些操做(转帐的操做) * update t_account set money = money - 1000 where username = '聪聪'; * update t_account set money = money + 1000 where username = '美美'; 4.在A窗口中 * select * from t_account; 5.避免了脏读,产生了不可重复读
避免不可重复读
1.设置A窗口的隔离级别 * set session transaction isolation level repeatable read; 2.在AB两个窗口中分别开启事物 * start transaction; 3.在B窗口中完成一些操做(转帐的操做) * update t_account set money = money - 1000 where username = '聪聪'; * update t_account set money = money + 1000 where username = '美美'; 4.在A窗口中 * select * from t_account; 5.在A窗口中,结束事物,在作查询 * 查询的结果是最新的结果 6.总结:避免了脏读和不可重复读
演示serializable隔离级别
1.设置A窗口的隔离级别 * set session transaction isolation level serializable; 2.在AB两个窗口中分别开启事物 * start transaction; 3.在B窗口中添加一条数据 * insert into t_account values (null,'冠西',10000); 4.在A窗口中作查询的操做 * select * from t_account;
在JDBC中设置隔离级别(了解)
* 在在Connection接口中提供了常量,这写常量分别表明不一样的隔离级别 static int TRANSACTION_READ_UNCOMMITTED :指示能够发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。 static int TRANSACTION_READ_COMMITTED :指示不能够发生脏读的常量;不可重复读和虚读能够发生。 static int TRANSACTION_REPEATABLE_READ :指示不能够发生脏读和不可重复读的常量;虚读能够发生。 static int TRANSACTION_SERIALIZABLE :指示不能够发生脏读、不可重复读和虚读的常量。 * 经过方法来进行设置,在Connection接口提供了一个方法 * void setTransactionIsolation(int level)
数据库链接池
1.为何要有链接池:建立和销毁是销毁时间的,链接池初始化的时候建立几个链接。 二、链接池池参数(开发自定义的链接池) 初始大小:10个 最小空闲链接数:3个 增量:一次建立的最小单位(5个) 最大空闲链接数:12个 最大链接数:20个 最大的等待时间:1000毫秒 2.使用链接池设置4个大参数(用户给出) * 驱动类的包名+类 com.mysql.jdbc.Driver * url jdbc:mysql:///day18 * username root * passowrd root 3.怎么使用链接池对象 * 获取连接的方法
自定义数据库链接池
1.实现DataSource接口 2.重写几个方法。 3.自定义的数据库的链接池存在哪些问题? * 开源的链接池解决这一类的问题。 4.不能使用DataSource接口构造 5.归还连接的方法 public void addBack(Connection conn){ // 添加到集合中 connlist.add(conn); } 6.若是能把close()加强了,变成归还的方法
装饰者模式(加强某个类中的方法)
1.目的:加强某个类中的某个方法,有哪些方式? * 继承 :你须要知道它爹是谁? * 装饰者的模式(加强Connection接口的实现类(还不知道名字,起个名字 小聪),中的close()方法) * 加强的类(本身来写)和被加强的类(小聪)必须实现相同的接口。 * 在加强的类中能获取到被加强类的引用。 * 动态代理
开源数据库链接池
1.这些开源的链接池已经加强了close方法,所有都是归还。
DBCP链接池
1.导入jar包。 * commons-dbcp-1.4.jar * commons-pool-1.5.6.jar 2.开发入门 * 须要手动设置连接的参数(必须得设置4大参数) * BasicDataSource * 读取配置文件的方式(properties文件) * BasicDataSourceFactory 3.其余的配置文件(课后看)
C3P0链接池
1.导入jar包 * c3p0-0.9.1.2.jar 2.使用 * ComboPooledDataSource * 设置参数 3.C3P0默认读取一个XML的配置文件(c3p0-config.xml),文件存放在src的目录下。 4.在c3p0-config.xml文件编写配置(4大参数)
Tomcat内置链接池(配置)
1.介绍Tomcat内置在链接池。Tomcat管理链接池,只要配置信息。 2.介绍<Context>的配置某个位置 tomcat/conf/context.xml -- 被tomcat下的全部的虚拟主机、虚拟路径访问. tomcat/conf/Catalina/localhost/context.xml -- 被tomcat下的localhost虚拟主机下的全部虚拟路径访问. 工程下/META-INF/context.xml -- 被当前工程所访问. 3.在context.xml须要配置什么内容? <Context> <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" username="root" password="123" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql:///day18" maxActive="8" maxIdle="4"/> </Context> 4.将mysql驱动包copy到tomcat/lib下 5.类必须是运做在Tomcat容器中才能够访问.Servlet/JSP
事物加在service或者DAO层
1.事物的解决方案有两种 * 经过参数的方式向下传递 * 把conn绑定到当前的线程中 2.ThreadLocal类底层维护Map集合。默认把当前的线程做为Map的key。