SpringBoot之数据访问(jdbc,druid数据源)

前言:一个完整的项目必然要和数据库进行交互。学完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;
    }

你可能感兴趣的:(java-spring)