一、JDBC概述
- 数据库驱动
所谓数据库驱动就是数据库厂商提供连接数据库的jar包。
开发人员只需要导入数据库驱动包就可以通过该驱动包提供的api来接并操作数据库。
不同的数据库的驱动包互不兼容,需要操作什么数据库就要导入该数据库的驱动包。 - JDBC
由于不同的数据库厂商提供的数据库驱动各不相同,在使用不同数据库时需要学习对应数据库驱动的api,对于开发人员来说学习成本十分的高。
于是sun提供了JDBC的规范,本质上一大堆的接口,要求不同的数据库厂商提供的驱动都实现这套接口,这样以来开发人员只需要学会JDBC这套接口,所有的数据库驱动作为这套接口的实现,就都会使用了。 - JDBC相关包
JDBC主要是由 java.sql 和javax.sql包组成的,这两个包已经被集成到J2SE的规范中了,这意味着,只要一个普通的java程序就可以使用JDBC。
要注意的是,在开发数据库程序时,除了如上的两个包,还需要手动的导入具体的数据库驱动。
二、JDBC详解
- 入门案例
a.准备
create database mydb4;
use mydb4;
create table user(
id int primary key auto_increment,
name varchar(20),
age int,
addr varchar(20)
);
insert into user values (null,'aaa',19,'bj');
insert into user values (null,'bbb',29,'sh');
insert into user values (null,'ccc',32,'gz');
insert into user values (null,'ddd',24,'sz');
insert into user values (null,'eee',26,'tl');
b.导入数据库驱动包
c.代码实现
@Test
public void test01() throws SQLException {
//1.注册数据库驱动
DriverManager.registerDriver(new Driver());
//2.获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb4","root","root");
//3.获取传输器
Statement stat = conn.createStatement();
//4.执行sql获取结果集
ResultSet rs = stat.executeQuery("select * from user");
//5.遍历结果集获取数据
while(rs.next()){
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name+"~"+age);
}
//6.关闭资源
rs.close();
stat.close();
conn.close();
}
- JDBC细节
a.注册数据库驱动
数据库驱动包会自动在类加载时注册驱动
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
所以不要手动注册数据库驱动,会造成驱动的重复注册
DriverManager.registerDriver(new Driver());
改为使用类加载方式注册
Class.forName("com.mysql.jdbc.Driver");
b.获取数据库连接
获取数据库连接时要通过数据库地址指定要连接的数据库位置
不同的数据库地址的写法是不同的
MySql | jdbc:mysql://localhost:3306/sid?xxx=xx |
---|---|
Oracle | jdbc:oracle:thin:@localhost:1521:sid |
SqlServer | jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sid |
MySql数据库地址,如果不指定主机名默认连接localhost
MySql数据库地址,如果不指定端口号默认连接3306
所以如果连接的是本机默认端口,可以将地址写为如下样式:
jdbc:mysql:///sid
c.Connection对象
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql): 创建向数据库发送预编译sql的PreparedSatement对象。
prepareCall(sql):创建执行存储过程的callableStatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit():在链接上提交事务。
rollback():在此链接上回滚事务。
d.Statement对象
executeQuery(String sql) : 用于向数据库发送查询语句。
executeUpdate(String sql):用于向数据库发送insert、update或delete语句
execute(String sql): 用于向数据库发送任意sql语句
addBatch(String sql): 把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
e.ResultSet对象
ResultSet对象内部以类似表的结构存储了查询结果信息
并提供了一个游标用来遍历数据
游标最开始不指向任何数据
通过相关方法可以移动游标,如果成功移动并指向了一条新的数据就返回true,否则返回false
当指向新数据时,可以通过api获取当前指向的行中指定列的数据
getObject(int index)
getObject(string columnName)