SpringBoot:配置數據源詳解


學習鏈接

學習視頻鏈接:小狂神Springboot

SpringData

對於數據訪問層,無論是nosql還是sql數據庫,SpringBoot的底層都是用Springdata去統一處理

SpringBoot:Springdata的官方文檔地址:

https://spring.io/projects/spring-data

新項目:Spring-boot-data

項目搭建完成后肯定導入相關啟動器,

之后是數據源的配置:

  1. 使用學習mybtis的數據庫,配置相關yml

  2. SpringBoot的默認是用的mysql8,所以如果出現時區報錯,那么我們就添加時區,

    serverTimezone="UTC"來解決異durid

druid

durid的常用配置參數

配置 缺省值 說明
name 配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。 如果沒有配置,將會生成一個名字,格式是:“DataSource-” + System.identityHashCode(this)
jdbcUrl 連接數據庫的url,不同數據庫不一樣。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username 連接數據庫的用戶名
password 連接數據庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
driverClassName 根據url自動識別 這一項可配可不配,如果不配置druid會根據url自動識別dbType,然后選擇相應的driverClassName(建議配置下)
initialSize 0 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時
maxActive 8 最大連接池數量
maxIdle 8 已經不再使用,配置了也沒效果
minIdle 最小連接池數量
maxWait 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,並發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
poolPreparedStatements false 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。
maxOpenPreparedStatements -1 要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100
validationQuery 用來檢測連接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。
testOnBorrow true 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testOnReturn false 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
testWhileIdle false 建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
timeBetweenEvictionRunsMillis 有兩個含義: 1) Destroy線程會檢測連接的間隔時間2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
numTestsPerEvictionRun 不再使用,一個DruidDataSource只支持一個EvictionRun
minEvictableIdleTimeMillis
connectionInitSqls 物理連接初始化的時候執行的sql
exceptionSorter 根據dbType自動識別 當數據庫拋出一些不可恢復的異常時,拋棄連接
filters 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監控統計用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
proxyFilters 類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關系,並非替換關系
  1. 配置druid步驟

    1. 導入相關依賴,

    2. 配置對應的數據源

      1. 對應配置文件

        spring:
          datasource:
            driver-class-name: com.mysql.jdbc.Driver
            password: xxx
            username: xxx
            url: jdbc:mysql://localhost:3306/mybatis #?serverTimezone=UTC&useUnicode=true&charcterEncoding=UTF-8
            type: com.alibaba.druid.pool.DruidDataSource
        
        
  2. 去將我們的增刪改查方法測試一下就好了,用的是jdbc模版,由boot提供:jdbcTemplate

package com.hyc.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
public class Datacontroller {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @RequestMapping("/userlist")
    public List<Map<String,Object>> userlist(){
        String sql = "select * from mybatis.user";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
        return  maps;
    }
    
    @RequestMapping("/addUser")
    public String addUser(){
        String sql = "insert into mybatis.user(id,name,pwd) values(1,'小胡','123456')";
        jdbcTemplate.update(sql);
        return "insert";
    }
    
    @RequestMapping("/upddateUser/{id}")
    public String upddateUser(@PathVariable("id") int id){
        String sql = "update mybatis.user set name=?,pwd=? where id ="+id;
        Object[] obj = new Object[2];
        obj[0] = "小明";
        obj[1] = "66666";
        jdbcTemplate.update(sql,obj);
        return "update";
    }
    
    @RequestMapping("/DeleteUser/{id}")
    public String DeleteUser(@PathVariable("id") int id){
        String sql = "delete from mybatis.user where id=? ";
        jdbcTemplate.update(sql,id);
        return "DeleteUser";
    }
}

YML配置druid常用的一些配置

  #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

    #配置監控統計攔截的filters,stat:監控統計、log4j:日志記錄、wall:防御sql注入
    #如果允許報錯,java.lang.ClassNotFoundException: org.apache.Log4j.Properity
    #則導入log4j 依賴就行
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

配置sql監控,和過濾請求:這里注意不要私自改動:loginusername等key

package com.hyc.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.servlet.ServletRegistration;
import javax.sql.DataSource;
import java.util.HashMap;

@Configuration
public class DruidConfing {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }
    //后台監控

    @Bean
    public ServletRegistrationBean ServletRegistrationBean(){
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        HashMap<String, String> InitParameters = new HashMap<>();
        InitParameters.put("loginUsername","admin");
        InitParameters.put("loginPassword","123456");
        InitParameters.put("allow","");
        //后台監控
        bean.setInitParameters(InitParameters);
        return  bean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        //可以過濾那些請求?
        bean.setFilter(new WebStatFilter());
        bean.addUrlPatterns("/*");
        bean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return bean;
    }
}

SpringBoot整合mybatis

准備工作,

尋找依賴

        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

去創建使用mybatis的需要文件,

實體類:user

mapper接口:usermapper

配置文件:usermapper.xml

創建完畢后我們去boot的配置文件配置mybatis:

#mybatis配置
mybatis.config-location=classpath:mapper/*.xml
mybatis.type-aliases-package=com.hyc.pojo

用mybatis的注解來 映射,實體類:

package com.hyc.mapper;

import com.hyc.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;
@Mapper
@Repository
public interface userMapper {

    List<User> getuser();

    User getuserByid(int id);

    int addUser(User user);

    int UpdUser(User user);

    int DelUser(int id);
}

之后編寫映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 寫入 自己 dao 里的接口名稱-->
<mapper namespace="com.hyc.mapper.userMapper">

    <insert id="addUser">
        insert into mybatis.user(id, name, pwd) VALUES (#{id},#{name},#{pwd});
    </insert>

    <update id="UpdUser">
        update mybatis.user
        set user.name = #{name},user.pwd =#{pwd}
        where id = #{id};
    </update>

    <delete id="DelUser">
        delete from  mybatis.user where id=#{id}
    </delete>

    <select id="getuser" resultType="com.hyc.pojo.User">
        select * from mybatis.user
    </select>

    <select id="getuserByid" resultType="com.hyc.pojo.User">
        select *
        from mybatis.user where id=#{id};
    </select>
</mapper>

編寫控制層測試:

@RestController
public class usercontroller {
    @Autowired
    private userMapper userMapper;
    @RequestMapping("/queryList")
    public List<User> queryList(){
        List<User> getuser = userMapper.getuser();
        for (User user : getuser) {
            System.out.println(user);
        }
        return getuser;
    }
}

之后去啟動類上掃描mapper包的注解即可


@SpringBootApplication
@MapperScan(value = "com.hyc.mapper")
public class musicserver8888Main {
    public static void main(String[] args) {
        SpringApplication.run(musicserver8888Main.class,args);
    }
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM