什么是JDBC?
- JDBC为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。是java程序与数据库系统通信的标准API。JDBC API使得开发人员可以使用纯java的方式来连接数据库,并执行操作。
- sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此,sun公司决定,自己提供一套API,凡事数据库想与java进行连接的,数据库厂商自己必须实现JDBC这套接口。而数据库厂商的JDBC实现,我们就叫他此数据库的数据库驱动。
JDBC访问数据库流程
JDBC常用接口
Driver接口
- Driver接口由数据库厂商提供,对于java开发者而言,只需要使用Driver接口就可以了。
- 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库由不同的装载方法。
- 驱动:就是各个数据库厂商实现的Sun公司提出的JDBC接口。即对Connection等接口的实现类的jar文件
- 装载MySQL驱动
Class.forName("com.mysql.jdbc.Driver")
- 装载Oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver")
Connection接口
- Connection与特定的数据库连接(会话),在连接上下文中执行SQL语句并返回结果。
- DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上
- 连接MySQL数据库:
Connection con = DriverManager.getConnection("jdbc:mysql://host:port:database","user","password")
- 连接Oracle数据库
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database","user","password")
Statement接口
- 用于执行静态SQL语句并返回他所生成结果的对象。
- 三种Statement类
- Statement:由createStatement创建,用于发送简单的SQL语句。(不带参数的)
- PreparedStatement:继承自Statement接口,由prepareStatement创建,用于发送含有一个或多个输入参数的SQL语句。PrepareStatement对象比Statement对象的效率更高,并且可以防止SQL注入。我们一般都用PreparedStatement。
- CallableStatement:继承自PreparedStatement,由方法prePareCall创建,用于调用存储过程。
- 常用的Statement方法:
execute()
:运行语句,返回是否由结果集excuteQuery()
:运行select语句,返回ResultSet结果集。executeUpdate()
:运行insert,update,delete操作,返回更新的行数。
ResultSet接口
- Statement执行SQL语句时返回Result Set结果集。
- ResultSet提供的检索不同类型字段的方法,常用的有:
- getString():获得在数据库里是archer、char等数据类型的对象
- getFloat():获得在数据库里是Float类型的对象。
- getDate():获得在数据库里是Date类型的数据。
- getBoolean():获得在数据库里面是Boolean类型的数据。
依次关闭使用之对象及连接
- ResultSet➡️Statement➡️Connection
JDBC详细操作
- 灵活指定SQL语句中的变量:PreparedStatement
- 对存储过程进行调用:CallableStatement
- 运用事务处理:Transaction
- 批处理
- Batch
- 对于大量的批处理,建议使用Statement,因为PreparedStatement的预编译空间有限,当数据量特别大的时候,会发生异常。
事务
事务基本概念
- 一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元!
- 事务开始于:
- 连接到数据库上,并执行一条DML语句(INSERT、UPDATE或DELETE)。
- 前一个事务结束后,又输入了一条DML语句
- 事务结束于:
- 执行COMMIT或ROLLBACK语句。
- 执行一条DDL语句,例如CREATE TABLE语句;这种情况下会自动执行COMMIT语句。
- 执行了一条DCL语句,例如GRANT语句;这种情况下会自动执行COMMIT语句。
- 断开与数据库的连接。
- 执行了一条DML语句,该语句却失败了;这种情况下会自动执行COMMIT语句。
事务的四大特点(ACID)
- Atomicity(原子性):表示一个事务内所有的操作是一个整体,要么全部成功,要么全部失败。
- Consistency(一致性):表示一个事务内又一个操作失败时,所有的更改过的数据必须都回滚到修改之前的状态。
- Isolation(隔离性):事务查看数据所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一事务修改后的状态,事务不会查看中间状态的数据
- Durability(持久性):事务完成后,它对于系统的修改时永久性的。
事务隔离级别的从低到高
- 读取未提交(Read Uncommitted)
- 读取已提交(Read Committed)
- 可重复读(Repeatable Read)
- 序列化(Serializable)
时间类型
java.util.Date
- 子类:
java.sql.Date
表示年月日 - 子类:
java.sql.Time
表示时分秒 - 子类:
java.sql.Timestamp
表示年月日时分秒
- 子类:
- 日期处理比较
- 随机插入日期
- 取出指定日期范围内的记录
CLOB
- CLOB(Character Large Object)
- 由于存储大量的文本数据
- 大字段有些特殊,不同的数据库处理方式不同,大字段操作通常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
- MySQL中相关类型:
- TINYTEXT最大长度为 255(2^[8]-1)字符的TEXT列。
- TEXT最大长度为 65,5353(2^[16]-1)字符的TEXT列。
- MEDIUMTEXT最大长度为 16,777,215(2^[24]-1)字符的TEXT列。
- LONGTEXT最大长度为4,294,967,295或者4GB(2^[32]-1)字符的TEXT列。
BLOB
- BLOB(Binary Large Object)
- 由于存储大量的二进制数据
- 大字段有些特殊,不同的数据库处理方式不同,大字段操作通常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
- MySQL中相关类型:
- TINYTBLOB最大长度为 255(2^[8]-1)字符的TEXT列。
- BLOB最大长度为 65,5353(2^[16]-1)字符的TEXT列。
- MEDIUMBLOB最大长度为 16,777,215(2^[24]-1)字符的TEXT列。
- LONGBLOB最大长度为4,294,967,295或者4GB(2^[32]-1)字符的TEXT列。
ORM 基本思想
- ORM(Object Relationship Mapping)的基本思想
- 表结构跟类对应;表中字段和类的属性对应;表中记录和对象对应;
- 让javabean的属性名和类型尽量和数据库保持一致!
- 一条记录对应一个对象。将这些查询到的对象放到容器中(List,Set,Map)
- 将表中的一条记录封装到Object中
- 将表中的一条记录封装到map中
- 将表中的一条记录封装到javabean中