Java数据库连接--JDBC--DRUID

1.JDBC简介

JDBC(Java Data Base Connectivity,Java数据库连接)是Java程序和数据库之间的桥梁,包含 了⼀套Java定义的用于执行SQL语句的接口,使开发者能够编写数据库的程序。JDBC 的主要作用是: 与数据库建立连接、发送SQL语句和处理数据库执行结果。
访问数据库步骤

  1. 加载驱动
  2. 确认用户名、密码、url
  3. 创建Statement
  4. 执行SQL并接受返回的结果
  5. 关闭连接

2.JDBC配置

2.1建立连接

首先我们需要获取jar包,这里以oracle举例。将jar包复制到libs文件中,点击jar包右键,选择添加到库

2.2基础配置

注册驱动

java 复制代码
    //注册驱动,有三种方式,我比较习惯使用class.forname
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //获取连接
	Connection con = DriverManager.getConnection(  
			"jdbc:oracle:thin:@localhost:1521:XE",  
			"XIAOMING",  
			"123456"  
	);

配置Statement

  • prepareStatement会先初始SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率;可以保证SQL安全问题,防止SQL注入,可以重复使用;
  • createStatement不会初始化,没有预处理,只能在SQL中拼接参数,容易造成SQL注入,如果要删除多条数据,需要写多条SQL语句;
java 复制代码
String sql = "select * from family_member where name";
Statement stat = con.createStatement();
ResultSet resultSet = stat.executeQuery(sql);
while(resultSet.next()){  
	System.out.println(resultSet.getString("name")  
						+"\t"  
						+resultSet.getString("gender")  
	);  
}
java 复制代码
String sql = "select * from family_member where name = ?";
PreparedStatement stat = con.prepareStatement(sql);
stat.setString(1,"爸爸");
ResultSet resultSet = stat.executeQuery();
while(resultSet.next()){  
	System.out.println(resultSet.getString("name")  
						+"\t"  
						+resultSet.getString("gender")  
	);  
}

释放资源

java 复制代码
resultSet.close();  
stat.close();  
con.close();

3.Spring实战 --手动构建DataSource

3.1配置类结构

整个配置类包含三部分:

  • 数据源配置:连接信息 + 连接池参数
  • Druid 监控 Servlet:提供可视化监控页面
  • Druid Web 过滤器:统计 Web 请求与 SQL 的关联

3.2配置

数据源核心配置

java 复制代码
@Bean  
public DataSource dataSource() throws SQLException {  
    DruidDataSource ds = new DruidDataSource();  
    //基础连接信息
    ds.setUrl("jdbc:oracle:thin:@localhost:1521:XE");  
    ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");  
    ds.setUsername("XIAOMING");  
    ds.setPassword("123456");  
    //连接池大小控制
    ds.setMinIdle(5);  //最小连接数
    ds.setMaxWait(60000);  //获取连接的最大等待时间
    ds.setMaxActive(20);  //最多20个连接同时活跃
    ds.setInitialSize(5);  //5个初始连接
    //空闲连接回收策略
    ds.setMinEvictableIdleTimeMillis(60000);  //最小回收等待时间
	ds.setMaxEvictableIdleTimeMillis(900000);  //最大回收等待时间
    ds.setTimeBetweenEvictionRunsMillis(30000);  //每30s检测一次
    //连接检测
    ds.setValidationQuery("SELECT 1 FROM DUAL");  //检测语句
    ds.setTestWhileIdle(true);  //空闲时检测
    ds.setTestOnBorrow(false);  //借出不检测
    ds.setTestOnReturn(false);  //还回不检测
    //废弃处理
    ds.setRemoveAbandoned( true);  //自动回收泄露的连接
    ds.setRemoveAbandonedTimeout(180);  //设置3分钟未关闭为泄露
	ds.setLogAbandoned(true);  //回收时打印
	//扩展功能
    ds.setFilters("stat,wall");  //stat=SQL监控,wall=SQL防火墙
    ds.setPoolPreparedStatements(true);  //开启预先输入缓存
    ds.setUseGlobalDataSourceStat( true);  //启用全局数据源统计
    return ds;  
}

注意setFilters("stat,wall") 中的 wall 是 Druid 的 SQL 防火墙,能防御 SQL 注入攻击,实际开发中很有用。

Druid监控页面Servlet

java 复制代码
@Bean  
public ServletRegistrationBean<StatViewServlet> statViewServlet() {  
    ServletRegistrationBean<StatViewServlet> servletReg =  
            new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");  
    servletReg.addInitParameter("loginUsername", "admin");  // 监控页登录账号  
    servletReg.addInitParameter("loginPassword", "123456"); // 监控页登录密码  
    return servletReg;  
}

DruidWeb过滤器

这个过滤器的作用是将 HTTP 请求和执行的 SQL 语句关联起来,让你在监控页面能看到"哪个接口执行了什么 SQL,耗时多少"。

java 复制代码
@Bean  
public FilterRegistrationBean<WebStatFilter> webStatFilter() {  
    FilterRegistrationBean<WebStatFilter> filterReg = new FilterRegistrationBean<>();  
    filterReg.setFilter(new WebStatFilter());  
    filterReg.addUrlPatterns("/*");  
    filterReg.addInitParameter("exclusions", "*.js,*.css,/druid/*");  
    return filterReg;  
}

3.3验证配置

  1. 测试数据库连接和业务代码

    java 复制代码
    @GetMapping("/listAll")  
    public Result listAll() {  
        List<familyMember> listall= familyMemberService.listAll();  
        if(listall.size()>0){  
            return Result.ok(listall);  
        }else{  
            return Result.fail("没有数据");  
        }  
    }
  2. 访问监控页面
    http://localhost:8080/druid

相关推荐
浮游本尊1 小时前
用结构化 Prompt 让大模型「干活」:以数据库巡检告警建议生成为例
后端
Yushan Bai1 小时前
ORACLE Enterprise Manager Cloud Control 系列测试3-Data Masking
数据库·oracle
snakeshe10101 小时前
SpringBoot 多人协作平台实战(8):Cookie 与登录状态维持
后端
罗超驿1 小时前
16.深入理解数据库事务:从转账场景剖析ACID四大特性与回滚(Rollback)机制
数据库·mysql
代码北人生1 小时前
后端工程师开始用 Claude Code 了,Stripe 4天完成了本来要10个工程师周的迁移
后端·claude
小江的记录本2 小时前
【Java基础】核心关键字:final、static、volatile、synchronized、transient(附《思维导图》+《面试高频考点清单》)
java·前端·数据结构·后端·ai·面试·ai编程
Yushan Bai2 小时前
ORACLE Enterprise Manager Cloud Control 系列测试2- 日常管理和SQL优化
数据库·oracle
fliter2 小时前
Rust 泛型 vs Java 泛型:它们看起来相似,但骨子里截然不同
后端