Java连接数据库(JDBC连接,批处理,连接池)

一 、JDBC操作

  1. 注册数据库驱动
  2. 获取连接
  3. 创建传输器(PreparedStatement对象或Statement对象)
  4. 传输sql并返回结果 
  5. 遍历结果
  6. 关闭资源
@Test
	public void test01(){
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			//注册数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//获取连接
			conn = DriverManager.getConnection("jdbc:mysql:///****","user","password");
			//创建PreparedStatement对象
			ps = conn.prepareStatement("select * from user where id = ?");
			ps.setInt(1, 1);
			//传输sql并返回结果 
			rs = ps.executeQuery();
			//遍历结果
			while(rs.next()){
				System.out.println(rs.getString("name"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//关闭资源
			if(rs != null){
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally {
					rs = null;
				}
			}
			if(ps != null){
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally {
					ps = null;
				}
			}
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally {
					conn = null;
				}
			}
		}
	}

二、批处理

【批处理机制】在一次JDBC操作中,发送多条sql语句,这种操作就可以认为是一个批处理机制的操作。

【批处理机制实现】

addBatch(String sql);//向当前批处理中添加一条sql语句。
executeBatch();//执行批处理
clearBatch();//清空批处理

Statement批处理优缺点

优点:

  1. 可以执行不同语义的sql

缺点:

  1. 没有预编译功能
  2. 需要发送完整的sql语句
  3. 语句相同也需要再次发送完整sql

PreparedStatement批处理优缺点

优点:

  1. 有预编译功能
  2. 由于将sql语句的主干存储的数据库服务器中,所以不需要每次都发送sql主干,执行效率较高
  3. 只发送参数,所以sql执行较快

缺点:

  1. 不能执行不同语义的sql

三、连接池的操作(以C3P0连接池为例)

【1】连接池的产生:面对海量的访问,频繁的创建和销毁连接十分占用资源。应该将创建和销毁的过程消除掉。为了消除创建和销毁连接的过程,可以使用连接池。连接池中会保留一些连接,用户需要使用时,直接取出使用,使用完成归还到连接池中即可。通过取出和归
还代替了创建和销毁。若是面对海量访问,也能降低服务器和数据库的压力。

使用C3P0连接池连接数据库:

首先书写配置文件c3p0.properties命名必须一致

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/数据库名称
c3p0.user=用户名
c3p0.password=数据库密码

然后书写代码

public void test01(){
		//创建数据源
		ComboPooledDataSource datasource = new ComboPooledDataSource();
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//获得连接
			conn = datasource.getConnection();
			//创建传输器
			ps = conn.prepareStatement("select * from user where id = ?");
			ps.setInt(1, 1);
			//传输sql并返回结果 
			rs = ps.executeQuery();
			//遍历结果
			while(rs.next()){
				System.out.println(rs.getString("name"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//关闭资源
			if(rs != null){
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally {
					rs = null;
				}
			}
			if(ps != null){
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally {
					ps = null;
				}
			}
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally {
					conn = null;
				}
			}
		}
	}

连接池的存在大大降低服务器和数据库的压力,通过取出和归还代替了创建和销毁。其中,使用连接池进行数据库操作,conn.close()方法是归还连接池。在连接池的底层对close方法进行了重写,并不是JDBC操作中的销毁连接。

你可能感兴趣的:(数据库笔记,线程池,JDBC连接,批处理)