jdbc-notes
JDBC
驱动类加载
1 | Class.forName("com.mysql.cj.jdbc.Driver"); |
Connection
与特定数据库的连接(会话)。 执行SQL语句并在连接的上下文中返回结果。
Connection对象的数据库能够提供描述其表,其支持的SQL语法,其存储过程,此连接的功能等的信息。
1 | Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4", "deltav", "testpass"); |
Statement接口
用于向数据库提交SQL语句
Statement
1 | Statement statement = connection.createStatement(); |
使用addBatch(SQL)批量添加数据到Statement对象中,使用executeBatch()将所有SQL在数据库中执行。
为了提高数据插入效率,可以禁用该Connection的autocommit(connection.setAutoCommit(false);),在所有SQL执行完后再commit(connection.commit();)。注意: 一个事务无法执行太对SQL,事务自动提交禁用后需要手动提交。
PreparedStatement
setDate()中的参数为java.sql.Date类型
java.sql.Date为java.util.Date的子类
PreparedStatement类对象在实例化时就需要提供SQL,随后通过setter方法替换占位符(setter方法中的索引从1开始),最后调用execute()方法提交该SQL。
1 | String sql = "insert into TABLE_NAME (...) values (?, ?, ?, ...)"; |
注意:PreparedStatement只能替换字段的值,而不能替换字段名和表名,因为其会在问好两侧添加单引号,即占位符只能替换为字符串,如select * from ? where ?=? ==> select * from 'table' where 'field'='value'; 字段的值使用字符串是合法的,即使字段的真实数据类型不是字符串类型。而表名和字段名在SQL中不能使用字符串表示(引号引起)。
ResultSet
- 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
- ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。类似迭代器的使用。
- 使用getter方法通过字段索引获,取游标所在行的对应字段的值。
Transaction
MySQL默认自动提交DML语句,使用connection.setAutoCommit(false);来禁用自动提交,需要提交时使用connection.commit()和connection.rollback()来回滚。
Clob & Blob
Character Large Object and Binary Large Object
数据库中用于存储大量的字符和二进制数据。
JDBC中setClob()``setBlob()需要提供一个输入流,来向数据库写入数据。getClob()``getBlob()用来读取数据库中数据。这两个函数会返回一个Clob、Blob对象,再通过该对象来获取输入流。
Time & Date
PreparedStatement中使用setDate() setTimestamp()等替换SQL中的占位符,这些方法需要java.sql.Date``java.sql.Timestamp类型的参数。
数据的封装
1. Object[]
使用Object[]数组封装一条数据,再将Object数组添加至List中,实现多条数据的封装。
2. Map
一个Map对象封装一条记录,key为字段名,value为值,将Map添加至List或Map(key为主键)中,封装多条数据。
3. javabean
使用一个对象保存一条数据,数据库中的字段对应javabean中的私有属性,并提供setter和getter方法,及构造器。