1.JDBC执行存储过程
1)MySQL
2)Oracle
得到CallableStatement,调用存储过程
CallableStatement cs = conn.prepareCall(...)
设置参数,注册返回值,得到输出
cs.registerOutParameter(...);
cs.execute();
cs.getXXX(...);
Types定义用于标识一般 SQL 类型(称为 JDBC 类型)的常量的类。
Connection ----> Statement, PreparedStatement, CallableStatement ---> ResultSet
2.获得数据库自动生成主键
1)MySQL
2)Oracle
ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
试验:insert以外的
3.结果集ResultSet
next, previous, absolute(...), beforeFirst(), afterLast()
注意:利用结果集的滚动实现分页时,由于需要把表中所有数据先拿到resultset中,
数据量大时对内存的消耗太多,因此不推荐采用此种方案。
4.数据库分页
1)MySQL中:
select * from table limit M,N;
M:记录开始索引位置
N:取多少记录
2)Oracle中:
select * from (
select rownum r_, row_.* from (
select * from student order by id
) row_ where rownum<=5
)where r_>=0;
0位置:起始索引位置。
5位置:结束索引位置。
5.批处理
st.addBatch(sql)不同sql语句
ps.addBatch() 相同sql语句,参数不同
executeBatch()
clearBatch()
想MySQL和Oracle中分别插入数量很到的记录,对比时间
批处理插入数据的时候,要适当分批,
不用全部作为一批,那样数据库受不了
改变JVM的内存默认值64M:java ---> -xmxn
6.LOB(Large Objects)大对象:二进制数据和文本数据
Clob 和 Blob
1)MySQL
Text和Blob(longblob)
ps.setCharacterStream(index, reader, length);
reader = rs.getCharacterStream(i);
reader = rs.getClob(i).getCharacterStream();
string = rs.getString(i); //不好,一次性将数据拿到内存
ps.setBinaryStream(i, is, length)
is = rs.getBinaryStream(i);
is = rs.getBlob(i).getBinaryStream();
2)Oracle
Oracle中定义了blob字段,但不能用它存放真正的二进制数据,
只能向这个字段存放一个指针,然后把数据放到指针所指向的Oracle的lob
因而在操作Oracle的Blob之前,必须获得指针(定位器)才能进行Blob数据的读取和写入
empty_blob() empty_clob()
步骤:
1、插入空blob insert into test(id,image) values(?,empty_blob());
2、获得blob的cursor select image from test where id= ? for update; 注意: 须加for update,锁定该行,直至该行被修改完毕,保证不产生并发冲突。
3、利用 io,和获取到的cursor往数据库读写数据
注意:以上操作需开启事务。
7.使用JDBC操作多个实体
部门和员工(一对多)
部门 : 有多个员工
员工 : 属于一个部门
在面向对象中:对称的 你有我 我有你
在关系型数据库中:不对称的,在数据库中,两个表之间的关系是通过外键(不考虑非等值连接)
addBatch,获得数据主键自动增长的值
save :更新两个表
find : 查两个表,因为department中有employee的set集合