1. 程式人生 > 其它 >23.springboot與資料庫訪問

23.springboot與資料庫訪問

1.jdbc

快速建立springboot專案時,在sql場景裡選擇mysql和spring data jdbc
pom檔案中:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

1.在配置檔案中(application.yml:配置對應的資料庫連線)
    spring:
      datasource:
        username: root
        password: 521521
        url: jdbc:mysql://192.168.2.129:3306/jdbc
        driver-class-name: com.mysql.jdbc.Driver
      jdbc:
        template:
          query-timeout: 3
    
2.測試:
    @Autowired
    DataSource dataSource;
    @Test
    public void contextLoads() throws SQLException {
        System.out.println("載入驅動..");
        System.out.println(dataSource.getClass());
        System.out.println(dataSource.getConnection());
    }
    輸出:
    載入驅動..
    class com.zaxxer.hikari.HikariDataSource
    HikariProxyConnection@1406763631 wrapping com.mysql.cj.jdbc.ConnectionImpl@1e84f3c
    
結論:發現預設的資料來源是HikariDataSource,這裡需要注意的是springboot高版本使用的資料來源是HikariDataSource,低版本(2.0以前)預設使用的是org.apache.tomcat.jdbc.pool.DataSource


springboot支援的DataSource有:
1.org.apache.tomcat.jdbc.pool.DataSource 
2.HikariDataSource
3.BasicDataSource
4.自定義的資料來源型別



測試:使用JdbcTemplate來進行操作
    @SpringBootTest
    @Slf4j
    class SpringBootDataJdbcApplicationTests {
        @Autowired
        JdbcTemplate jdbcTemplate;
        @Test
        public void contextLoads(){
           log.info(":::"+jdbcTemplate.queryForObject("select age from person where id=1", String.class));
            List<Person> personList = jdbcTemplate.query("select * from person", new BeanPropertyRowMapper<>(Person.class));
            log.info("長度:"+personList.size());
            for (Person person : personList) {
                log.info(":"+person.toString());
            }
        }
    }
分析自動配置
1.自動配置類
    1.1:DataSourceAutoConfiguration(資料來源的自動配置類)

使用Druid作為資料來源

官方的參考地址:https://github.com/alibaba/druid   
1.匯入druid的pom檔案
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.17</version>
    </dependency>
    
2.手動往容器中加入DataSource的元件
    //重點1:標明當前類是springboot的配置類
    @Configuration
    public class MyDataSourceConfig {
        //重點2:往容器中載入元件
        @Bean
        //重點3:最重要的一點:將springboot配置檔案中的配置和加入元件的屬性進行繫結
        @ConfigurationProperties("spring.datasource")
        public DataSource dataSource(){
            DruidDataSource druidDataSource=new DruidDataSource();
            return druidDataSource;
        }
    }

3.配置檔案中(application.yml)的寫法
    spring:
      datasource:
        username: root
        password: 521521
        url: jdbc:mysql://192.168.2.129:3306/jdbc
        driver-class-name: com.mysql.jdbc.Driver
      jdbc:
        template:
          query-timeout: 3
          
4.測試類:
    @SpringBootTest
    @Slf4j
    class SpringBootDataJdbcApplicationTests {
        @Autowired
        JdbcTemplate jdbcTemplate;
        @Autowired
        DataSource dataSource;
        @Test
        public void contextLoads(){
            //重點1:此處輸出的是:資料來源型別:class com.alibaba.druid.pool.DruidDataSource(發現使用的是咱們自定義的資料來源)
            log.info("資料來源型別:{}",dataSource.getClass());
            //重點2:此處的連線是通過自定義資料來源DruidDataSource取的連線進行資料庫查詢的
            log.info(":::"+jdbcTemplate.queryForObject("select age from person where id=1", String.class));
            List<Person> personList = jdbcTemplate.query("select * from person", new BeanPropertyRowMapper<>(Person.class));
            log.info("長度:"+personList.size());
            for (Person person : personList) {
                log.info(":"+person.toString());
            }
        }
    }

使用Druid的內建監控頁

1.在上述基礎上,還得往容器中放入一個元件
    
    @Configuration
    public class MyDataSourceConfig {
    
        @Bean
        @ConfigurationProperties("spring.datasource")
        public DataSource dataSource(){
            DruidDataSource druidDataSource=new DruidDataSource();
            return druidDataSource;
        }
        //重點1:加入自定義的servlet
        @Bean
        public ServletRegistrationBean statViewServlet(){
            //重點2:加入StatViewServlet
            StatViewServlet statViewServlet=new StatViewServlet();
            //重點3:加入statViewServlet處理/druid/*的所有請求
            ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
            return registrationBean;
        }
    }
