一、JDBC
execute() 方法,select操作返回true,其他操作返回false
executeUpdate()方法,返回影响的行数(数量)。(一般只写增、删、改)
executeQuery()方法返回 ResultSet
1、ResultSet 里面的游标,初始值在 -1位置,最后一行的时候若继续操作移动,会移动失败,返回false,且游标不动。
2、ResultSet 里面的 getXXX(int 字段的索引) 此方法索引从1开始而不是0.
二、工厂设计模式(静态工厂方法模式)
工厂方法模式一种创建对象的模式.
工厂方法模式基于“输入”,应用在超类和多个子类之间的情况,这种模式将创建对象的责任转移到工厂类,
工厂设计模式的优点:
- 面向接口编程,体现了面向对象的思想
- 降低了耦合,将创建对象的工作转移到了工厂类
工厂代码案例:
1、水果接口:
public interface Fruit {
void eat();
}
2、苹果(水果的一种,实现了水果)
public class Apple implements Fruit{
@Override
public void eat() {
System.out.println("苹果吃起来甜甜的脆脆的。");
}
}
3、香蕉(水果的一种,实现了水果)
public class Banana implements Fruit{
@Override
public void eat() {
System.out.println("香蕉吃起来软软的甜甜的。");
}
}
4、静态工厂类
public class FruitFactory {
public static Fruit get() {
// return new Apple();
return new Banana();
}
}
5、Demo类(业务逻辑)
public class Demo {
public static void main(String[] args) {
// 即使删除 Banana 类, 也只会是工厂报错, Demo 里面的代码,也不会报错。
Fruit fruit = FruitFactory.get();
fruit.eat();
}
}
三、DAO
DAO (Data Access object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
为了建立一个健壮的Java应用,应该将所有对数源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。
DAO模式是标准的JavaEE设计模式之一·开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开.
一个典型的DAO实现有下列几个组件:
- —个DAO工厂类
- —个DAO接口
- 至少一个实现DA0接口的具体类;
- 数据传递对象(有些时候叫做Bean对象) (Bean对象中全部属性私有,仅有各构造方法(无参构造必须存在)、get、set、eqauls、hashcode、toString等,没有任何业务逻辑存在,符合要求就可以视为Bean对象)
四、事务
概述:将多条SQL语句,看作一个整体(原子性)。要么一起成功,要么一起失败。
事务在mysql中,是默认自动提交的。
操作方式1:命令行
开启事务: start transaction;
回滚: rollback; -- 放弃此次事务中所有的 sql 操作
提交: commit; -- 提交此次事务中所有的 sql 操作
操作方式2:Java
JDBC事务通过连接对象开启,回滚,提交。只针对当前连接对象有效。
开启事务: conn.setAutoCommit(false); -- 尽可能晚地开启事务
回滚: conn.rollback(); -- 放弃此次事务中所有的 sql 操作
提交: conn.commit(); -- 提交此次事务中所有的 sql 操作
事务面试题:
1, 请描述事务的四大特征:
<1>. 原子性: 事务是一个整体,不可分割,要么同时成功,要么同时失败.当
<2>. 持久性:事务提交或回滚后,数据库会持久化的保存数据.
<3>.隔离性:多个事务之间,隔离开,相互独立
<4>. 一致性: 事务的操作前后,数据总量不变。(eg,转账时:张三给李四转账是一个事务,转账完毕后,两人的余额的和不变)
2.请描述什么是脏读,幻读,不可重复读?
脏读:读取到了一个事务未提交的数据
不可重复读:一个事务中,两次连续的读取,结果不一致(中间被其它事务更改了).
幻读:一个事务A在执行DML语句时,另一个事务B也在执行DML语句, B修改了A修改过的数据,导致A在查询时就像发生了幻觉一样(A更改的内容A看不到了.)
3. 请描述事务的隔离级别
三种级别的锁: 页级、表级、行级(共享锁:允许事务读一行;排它锁:允许事务删除或更新一行数据)。
1, 读未提交: read uncommitted; (可能产生:脏读,不可重复读,幻读) # 这就跟没事务一样,性能最高
2. 读已提交: read committed; (可能产生:不可重复读,幻读) # 只能读到已提交的
3, 可重复读: repeatable read; (mysql默认值) (可能产生:幻读) #
4.串行化:serializable;
-- 查看数据库当前的隔离级别: select @@tx_isolation; (了解)
-- 数据库设置隔离级别: set global transaction isolation level 级别字符串; (了解)
五、批处理
Statement对象使用流程:
1、得到Statement对象
Statement state = conn.createStatement();
2、将一条SQL语句,加入到批处理当中
state.addBatch(String sql);
3、执行批处理
state.executeBatch();
4、清空批处理
state.clearBatch();
PreparedStatement对象使用流程:
1、得到PreparedStatement对象:
PreparedStatement state = conn.prepareStatement("预编译的SQL");
2、填充预编译的参数
state.setXXX(1,填充参数);
3、将一条参数已经填充完毕的SQL,加入到批处理中。
state.addBatch();
4、执行批处理
state.executeBatch();
5、清空批处理
state.clearBatch();
注:
批处理里面,实际上是一行一行在执行我们add进去的语句,所以它返回的数字对应的是,我们加进去的语句,影响了多少行。即:如果每一条语句都只影响一行的话,返回的 int[] 里面全都是 数字1。