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

相关推荐
JustHappy5 小时前
古法编程秘籍(六):程序到底是怎么跑起来的?从 IO 到中断,一次讲明白
前端·后端·全栈
晨曦中的暮雨6 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
十年编程老舅6 小时前
Linux DRM:底层逻辑与实践架构
数据库·mysql
The Sheep 20236 小时前
Vue复习
linux·服务器·数据库
云边有个稻草人7 小时前
深度解析:KingbaseES高可用架构落地原理与生产运维实战
数据库·读写分离·数据库运维·金仓数据库·国产数据库技术·数据备份恢复
满天星83035777 小时前
【Qt】信号和槽(二) (自定义信号和槽)
开发语言·数据库·qt
小村儿7 小时前
连载13- 内部Tools,Claude Code 怎么真正"动"你的代码
前端·后端·ai编程
IT_陈寒7 小时前
Python的线程池把我坑惨了,原来异步不是万能的
前端·人工智能·后端
郑洁文7 小时前
基于SpringBoot的商品仓库管理系统的设计与实现
java·spring boot·后端·仓库管理系统·商品仓库管理系统
该用户已不存在8 小时前
这9款开发工具夯爆了,用了都说好
后端·程序员·全栈