啟動專案後,訪問http://localhost:8080/druid

監控頁的sql監控功能:

按照規範上設定,必須開啟Druid的監控統計功能
示例:
    在上述基礎上
    @Configuration
    public class MyDataSourceConfig {
        @Bean
        @ConfigurationProperties("spring.datasource")
        public DataSource dataSource() throws SQLException {
            DruidDataSource druidDataSource=new DruidDataSource();
            //重點1:在上述基礎上設定資料來源的Filter屬性為stat:這樣即打開了sql統計功能
            druidDataSource.setFilters("stat");
            return druidDataSource;
        }
        @Bean
        public ServletRegistrationBean statViewServlet(){
            StatViewServlet statViewServlet=new StatViewServlet();
            ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
            return registrationBean;
        }
    }

2.測試:寫一個controller
    @RestController
        @Slf4j
        public class DruidController {
            @Autowired
            JdbcTemplate jdbcTemplate;
            @RequestMapping("/queryPerson")
            public List<Person> queryPerosn(){
                List<Person> personList =jdbcTemplate.query("select * from person", new BeanPropertyRowMapper<>(Person.class));
                int num=jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
                log.info("數量:"+num
                );
                for (Person person : personList) {
                    log.info(":"+person.toString());
                }
                return personList;
            }
        }

監控頁的web應用監控和URI監控

按照規範配置:
   在上述基礎上加上webStatFilter的配置
       @Configuration
        public class MyDataSourceConfig {
        
            @Bean
            @ConfigurationProperties("spring.datasource")
            public DataSource dataSource() throws SQLException {
                DruidDataSource druidDataSource=new DruidDataSource();
                druidDataSource.setFilters("stat");
                return druidDataSource;
            }
            @Bean
            public ServletRegistrationBean statViewServlet(){
                StatViewServlet statViewServlet=new StatViewServlet();
                ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
                return registrationBean;
            }
            //重點1:向容器中加入webStatFilter元件
            @Bean
            public FilterRegistrationBean  webStatFilter(){
                WebStatFilter webStatFilter=new WebStatFilter();
                FilterRegistrationBean<WebStatFilter> filterFilterRegistrationBean=new FilterRegistrationBean<>(webStatFilter);
                //重點2:設定filter的攔截路徑
                filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
                //重點3:設定filter的過濾路徑,不加的話會攔截所有請求,包括靜態資源的請求等等
                filterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
                return filterFilterRegistrationBean;
            }
        } 

開啟sql防火牆

要點1:在資料來源配置中配置filter屬性,和sql監控開關stat同時使用時用逗號隔開
樣例如下:
    在上述基礎上進行更改
        ...
        @Bean
        @ConfigurationProperties("spring.datasource")
        //要點1:是在資料來源配置中進行配置
        public DataSource dataSource() throws SQLException {
            DruidDataSource druidDataSource=new DruidDataSource();
            //要點2:加上wall屬性:
            //1.stat:sql監控開關
            //2.wall:防火牆開關
            druidDataSource.setFilters("stat,wall");
            return druidDataSource;
        }
        ....
        
第二種寫法:
    1.因為資料來源和配置檔案中的spring.datasource進行了繫結,所以setFilte可以使用配置檔案完成
    spring:
      datasource:
        username: root
        password: 521521
        url: jdbc:mysql://192.168.2.129:3306/jdbc
        driver-class-name: com.mysql.jdbc.Driver
        重點:在配置檔案中加上filters: stat,wall屬性
      filters: stat,wall
      jdbc:
        template:
          query-timeout: 3
          
      2.在配置類中就可以去掉druidDataSource.setFilters("stat,wall");
        public DataSource dataSource() throws SQLException {
            DruidDataSource druidDataSource=new DruidDataSource();
            //去掉druidDataSource.setFilters("stat,wall");
            return druidDataSource;
        }
裡面包含了各種檢查細節

設定監控頁面的訪問許可權(1.頁面的登入使用者名稱/密碼 2.訪問ip的限制)

示例如下:
    在statViewServlet配置以下
    ...
    @Bean
    public ServletRegistrationBean statViewServlet(){
        StatViewServlet statViewServlet=new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
        //設定使用者密碼
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","521521");
        //設定登入頁面的黑白名單
        registrationBean.addInitParameter("allow","192.168.0.107");
        registrationBean.addInitParameter("deny", "192.168.0.10");
        return registrationBean;
    }
    ...

