一、SpringBoot-JDBC
简单的用springboot实现一下jdbc
这里我加了jdbc依赖及web依赖
<!-- JDBC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置文件链接数据库
如果数据库是8以上记得加上时区
# 连接数据库
spring:
datasource:
username: root
password: 123
url: jdbc:mysql://localhost:3306/test?userUnicode=true&charcterEncoding=utf-8&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
在这里你可以测试一下自己默认数据源及数据库连接
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
// 查看默认数据源:class com.zaxxer.hikari.HikariDataSource
System.out.println(dataSource.getClass());
// 获得数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
创建controller类
不需要实体类就直接实现CRUD
package com.java.ym.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* @Author: YuMi
* @Date: 2020/11/5 17:07
* ----------------------
* @Comments:
*/
@RestController
public class JDBCController {
@Autowired
JdbcTemplate jdbcTemplate;
// 查询数据库所有的信息
// 没有实体类,怎么获取 Map
@GetMapping("/user")
public List<Map<String,Object>> userList(){
String sql = "select * from user";
List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
return mapList;
}
@GetMapping("addUser")
public String addUser(){
String sql = "insert into user(name,pwd) values('林叽霸','123')";
jdbcTemplate.update(sql);
return "update-ok";
}
}
测试结果
这里我就测试一个查询
二、Druid
首先导入依赖:
<!-- druid-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
<!-- log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
这里就用上面的示例:
先看一下配置,在原有的配置上加了一些druid配置
# 连接数据库
spring:
datasource:
username: root
password: 123
url: jdbc:mysql://localhost:3306/test?userUnicode=true&charcterEncoding=utf-8&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# springboot默认是不注入这些属性,需要自己绑定
# druid数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截器的filter,stat:监控统计,log4j,日志记录,wall:防御sql注入
# 如果允许时报错,java.lang.ClassNotFoundException:org.apache.log4j.Priority
# 则导入log4j依赖即可,Maven地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
userGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=trueldruid.stat,slowSqlMillis=500
创建配置类
package com.java.ym.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import javax.sql.DataSource;
import java.util.HashMap;
/**
* @Author: YuMi
* @Date: 2020/11/5 18:54
* ----------------------
* @Comments: 配置类
*/
@Configuration
public class DruidConfig {
// 配置文件包前缀
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource(){
return new DruidDataSource();
}
// 后台监控
// 因为springboot内置了servlet容器,所以才没有web.xml,替代方法ServletRegistrationBean
@Bean
public ServletRegistrationBean registrationBean(){
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 后台需要有人登录,账号密码配置
HashMap<String, String> initMap = new HashMap<>();
// 增加配置(登录key是固定的loginUsername && loginPassword)
initMap.put("loginUsername","admin");
initMap.put("loginPassword","123");
// 允许谁能访问,如果为空的话谁都能访问,也可以指定谁访问
initMap.put("allow","");
// 禁止谁能访问 initMap.put("","");
// 设置初始化参数
registrationBean.setInitParameters(initMap);
return registrationBean;
}
// filter 过滤器
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new WebStatFilter());
// 可以过滤哪些请求?
HashMap<String, String> filterMap = new HashMap<>();
// 这些不进行统计
filterMap.put("exclusions","*.js,*.css,/druid/*");
filterRegistrationBean.setInitParameters(filterMap);
return filterRegistrationBean;
}
}
运行后:
在这里可是试着用其他密码登录试试(当然是登不进去的),因为在配置类里指定了用户名和密码.
进去后页面就是这样子
在这里就可以看到我上面刚才执行的查询语句被监控到了,还有一个增加,再试一下。
在这里可以看到我执行的增加方法也被监控到了.
**Druid可以做什么? **
- 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
- 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
- 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
- SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
Druid在线工具:https://tool.oschina.net/apidocs/apidoc?api=druid0.26