一 、JDBC操作
- 注册数据库驱动
- 获取连接
- 创建传输器(PreparedStatement对象或Statement对象)
- 传输sql并返回结果
- 遍历结果
- 关闭资源
@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批处理优缺点
优点:
- 可以执行不同语义的sql
缺点:
- 没有预编译功能
- 需要发送完整的sql语句
- 语句相同也需要再次发送完整sql
PreparedStatement批处理优缺点
优点:
- 有预编译功能
- 由于将sql语句的主干存储的数据库服务器中,所以不需要每次都发送sql主干,执行效率较高
- 只发送参数,所以sql执行较快
缺点:
- 不能执行不同语义的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操作中的销毁连接。