文章目录
概述
JDBC作为java程序与数据库相连接的中间技术,主要实现通过java代码实现对数据库的增删改查操作,不考虑封装的情况下,底层JDBC的实现主要是对于DAO的理解,总体来说无非以下几个步骤:
1.导驱动包到当前工程的lib下
2.建立连接
3.增删改查
4.关闭连接
下面就以上几点分别进行总结
1.导驱动包到当前工程的lib下
JDBC存在的意义主要是解决了以往java程序员在操作不同数据库时,由于数据库的不同因而操作也会不同,这就要求程序员操作某一数据库前需要对某一数据库事先了解后才能进行相关操作,而JDBC提供了一种规范,也叫接口,不同的数据库厂商正对此接口去编写操作自己数据库的实现方法,将这些方法打包成驱动,以便JDBC调用,所以操作不同的数据库前请先去对应官网下载对应驱动导入即可。
2.建立连接
2.1 底层实现
读取配置文件,注册、加载驱动通过DriverManner获取连接,较为麻烦
2.2 使用数据库连接池
2.2.1C3P0连接池
public void C3p0Test2() throws SQLException {
ComboPooledDataSource co = new ComboPooledDataSource("hellc3p0");//获取数据源
Connection connection = co.getConnection();
System.out.println(connection);
}
//其中hellc3p0为对应数据库的xml文件,类似properties文件
2.2.2 dbcp连接池
public void dbcpTest2() throws Exception {
Properties ps = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");
ps.load(is);
DataSource dataSource = BasicDataSourceFactory.createDataSource(ps);//获取数据源
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
2.2.3 Druid连接池
public void DruidTest() throws Exception {
Properties ps = new Properties();
InputStream inputStream = new FileInputStream(new File("src/druid.properties"));
ps.load(inputStream);
DataSource dataSource = DruidDataSourceFactory.createDataSource(ps);//获取数据源
System.out.println(dataSource.getConnection());
}
总结:获取链接步骤都是1.读配置文件 2.获取数据源 3.获取链接
3.增删改查
3.1 底层实现(BaseDAO)
BaseDAO中封装了可能对数据库进行操作的泛型方法一边操作不同数据表
操作数据库前需要自己书写对应的增删改查方法,大体流程就是:
1.获取链接
2.书写sql语句
3.获取对应preparestatement
4.进行update/query操作得到结果
5.返回结果
比较繁杂
3.2 通过QueryRunner封装的各类方法实现
1.增删改操作
参数说明:
connection:传入一个连接(连接池获取)
sql:对应的sql语句
object…params:sql语句占位符填充参数
返回值:受影响的行数
2.查询操作
参数说明:
同上,其中:
ResuleSetHander:是一个接口,它有以下实现类
举起中的BeanHander来说,创建一个此实现类的对象,构造器中必要参数为实体类Bean,请看query源码:
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
PreparedStatement stmt = null;
ResultSet rs = null;
Object result = null;
try {
stmt = this.prepareStatement(conn, sql);
this.fillStatement(stmt, params);
rs = this.wrap(stmt.executeQuery());
result = rsh.handle(rs);//这里调用了ResuleSetHander某一实现类的handle方法,rs为以及查询出来的结果集,handle方法将会结合调用它的对象的类型选择返回值返回的类型(比如是ArrayListHander那么就返回一个list,比如是BeadHander,就返回对应的实体类对象)
} catch (SQLException var33) {
this.rethrow(var33, sql, params);
} finally {
try {
this.close(rs);
} finally {
this.close((Statement)stmt);
}
}
return result;
}
查询演示
public void testQuery2() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id < ?";
BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);
List<Customer> list = runner.query(conn, sql, handler, 23);
list.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, null);
}
}
4.关闭连接
3.1底层实现
分别调用使用资源的close方法
通过Dbutils工具类
总结
1.三大连接池技术替代了原始通过手写注册、加载驱动的方式获取链接
2.QueryRunner实现类封装了各类增删改查方法,理解ResultSetHander接口是最重要的
3.DButils类封装了关闭连接操作