1.jdbc 概念
管理JDBC驱动
Connection
负责连接数据库并担任传送数据的任务
Statement
由 Connection 产生、负责执行SQL语句
PreparedStatement
预编译sql,由 Connection 产生、负责执行SQL语句
CallableStatement
由 Connection 产生、负责执行SQL语句,执行存储过程
ResultSet
负责保存Statement执行后所产生的查询结果
3.Statement与PreparedStatement区别
Statement执行顺序
1.进行sql语法校验,语法错误就报错了
2.校验权限,权限不够报错
3.会从sql缓存区去找有没有这条sql
有就直接执行
没有就添加到缓存区,再执行
PreparedStatement
3.会减少添加缓存区sql的次数,条数。
区别:
1)Statement 执行相对于PreparedStatement来说会不安全
Statement 会有sql注入
例如输入账户密码登录时,用户多加了%:select *from user where username=%x% and password=%p%这样的话随时都可以 登录
PreparedStatement 可以预防sql注入
2)PreparedStatement效率高
推荐以后使用PreparedStatement。
4.把数据库的信息放到配置文件中 db.properties,用数据库连接池时,也可用xml文件(一般都是使用数据库连接池,常用的数据库连接池有c3p0,dbcp具体使用,可参照网上相关资料,也是需要相关的jar文件的)
dbcp
apache的产品
核心的类 :BasicDataSource
commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
http://commons.apache.org/proper/commons-pool/download_pool.cgi
c3p0
spring/hibernet
目前应用最广泛的。
有空闲自动回收链接功能
异步执行。
https://sourceforge.net/projects/c3p0/
核心的类:ComboPooledDataSource
配置文件:必须叫做 c3p0-config.xml
druid
tomcat配置连接池
5.批处理
addBatch 添加一条sql到Statement中。
executeBatch() 统一执行一组sql。
步骤:
1,获取对象
Statement
PreparedStatement : 创建这个对象的时候,传入的sql是可以为""空字符串的
2.添加一些sql的集合
addBatch
3.执行这些sql
executeBatch
6.获取自增长的值
connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
注意:Statement.RETURN_GENERATED_KEYS
获取返回的自增长id
ResultSet resultSet = prepareStatement.getGeneratedKeys();
7.大文本处理
1.txt.html,xml
mysql : text(64K),meduimtext(16M),longtext(4G)
oracle : clob
代码
写入:
FileReader reader = new FileReader(file);
prepareStatement.setClob(2, reader);
读出:
Clob clob = resultSet.getClob("description");
Reader reader = clob.getCharacterStream();
2.二进制,图片
mysql: blob,meduimblob,longblob
oracle:blob
代码
写入:
File file = new File("f:\\one.jpg");
FileInputStream inputStream = new FileInputStream(file);
prepareStatement.setBlob(2, inputStream);
读出:
Blob blob = resultSet.getBlob("img");
InputStream inputStream = blob.getBinaryStream();
8.时间处理
date 只存储年月日
time 只存储时分秒
timestamp 存储年月日时分秒
代码
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date date = format.parse("1982-07-29 12:00:00");
9.事务
概括
把一组sql放到一起去执行,要么都成功,要么都失败。
操作
提交
回滚
事务的特点
原子性
要么都成功,要么都失败
隔离性
事务与事务之间互不干扰
问题:
脏读
一个事务读取了另外一个事务未提交的数据
不可重复读
一个事务读取了另外一个事务已经更新的数据
幻读
一个事务读到了另外一个事务已经提交的插入数据
解决这些问题,就有事务的隔离级别
serializable 最高级别 不支持脏读,不支持不可重复读,不支持幻读(默认)
repeatable read 不支持脏读,不支持不可重复读,支持幻读
read committed 不支持脏读,支持不可重复读,支持幻读
read uncommitted 支持脏读,支持不可重复读,支持幻读
一致性
执行前和执行后结果应该一致
持久性
事务提交,保存到数据库
2.核心类
(用哪个数据库,就需用哪个数据库产商的连接jar文件)
管理JDBC驱动
Connection
负责连接数据库并担任传送数据的任务
Statement
由 Connection 产生、负责执行SQL语句
PreparedStatement
预编译sql,由 Connection 产生、负责执行SQL语句
CallableStatement
由 Connection 产生、负责执行SQL语句,执行存储过程
ResultSet
负责保存Statement执行后所产生的查询结果
3.Statement与PreparedStatement区别
Statement执行顺序
1.进行sql语法校验,语法错误就报错了
2.校验权限,权限不够报错
3.会从sql缓存区去找有没有这条sql
有就直接执行
没有就添加到缓存区,再执行
PreparedStatement
3.会减少添加缓存区sql的次数,条数。
区别:
1)Statement 执行相对于PreparedStatement来说会不安全
Statement 会有sql注入
例如输入账户密码登录时,用户多加了%:select *from user where username=%x% and password=%p%这样的话随时都可以 登录
PreparedStatement 可以预防sql注入
2)PreparedStatement效率高
推荐以后使用PreparedStatement。
4.把数据库的信息放到配置文件中 db.properties,用数据库连接池时,也可用xml文件(一般都是使用数据库连接池,常用的数据库连接池有c3p0,dbcp具体使用,可参照网上相关资料,也是需要相关的jar文件的)
dbcp
apache的产品
核心的类 :BasicDataSource
commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
http://commons.apache.org/proper/commons-pool/download_pool.cgi
c3p0
spring/hibernet
目前应用最广泛的。
有空闲自动回收链接功能
异步执行。
https://sourceforge.net/projects/c3p0/
核心的类:ComboPooledDataSource
配置文件:必须叫做 c3p0-config.xml
druid
tomcat配置连接池
5.批处理
addBatch 添加一条sql到Statement中。
executeBatch() 统一执行一组sql。
步骤:
1,获取对象
Statement
PreparedStatement : 创建这个对象的时候,传入的sql是可以为""空字符串的
2.添加一些sql的集合
addBatch
3.执行这些sql
executeBatch
6.获取自增长的值
connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
注意:Statement.RETURN_GENERATED_KEYS
获取返回的自增长id
ResultSet resultSet = prepareStatement.getGeneratedKeys();
7.大文本处理
1.txt.html,xml
mysql : text(64K),meduimtext(16M),longtext(4G)
oracle : clob
代码
写入:
FileReader reader = new FileReader(file);
prepareStatement.setClob(2, reader);
读出:
Clob clob = resultSet.getClob("description");
Reader reader = clob.getCharacterStream();
2.二进制,图片
mysql: blob,meduimblob,longblob
oracle:blob
代码
写入:
File file = new File("f:\\one.jpg");
FileInputStream inputStream = new FileInputStream(file);
prepareStatement.setBlob(2, inputStream);
读出:
Blob blob = resultSet.getBlob("img");
InputStream inputStream = blob.getBinaryStream();
8.时间处理
date 只存储年月日
time 只存储时分秒
timestamp 存储年月日时分秒
代码
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date date = format.parse("1982-07-29 12:00:00");
prepareStatement.setTimestamp(2, new Timestamp(date.getTime()));
9.事务
概括
把一组sql放到一起去执行,要么都成功,要么都失败。
操作
提交
回滚
事务的特点
原子性
要么都成功,要么都失败
隔离性
事务与事务之间互不干扰
问题:
脏读
一个事务读取了另外一个事务未提交的数据
不可重复读
一个事务读取了另外一个事务已经更新的数据
幻读
一个事务读到了另外一个事务已经提交的插入数据
解决这些问题,就有事务的隔离级别
serializable 最高级别 不支持脏读,不支持不可重复读,不支持幻读(默认)
repeatable read 不支持脏读,不支持不可重复读,支持幻读
read committed 不支持脏读,支持不可重复读,支持幻读
read uncommitted 支持脏读,支持不可重复读,支持幻读
一致性
执行前和执行后结果应该一致
持久性
事务提交,保存到数据库