02-获取连接数据库的Connection对象的方式

获取连接对象连接数据库的方式

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();
			}
		}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值