Java之JDBC
什么是JDBC
- JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。
- JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
- JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
获取JDBC链接
要想使用JDBC连接数据库,首先要有与数据库对应的驱动:
- Oracle的驱动:oracle.jdbc.driver.OracleDriver
- mySql的驱动: com.mysql.cj.jdbc.Driver
直接上代码:
// 连接信息
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "passwd";
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取链接
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
// 关闭链接
conn.close();
数据库操作
增删改
可以通过Statement
接口去操作数据库,但由于其存在一些问题,如SQL注入,所以我们都用PreparedStatement
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数,其中Xxx表示参数的类型,setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值,也可以使用通用的setObject
例如
// 连接信息
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "passwd";
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取链接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
// 定义sql语句
String sql = "insert into student(sno,sname,age) values(?,?,?)";
// 预编译sql
PreparedStatement ps = conn.prepareStatement(sql);
// 填充占位符,注意:从1开始
ps.setString(1, "1000");
ps.setString(2, "张三");
ps.setInt(3, 18);
// 执行sql
ps.execute();// 当执行select语句时,返回true,否则返回false
// 关闭资源
ps.close();
conn.close();
查
对于执行sql之前的部分,和增删改操作一样
使用executeQuery
,可以执行查询语句,同时获取查询结果,查询结果保存在ResultSet
对象中
使用ResultSet
对象的next方法,可以判断还有没有数据,有返回true,并将指针下移,没有就返回false
类似于SetXxx,使用GetXxx获取对于位置的字段值,也可以通过别名获取字段值
// 连接信息
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "passwd";
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取链接
Connection conn = DriverManager.getConnection(url, user, password);
// 定义查询
String sql = "select * from student where age<=?";
// 预编译sql
PreparedStatement ps = conn.prepareStatement(sql);
// 填充占位符,注意:从1开始
ps.setObject(1, 18);
// 执行查询语句,获取结果集
ResultSet resultSet = ps.executeQuery();
// 如果还有数据,next返回true,并将指针下移,否则返回false,指针不会下移
while (resultSet.next()){
// 获取一条数据里的字段,注意:从1开始
Object no = resultSet.getObject(1);
Object name = resultSet.getObject(2);
Object age = resultSet.getObject(3);
System.out.println("[no:"+no+" name:"+name+" age:"+age+"]");
}
// 关闭资源
ps.close();
conn.close();
ResultSetMetaData
ResultSetMetaData
类主要存放结果集的字段属性,使用结果集对象的getMetaData
可以获得ResultSetMetaData
对象
常用方法如下:
-
int getColumnCount()
:获取结果集的字段数
-
String getColumnName(int index)
获取结果集index位置的字段名(不是别名),同样index从1开始,不推荐使用
-
String getColumnLabel(int index)
获取结果集index位置的别名(如果没有起别名,获取的就是字段名),推荐使用
Java和SQL类型对应
Java类型 | SQL类型 |
---|---|
boolean | BIT |
byte | TINYINT |
short | SMALLINT |
int | INTEGER |
long | BIGINT |
String | CHAR,VARCHAR,LONGVARCHAR |
byte array | BINARY , VAR BINARY |
java.sql.Date | DATE |
java.sql.Time | TIME |
java.sql.Timestamp | TIMESTAMP |
PreparedStatement对象常用方法
-
executeUpdate():返回更新数据的条数,如果是查询,则返回0
-
addBatch()
,executeBatch()
,clearBatch()
:这几个是用来进行批处理的,功能分别是:添加sql到缓存中,执行缓存中所有的sql,清空缓存。注意:在使用这几个之前,由于mysql默认是不支持进行批处理操作的,需要修改连接url,让其支持,在url后添加参数
rewriteBatchedstatements=true
,例如jdbc:mysql://localhost:3306/test?rewriteBatchedstatements=true
Connection对象常用方法
setAutoCommit(boolean autoCommit)
:设置是否自动提交,默认是true。当需要进行批处理操作时,可以关闭自动提交,如conn.setAutoCommit(false)
,当所有sql都执行完成后,再调用conn.commit()
一次性提交(写入数据库),这样可以提高效率,但有风险commit()
:提交数据rollback()
:回滚数据