1 jdbc入门
1.1 简介
使用java程序访问(操作)数据库(发送sql语句),这叫用到了jdbc技术!!!!
1.2 使用java程序访问数据库的前提
1)先登录到数据库:
数据库的主机地址(ip地址)
端口
数据库用户名
数据库用户密码
连接的数据库
2)发送sql语句
连接数据库的三种方式
(1)通过驱动driver类来连接数据库;
(2)通过DriverManager,注册Driver,来连接数据库;
(3)通过反射Driver,加载Driver里面的静态代码块,实现自动注册Driver,在DriverManager连接数据库
1.3 Jdbc的核心api
|-Driver接口: 驱动程序接口。
|-Connection connect() 用于连接数据库的方法
可以使用驱动程序管理类获取连接:
DriverManager.getConnection(url,user,pasword);
|-Connection接口: 代表和数据库的连接
|- Statement createStatement() 创建Statement接口的对象。
|- PreparedStatement prepareStatement(String sql) 创建PreparedStatement接口的对象。
|- CallableStatement prepareCall(String sql)创建CallableStatement接口的对象。
|-Statement接口:用于执行静态 SQL 语句。
|- int executeUpdate(String sql) 执行DDL和DML语句(更新sql语句)
|- ResultSet executeQuery(String sql) 执行DQL语句(查询sql语句)
|-PreparedStatement接口:用于执行预编译的 SQL 语句
|- int executeUpdate():执行DDL和DML语句(更新sql语句)
|- ResultSet executeQuery() 执行DQL语句(查询sql语句)
|-CallableStatement接口: 用于执行存储过程的SQL语句
|- ResultSet executeQuery() 存储过程只能执行查询sql
设置输出参数registerOutParameter(); 获取输出参数getXXX();
|-ResultSet接口: 表示数据库结果集。
|- boolean next() 将光标移至下一行
|- getXXX(): 获取结果集中的每列的值
1.4 jdbc操作步骤
1)注册驱动程序
2)获取连接对象
3)准备sql语句(DDL+DML)
4)创建Statement对象( Statement,PreparedStatment,CallableStatement)
5)执行sql语句
DDL+DML: executeUpdte(sql)
DQL; executeQuery()
6)返回结果,处理结果
ResultSet
7)关闭资源
2 使用Statement执行sql语句
3 使用PreparedStatement执行SQL语句
Statement vs PreparedStatement
语法不同:
1)Statement只能执行静态的sql语句
2)PreparedStatement即可以执行静态sql语句,也可以执行预编译sql语句
安全性不同:
1)Statement可以被用户进行sql注入
2)PreparedStatement不能被用户注入sql,比Statement更安全!!
执行效率问题:
1)Statement不能利用数据库sql缓存功能
2)PreparedStatement可以利用数据库sql缓存功能。比Statement的执行效率更高的!!
结论:建议尽量使用PreparedStatment。
4 优化jdbcUtil工具类
使用类路径读取jdbc.properties文件
-------------------------------------------------------------------------------------------------
1 jdbc执行批处理
1.1 引入
之前:使用jdbc每次只能发送1条sql语句,如果同时执行2000次插入,向数据库服务器发送2000条 插入语句,这种做法的效率不高!
现在:使用jdbc的批处理执行2000次插入,但每次向数据库的服务器发送20条sql,一共只需要发送100次就可以了!那么这种的做法的效率会比之前的做法高!!!
批处理:一次发送多条SQL语句
1.2 批处理的API
Statement的批处理:
void addBatch(String sql) 把sql添加到缓存区中(没有发送的)
int[] executeBatch() 执行批处理缓存中sql语句(发送到数据库执行)
void clearBatch() 清空缓存区sql语句
PreparedStatement的批处理:
void addBatch() 把参数添加到缓存区中
int[] executeBatch() 执行批处理缓存中所有参数(发送到数据库执行)
void clearBatch() 清空缓存区参数列表
2 Jdbc处理大容量数据
2.1 什么是大容量
字符:
存储字符内容: mysql:char varchar长度有限的。65535
大容量的字符字段:
mysql:text longtext(4G字符内容)
oracle : clob longclob
字节:
mysql:blob(65kb)mediumblob(16mb)longblob(4GB)
oracle: blob
3 Jdbc获取自增长的值
4 事务
4.1 数据库事务
innoDB数据库类型: 支持事务。
MyISAM: 不支持事务,但执行效率高。
set autocommit=0;
commit;
rollback;
4.2 jdbc事务
Connection.setAutoCommit(false); 开启事务
Connection .commit(); 提交事务
Connection.rollback(); 回滚事务
4.3 事务的四大特性(ACID)
原子性:一个事务的操作要么一起成功,要么一起失败!
一致性: 在一个事务执行后,数据库从一个一致性的状态转变为另一个一致性。
隔离性: 多个事务并发过程中,希望能够相互隔离的。
多个事务在并发产生以下的现象:
脏读: 一个事务读到了另一个事务没有提交的数据
不可重复读:一个事务读到了另一个事务已经提交的更新数据(update)
幻读: 一个事务读到了另一个事务已经提交的插入数据(insert)
数据库可以设置不同的隔离级别来防止以上现象:(是否能够防止现象)
脏读 不可重复读 幻读
read uncommitted: 否 否 否
read committed: 是 否 否
repeatable-read: 是 是 否
serializable: 是 是 是
持久性: 事务一旦提交,应该永久保存下来