一、事物处理

事物是数据库中保证消息可靠的机制
JDBC支持数据库中的事物概念,实际上就是调用数据库的事物

满足如下四个特征的数据库访问叫做事物:
原子性(Atomicity):事物必须是原子工作单元,对于其数据修改,要么全部执行,要么全都不执行
一致性(Consistency):事物在完成时,必须使所有的数据都保持一致状态
隔离性(Isolation):由并发事物所做的修改必须与任何其它并发事物所做的修改隔离,事物过程中的数据不能被他人访问
持久性(Durability):事物完成后,它对于系统的影响是永久性的

在JDBC中,事物默认是自动提交的,使用executeUpdate()时,它会自动调用数据库的COMMIT,也可以设置为手动提交。设置手动提交步骤为:
1.关闭自动提交
2.手动提交
3.手动回退

Connection.getAutoCommit() 获得当前事物的提交方式,默认为true
Connection.setAutoCommit() 设置事物的提交属性,参数为true自动提交,false不自动提交
Connection.commit() 提交事物
Connection.rollback() 回退事物

二、批量更新

批量添加要注意:
1.保证事物
2.使用PreparedStatement,批量提交数据,通过addBatch和executeBatch,从而减少提交次数
3.分批次插入

addBatch() PreparedStatement类的方法,可以将当前设置的参数存入PS
executeBatch() 把Statement对象或PreparedStatement存的参数一起提交给DB
clearBatch() 清空当前SQL语句列表

ps设置参数时,若设置的方法为setInt/setDouble等,不能传入null,如果一定要设置为null,使用setObject方法。

如果PS对象的SQL列表包含过多待处理的SQL语句,可能会产生OutOfMemory错误,所以要及时处理SQL语句列表

三、返回自动主键

方法一,先通过序列的nextval获取序列的下一个值,再作为参数插入到主表和从表

1
2
3
String sql = "select dept_seq.nextval as id from dual";
String sql1 = "insert into dept(deptno, name ,loc) values (?,?,?)";
String sql2 = "insert into emp(empno, ename, deptno) values (?,?,?)";

这种方法需要多访问一次数据库,影响性能

方法二,利用PS的getGeneratedKeys方法获取自增类型的数据,只要一次SQL交互
(1)创建ps时传入它需要记录的字段名,通常只要一个id即可
(2)在执行完后,调用ps的getGeneratedKeys()获取一个结果集,该结果集中记录的就是第一步中指定那个字段的值
(3)该结果集中只有一条数据,直接从结果集中把这条数据读取过来,并获取生成的id值

1
2
3
4
5
6
7
8
String sql1 = "insert into dept(deptno, name ,loc) values (dept_seq.nextval,?,?)";
stmt = con.prepareStatement(sql, newString[] {"deptno"});
stmt.setString(1, "");
stmt.setString(2, "");
stmt.executeUpdate();
rs = stmt.getGeneratedKeys();
rs.next();

int deptno = rs.getInt();

四、分页查询

实现分页查询有两种方式:
1.真分页(物理分页)
使用分页的SQL实现分页
每次只向数据库请求一页的数据量
内存压力小,适合大数据量数据表
2.假分页(缓存/内存分页)
不使用分页sql,而是直接查出全部数据,然后使用java在内存中找到当前页的数据
只访问数据库一次,第一次取数据比较慢,以后每次都从缓存中获取,比较快
比较适合小数据量,如果数据量大,对内存压力大

Oracle实现方式:

1
2
3
4
5
6
7
8
9
10
11
int begin = (page - 1) * pageSize + 1;
int end = page * pageSize;
String sql = "select * from (
select e.* ,rownum r from (
select * from amps order by empno
) e
) where r between ? and ?";
stmt = conn.preparedStatement(sql);
stmt.setInt(1,begin);
stmt.setInt(2,end);
rs = stmt.executeQuery();

MySQL实现方式:

1
SELECT * FROM t limit begin,pageSize

五、DAO

DAO Data Access Object 数据访问对象
目的:数据访问逻辑和业务逻辑分开

DAO通常包括:
1.一个DAO工厂类
2.一个DAO接口
3.一个实现DAO接口的具体类

表和类对应
表中的字段和类的属性对应
记录和对象对应

实体对象规范:
1.通常实体类和表名一致
2.首字母大写
3.实现序列化接口
1)可以将对象保存在硬盘上
2)可以将对象在网络上传输
4.要有公有的get/set方法
5.通常都使用封装类型,以支持null

DAO类规范:
1.命名通常以表名开头,Dao结尾
2.通常一个表对应一个Dao,且该Dao下写这个表的增删改查方法