前言:一个完整的项目必然要和数据库进行交互。学完SpringBoot的基础之后便要开始学习SpringBoot之数据访问,(整合基本jdbc与数据源)
首先写SpringBoot与JDBC的交互
1:交互之前需要先引入JDBC的pom依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2:编写连接数据库的配置
spring:
datasource:
username: root
password: ******
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
schema:
- classpath:schema-all.sql
initialization-mode: always
3:测试类测试连接
@Autowired
DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
System.out.println("数据源:"+dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println("6666:"+connection);
}
在输出语句中,我们可以看到SpringBoot2.0默认以com.zaxxer.hikari.HikariDataSource
为数据源
SpringBoot默认可以支持;
org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource、
当然我们也可以自定义数据源
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name="spring.datasource.type")
staticclassGeneric {
@Bean
publicDataSourcedataSource(DataSourcePropertiesproperties) {
//使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性
returnproperties.initializeDataSourceBuilder().build();
}
}
4:SpringBoot在启动的时候会自动帮我们运行建表或插入语句,因此我们只需要按照规范配置即可
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
schema‐*.sql、data‐*.sql
默认规则(命名):schema.sql,schema‐all.sql;
可以使用
schema:
‐ classpath:department.sql指定位置
需要注意的是,在springboot2.0以上的版本中,我们若想要配置的sql文件在springboot启动的时候执行,需要在springboot的配置文件中进行如下配置
spring.datasource.initialization-mode=always
5:操作数据库:自动配置了JdbcTemplate操作数据库
@Autowired
private JdbcTemplate jdbcTemplate;
@ResponseBody
@RequestMapping("/jdbcQuery")
public Map<String,Object> jdbc(){
System.out.println("ssssssssssssssssss");
List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from department");
System.out.println("####"+maps.toString());
return maps.get(0);
}
6:配置自定义数据源druid
1).SpringBoot并没有直接对Druid的启动器而是需要我们自己整合,apache中4个月前已经出了一套完美支持SpringBoot的方案。所以说现在我们使用的依赖是第一个而不用第二个:
//不使用此依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
//使用此依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
2).在yml文件中进行配置
type: com.alibaba.druid.pool.DruidDataSource//配置的数据源
# 数据源其他配置
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,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
3).虽然我们配置了druid连接池的其它属性,但是不会生效。因为默认是使用的java.sql.Datasource的类来获取属性的,有些属性datasource没有。如果我们想让配置生效,需要手动创建Druid的配置文件。
/*编写配置类配置druid数据源*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druid(){
return new DruidDataSource();
}
再次运行测试类便可发现此时数据源已变成druid
在配置druid数据源时或许会报错:Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority
查询资料说的是缺包或报版本过低。所以便在pom文件引入了最新的log4j的依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
4).配置监控器
//配置druid的监控
//1:配置一个管路后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
Map<String,String> map = new HashMap<>();
map.put("loginUsername","admin");//配置账号
map.put("loginPassword","123");//配置密码
map.put("allow","");//配置允许访问地址,不填写则表示允许所有访问
//map.put("deny","ip");//禁止访问路径
bean.setInitParameters(map);//传入初始化参数
return bean;
}
//2:配置一个web监控的Filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new WebStatFilter());
Map<String,String> map = new HashMap<>();
map.put("exclusions","*.js,*.css,/druid/*");//放行的路径
filter.setInitParameters(map);
filter.setUrlPatterns(Arrays.asList("/*"));
return filter;
}