JDBC编程六步
创建并注册驱动对象
: 告诉Java程序即将要连接的是哪个品牌的数据库(注意使用反射机制加载Driver类时会自动完成驱动的创建和注册)使用注册对象获取连接对象
: 表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,使用完之后一定要关闭通道获取数据库操作对象
: 专门执行sql语句的对象利用数据库操作对象执行SQL语句
: 如DQL DML语句等处理查询结果集
: 只有执行的是select语句的时候才需要处理查询结果集释放资源
: Java和数据库属于进程间的通信,使用完后一定要关闭资源手动创建驱动对象调用方法
各大数据库厂商都实现java.sql.Driver
接口,我们创建某个厂商的驱动对象然后调用connect方法
获取连接对象
方法名 | 作用 |
---|---|
Connection connect(url, properties) | 获取连接对象, properties中封装了用户名和密码 |
第一种: 静态创建数据库的驱动对象
然后调用connect方法获取连接对象
@Test
public void connect01() throws SQLException {
// 创建oracle的驱动对象
// Driver driver = new oracle.jdbc.driver.OracleDriver();
// 创建mysql的驱动对象,由于数据库厂商都实现了java.sql.Driver接口,所以可以使用多态机制
Driver driver = new com.mysql.jdbc.Driver();
// 编写连接数据库的url,用户名和密码(保存在Properties对象中,user和password是规定好的键名)
String url = "jdbc:mysql://localhost:3306/hsp_db02";
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "123456");
// 调用驱动对象的connect方法获取连接对象,参数就是url,用户名和密码
Connection connect = driver.connect(url, properties);
System.out.println("静态获取的数据库连接对象 = " + connect); // com.mysql.jdbc.JDBC4Connection@41cf53f9
}
第二种: 利用反射机制动态创建数据库的驱动对象
然后调用connect方法获取连接对象,代码更加灵活减少依赖性
@Test
public void connect02() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
//使用反射机制动态加载Driver类然后创建数据库的驱动对象
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)aClass.newInstance();
// 编写连接数据库需要的url,用户名和密码(保存在Properties对象中,user和password都是规定好的键名)
String url = "jdbc:mysql://localhost:3306/hsp_db02";
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "123456");
// 调用驱动对象的connect方法获取连接对象,参数就是url,用户名和密码
Connection connect = driver.connect(url, properties);
System.out.println("使用反射机制获取的数据库连接对象 = " + connect);
}
手动注册驱动对象到驱动管理类
将创建好的驱动对象
注册到驱动管理类中
进行管理,这样DriverManager(驱动管理对象)
就可以对driver(驱动对象)
的方法进行扩展
方法名 | 功能 |
---|---|
static Connection getConnection(url,uesr,pwd) | 直接传入参数信息, 获取连接对象(底层干活的还是 driver 对象) |
static void registerDriver(driver) | 在驱动管理类中完成驱动注册后它就会对驱动对象进行管理 |
@Test
public void connect03() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException {
// 使用反射机制动态加载Driver类然后创建数据库的驱动对象
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
// 编写连接数据库的url,用户名和密码(保存在Properties对象中,user和password是规定好的键名)
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "hsp";
// 调用DriverManager的registerDriver静态方法完成驱动的注册
DriverManager.registerDriver(driver);
// 调用DriverManager的getConnection静态方法获取连接对象
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("使用驱动管理类获取的数据库连接对象=" + connection);
}
自动完成驱动对象创建和注册
执行Class.forName("com.mysql.jdbc.Driver")
加载Driver驱动类时会执行静态代码块中的代码自动完成驱动的创建与注册
甚至可以无需显示的调用Class.forName("com.mysql.jdbc.Driver")
,因为MySQL默认会加载Driver类,但是写上更加明确
static {
try {
// 当加载完Driver类时,驱动对象的注册的工作就完成了
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
@Test
public void connect04() throws ClassNotFoundException, SQLException {
// 使用反射机制加载Driver类,类加载期间底层自己会完成驱动对象的创建与注册
// 因为我们只想用它的类加载动作,所以类加载时不用接收返回值
Class.forName("com.mysql.jdbc.Driver");
// 编写连接数据库的url,用户名和密码(保存在Properties对象中,user和password是规定好的键名)
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "hsp";
// 调用DriverManager的getConnection静态方法获取连接对象
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
创建属性资源文件
将数据库的连接信息写入到properties配置文件中
,以后需要连接其他数据库的时候不需要修改java代码,只需要修改属性配置文件中的内容即可
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.151.9:3306/bjpowernode
user=root
password=981127
@Test
public void connect05() throws IOException, ClassNotFoundException, SQLException {
// 通过Properties对象获取配置文件中的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
// 使用资源绑定器绑定属性配置文件并获取相关属性的值
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
// 连接数据库
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
代码基本骨架和释放资源
在finally语句块中关闭资源
时需要保证资源一定释放,遵循从小到大关闭和分别try…catch的原则
从小到大
: 遵循从里到外即先开启的后关闭分别try..catch
: 当一起try时如果关闭的第一个资源就出现问题,此时会直接进入catch语句块,那么后面的资源就不会关闭import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
public class JDBCTest01{
public static void main(String[] args){
Connection conn = null;
//PreparedStatement ps = null;
Statement stmt = null;
ResultSet rs = null;
try{
//1、创建并注册驱动
//2、获取连接
//3、获取数据库操作对象(Statement专门执行sql语句的)
//4、执行sql
//5、处理查询结果集
}catch(SQLException e){
e.printStackTrace();
}finally{
//6、释放资源
if(rs != null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
}
try{
if(stmt != null){
stmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(conn != null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}