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

相关推荐
葫芦和十三3 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp3 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑4 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯5 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan7 小时前
多Agent之间的区别
后端
杨充9 小时前
1.面向对象设计思想
后端
IT_陈寒9 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro10 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗10 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端
她的男孩11 小时前
后台接口加密别只会 HTTPS,ForgeAdmin 的 RSA + SM4/AES 源码拆解
后端·面试·开源