概念:
Java Database Connectivity(java语言连接数据库)
本质【一套接口】:
JDBC是SUN公司制定的一套接口(interface)
java.sql.*;(这个软件包下有很多接口)
作用:每一个数据库都有自己独特的实现原理,
二、JDBC原生六步
第一步:注册驱动(作用:告诉java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了。这属于进程之间的通信,重量级的,用完之后要关闭)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句
第五步:处理查询结果集(当第四步执行的select语句的时候,才有第五步)
第六步:释放资源
代码示例:
import com.mysql.jdbc.Driver;
import java.sql.*;
public class TestJdbc {
public static void main(String[] args) throws SQLException {
//注册驱动
DriverManager.registerDriver(new Driver());
//建立连接
//如果链接地址ip是localhost 并且 端口是3306 那么可以省略不写
Connection connection = DriverManager.getConnection("jdbc:mysql:///day11", "root", "root");
//创建执行对象
Statement statement = connection.createStatement();
//ResultSet 结果集对象
ResultSet resultSet = statement.executeQuery("select * from user");
//循环判断游标是否还可以下移(是否还有数据)
while(resultSet.next()){
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
System.out.println(name+"===="+age);
}
//释放资源 先开后关
resultSet.close();
statement.close();
connection.close();
}
三、Junit单元测试
使用步骤:
1. 把junit4.x的测试jar,添加到该项目中来;
2. 定义一个测试类 测试类的名字: XxxTest
3. 在测试类中编写测试方法:
@Test
public void testXxx(){
}
注意:方法是`public修饰的,无返回的,该方法上必须贴有@Test标签`,XXX表示测试的功能名字
4. 运行测试方法
常见注解:
@Test:要执行的测试方法
@Before:每次执行测试方法之前都会执行
@After: 每次执行测试方法之后都会执行
四、JDBC优化之连接池
五、封装JDBCUtils工具类连接池原理:
连接池负责分配、管理和释放数据库连接,它的核心思想就是连接复用. 通过建立一个连接池,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库。 一旦连接池中的连接对象被用完了,判断连接对象的个数是否已达上限,如果没有可以再创建新的连接对象,如果已达上限,用户必须处于等待状态,等待其他用户释放连接对象,直到连接池中有被释放的连接对象了,这时候等待的用户才能获取连接对象,从而操作数据库。 这样就可以使连接池中的连接得到高效、安全的复用,避免了数据库连接频繁创建、关闭的开销,明显提高对数据库操作的性能。连接池优势:
(1)程序启动时提前创建好连接,不用用户请求时创建,给服务器减轻压力; (2)连接关闭的时候不会直接销毁connection,这样能够重复利用; (3)如果超过设定的连接数量但是还没有达到最大值,那么可以再创建; (4)如果空闲了,会默认销毁(释放)一些连接,让系统性能达到最优;常用的开源连接池:
1. DBCP 是Apache提供的数据库连接池,速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持 2. C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以 Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点 BoneCP 是一个开源组织提供的数据库连接池,速度快 3.Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不知道 是否有BoneCP快连接池的使用【c3p0】:
创建配置文件c3p0.xml ,放在src目录下 :com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/day10 root root 30000 30 10 30 100 10 200 10 1 0
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//负责管理数据库连接
public class JdbcUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//私有化JdbcUtils的构造方法
private JdbcUtils(){}
//提供连接池对象方法
public static DataSource getDataSource(){
return dataSource;
}
//提供数据连接对象的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
return null;
}
}
public static void close(Connection connection, Statement statement, ResultSet resultSet){
try {
if(resultSet!=null)
resultSet.close();
if (statement!=null)
statement.close();
if(connection!=null)
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static void close(Connection connection, Statement statement){
try {
if (statement!=null)
statement.close();
if(connection!=null)
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
六、SQL注入优化
七、事务在Java中的实现优化命令:将Statement 替换成了 PreparedStatment预编译命令对象
八、dbutils的使用1、手动开启事务
2、成功 提交
3、失败 回滚
import com.offcn.util.JdbcUtils; import org.junit.Test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestTransaction { @Test public void test() throws SQLException { Connection connection = JdbcUtils.getConnection(); PreparedStatement preparedStatement = null; try { //1、关闭自动提交,开启事务 connection.setAutoCommit(false); //2、具体的事务 ...... //3、程序没有问题,提交事务 connection.commit(); } catch (SQLException throwables) { throwables.printStackTrace(); //4、程序出问题了,回滚事务 connection.rollback(); }finally{ //5、关闭资源 preparedStatement.close(); JdbcUtils.close(); } } }
九、通用DAO封装1、简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。2、作用
DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。 该包封装了SQL的执行,是线程安全的。 (1)可以实现增、删、改、查、批处理、 (2)考虑了事务处理需要共用Connection。 (3)该类最主要的就是简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。3、常用方法
① 操作:update() public int update(Connection conn, String sql, Object... params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。 ② 查询:query() public Object query(Connection conn, String sql, ResultSetHandler rsh,Object... params) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。 注: 该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet rs)该方法的返回值将作为QueryRunner类的query()方法的返回值 方法: ArrayHandler:把结果集中的第一行数据转成对象数组。 ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。 BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 ColumnListHandler:将结果集中某一列的数据存放到List中。 MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。 MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List ScalarHandler:返回结果集中第一行第一列的数据,返回类型为object4、基本使用
1、下载导包 commons-dbutils-1.7.jar 2、创建核心对象 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); 3、调用方法 int update = qr.update(connection,sql,params); // 执行增删改 T t = qr.query(connection,sql,new BeanHandler,params); List t = qr.query(connection,sql,new BeanListHandler,params); Object t = qr.query(connection,sql,new ScalerHandler,params);
封装baseDao
import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException; import java.util.List; public class baseDao{ QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource()); //负责通用增删改 public int executeUpdate(String sql, Object ...params){ try { return queryRunner.update(sql,params) ; } catch (SQLException throwables) { throwables.printStackTrace(); return 0; } } //负责通用查询(单条记录) public T queryForSingle(String sql,Class clazz,Object...params){ try { return queryRunner.query(sql,new BeanHandler (clazz),params); } catch (SQLException throwables) { throwables.printStackTrace(); return null; } } //负责通用查询(多条记录) public List queryForList(String sql,Class clazz,Object ...params) { try { return queryRunner.query(sql,new BeanListHandler (clazz),params); } catch (SQLException throwables) { throwables.printStackTrace(); return null; } } }



