springBoot整合JDBC+druid
前言:
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。
一,整合JDBC
1,在建立springboot时,引用相应模块,(springWeb,JDBC API,Mysql driver)
2.引入成功后在pom.xml中有相关启动器
<!--JDBC--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--MySQL--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
3,在yaml配置文件中配置连接数据库
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8 driver-class-name: com.mysql.cj.jdbc.Driver
注意:当没有指定数据源时,springBoot用到是自己的默认数据源(class com.zaxxer.hikari.HikariDataSource),hikari
4.此时,我们就可以利用JDBCTemplate直接对sql进行操作了,那么什么是JDBCTemplate呢?
1、有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
2、即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate。
3、数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
4、Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用
5、JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 JdbcTemplateConfiguration 类
JdbcTemplate主要提供以下几类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
5.测试
package com.king.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.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; @RestController public class JDBCController { @Autowired JdbcTemplate jdbcTemplate; //查询数据库的所有信息 //没有实体类,数据库中的东西,怎么获取?Map @GetMapping("/userList") public List<Map<String,Object>> userList(){ String sql="select * from user"; List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); return maps; } //事务无需手动提交jdbcTemplate已经封装好了 @GetMapping("/userAdd") public String add(){ String sql="insert into user(id,`name`,pwd) values(7,'2','3')"; jdbcTemplate.update(sql); return "success"; } @GetMapping("/userUpdate/{id}") public String upaDate(@PathVariable("id")int id){ //预编译,防止sql注入 String sql="update user set `name` = ?,pwd=? where id="+id; //封装 Object[] objects= new Object[2]; objects[0]="小明" ; objects[1]="41111"; jdbcTemplate.update(sql,objects); return "success"; } @GetMapping("/userDelete") public String delete(){ //预编译,防止sql注入 String sql="delete from user where id=?"; //封装 Object[] objects= new Object[1]; objects[0]="1"; jdbcTemplate.update(sql,objects); return "success"; } }
二、指定数据源(druid)
为什么要用druid的数据源:它具备DBCP,C3P0等普通数据源的所有功能外,还具有监听功能,在不占用资源的情况下,非常好的监听了开发人员的数据库操作。方便debug
1.yaml配置
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8 driver-class-name: com.mysql.cj.jdbc.Driver #指定数据源 type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的,需要自己绑定 #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 #配置监控统计拦截的filters,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 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
注意:在这里用log4j时候会有warn,仅需在resources文件夹下新建log4j.properties,编写如下配置,就可以解决
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2,配置完druid后,但是还没有和springboot绑定,所以需要自己去写接口实现类去绑定它
package com.king.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.sql.DataSource; import java.util.HashMap; @Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource")//将druid的独有属性预spring绑定 @Bean public DataSource druidDataSource(){ return new DruidDataSource(); } //后台监控()web.xml,ServletRegistrationBean注册bean //因为SpringBoot内置了servlet容器,所以没有web.xml,代替方法 :ServletRegistrationBean @Bean public ServletRegistrationBean StatViewServlet(){ ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); //后台有人需要登录,账户密码配置 HashMap<String,String>initParameters = new HashMap<>(); //增加配置 initParameters.put("loginUsername","admin");//登录的key是固定的loginUsername,loginPassword initParameters.put("loginPassword","123456"); //允许谁能访问 initParameters.put("allow",""); //禁止谁能访问initParameters.put("king","192.168.11.123"); bean.setInitParameters(initParameters); //设置初始化参数 return bean; } //filter,过滤那些请求不进入druid监控日志 @Bean public FilterRegistrationBean webStatFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); HashMap<String, String> initParameters = new HashMap<>(); //可以过滤的请求(js,css,druid请求下的所有),exclusions排除 initParameters.put("exclusions","*.js,*.css,/druid/*"); bean.setInitParameters(initParameters); return bean; } }