使用stater去操作durid

步驟
    1.引入stater
        <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid-spring-boot-starter</artifactId>
           <version>1.1.17</version>
        </dependency>    
DruidDataSourceAutoConfigure(Druid資料來源自動配置類中自動注入了以下的類)
各有什麼作用呢
    1.DruidSpringAopConfiguration:(監控的是springbean的)-->配置項是spring.datasource.druid.aop-patterns
    2.DruidStatViewServletConfiguration:監控頁的配置:spring.datasource.druid.stat-view-servlet預設是開啟:(詳解,主要配置的是sql監控頁的登入賬號和密碼,以及允許登入的ip和不允許登入的ip)
    3.DruidWebStatFilterConfiguration:web監控的配置:spring.datasource.druid.web-stat-filter預設是開啟
    4.DruidFilterConfiguration:所有Druid自己filter的配置


1.DruidSpringAopConfiguration說明:(監控的是springbean的)-->配置項是spring.datasource.druid.aop-patterns
    詳細程式碼如下:
        @ConditionalOnProperty({"spring.datasource.druid.aop-patterns"})
        public class DruidSpringAopConfiguration {
            public DruidSpringAopConfiguration() {
            }
            ...
        }
    在application.yaml中配置示例如下:
        spring:
          datasource:
            username: root
            password: 521521
            url: jdbc:mysql://192.168.2.129:3306/jdbc
            driver-class-name: com.mysql.jdbc.Driver
            重點1:會監控com.wmd包下的元件資訊
            druid:
              aop-patterns: com.wmd
              
  2.DruidStatViewServletConfiguration監控頁的配置:spring.datasource.druid.stat-view-servlet預設是開啟
      詳解,主要配置的是sql監控頁的登入賬號和密碼,以及允許登入的ip和不允許登入的ip
          使用示例:
              spring:
                  datasource:
                    username: root
                    password: 521521
                    url: jdbc:mysql://192.168.2.129:3306/jdbc
                    driver-class-name: com.mysql.jdbc.Driver
                    druid:
                      aop-patterns: com.wmd
                      重點1
                      stat-view-servlet:
                        //是否使用:預設是true
                        enabled: true
                        //sql監控頁的登入使用者名稱和密碼
                        login-username: admin
                        login-password: 521521
                        //sql頁登入的白名單和黑名單
                        allow: 192.168.0.107
                        deny: 192.168.0.10
                        
3.DruidWebStatFilterConfiguration:web監控的配置:spring.datasource.druid.web-stat-filter,預設是開啟
    詳解:頁面上web監控的配置選項,監控各路徑訪問次數以及相關資訊
        使用樣例如下:
            spring:
              datasource:
                username: root
                password: 521521
                url: jdbc:mysql://192.168.2.129:3306/jdbc
                driver-class-name: com.mysql.jdbc.Driver
                druid:
                  aop-patterns: com.wmd
                  
                  stat-view-servlet:
                    enabled: true
                    login-username: admin
                    login-password: 521521
                    allow: 192.168.0.107
                    deny: 192.168.0.10
                 重點1:
                  web-stat-filter:
                    //是否開啟:預設是true
                    enabled: true
                    //監控的路徑:監控所有路徑
                    url-pattern: /*
                    //不監控哪些路徑
                    exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
                    

4.DruidFilterConfiguration:所有Durid中filter的自己的配置
    詳情:可以配置以下的多種filter
        public class DruidFilterConfiguration {
            private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";
            private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
            private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
            private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
            private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
            private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
            private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
            private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";
            private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";
            ...
        }
        
    使用樣例:
        spring:
          datasource:
            username: root
            password: 521521
            url: jdbc:mysql://192.168.2.129:3306/jdbc
            driver-class-name: com.mysql.jdbc.Driver
            druid:
              aop-patterns: com.wmd
        
        
              stat-view-servlet:
                enabled: true
                login-username: admin
                login-password: 521521
                allow: 192.168.0.107
                deny: 192.168.0.10
        
              web-stat-filter:
                enabled: true
                url-pattern: /*
                exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
              重點:1
              使用的filter
              filters: stat,wall,slf4j
              使用的filter具體的配置:具體的配置可以參考:https://github.com/alibaba/druid   
              filter:
                stat:
                  log-slow-sql: true
                  slow-sql-millis: 1000
                  enabled: true
                wall:
                  enabled: true
                  config:
                    drop-table-allow: false