主頁 > 軟體設計 > SpringBoot:Mybatis + Druid 資料訪問

SpringBoot:Mybatis + Druid 資料訪問

2021-10-26 08:31:49 軟體設計

SpringBoot:Mybatis + Druid 資料訪問

文章目錄

  • SpringBoot:Mybatis + Druid 資料訪問
      • 1、簡介
      • 2、JDBC
      • 3、CRUD操作
      • 4、自定義資料源 DruidDataSource
        • 1、配置 Druid 資料源監控
        • 2、配置 Druid web 監控 filter
      • 5、SpringBoot 整合mybatis

1、簡介

? 對于資料訪問層,無論是SQL(關系型資料庫) 還是NOSQL(非關系型資料庫),SpringBoot 底層都是采用 SpringData 的方式進行統一處理,

? Spring Boot 底層都是采用 SpringData 的方式進行統一處理各種資料庫,SpringData也是Spring中與SpringBoot、SpringCloud 等齊名的知名專案,

SpingData 官網:https://spring.io/projects

資料庫相關的啟動器 : 可以參考官方檔案:https://docs.spring.io/springboot/docs/2.1.7.RELEASE/reference/htmlsingle/#using-boot-starter

2、JDBC

新建一個專案測驗:springboot-data; 引入相應的模塊!基礎模塊

img

專案建好之后,發現自動幫我們匯入了如下的啟動器:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

實作資料庫的訪問

  1. 先連接上資料庫 , 直接使用IDEA連接即可【操作】

  2. SpringBoot中,我們只需要簡單的配置就可以實作資料庫的連接了;

我們使用yaml的組態檔進行操作!

spring:
  datasource:
    username: root
    password: 123456
    #?serverTimezone=UTC解決時區的報錯
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8

配置完這一些東西后,就可以直接去使用了,因為SpringBoot已經默認幫我們進行了自動配置;我們去測驗類測驗一下

package com.kk;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@SpringBootTest
class Springboot04DataApplicationTests {

    @Autowired
    DataSource dataSource;
    @Test
    void contextLoads() throws SQLException {
        //查看默認的資料源 class com.zaxxer.hikari.HikariDataSource   dbcp
        System.out.println(dataSource.getClass());
        //獲得資料庫連接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();


    }

}

在運行的時候可能會遇到的Bug

SpringBoot 中 Invalid character found in the request target 例外

在啟動類中添加

@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
        @Override
        public void customize(Connector connector) {
            connector.setProperty("relaxedQueryChars", "|{}[]");
        }
    });
    return factory;
}

? 輸出結果:可以看到它默認給我們配置的資料源為 : class com.zaxxer.hikari.HikariDataSource , 我們并沒有手動配置

? 全域搜索一下,找到資料源的所有自動配置都在 :DataSourceProperties 檔案下;這里自動配置的原理以及能配置哪些屬性?

  • Spring Boot 2.1.7 默認使用 com.zaxxer.hikari.HikariDataSource 資料源,
  • 而以前版本,如 Spring Boot 1.5 默認使用 org.apache.tomcat.jdbc.pool.DataSource 作為資料源;

HikariDataSource 號稱 Java WEB 當前速度最快的資料源,相比于傳統的 C3P0 、DBCP、Tomcat jdbc 等連接池更加優秀;

有了資料庫連接,顯然就可以 CRUD 操作資料庫了,

3、CRUD操作

? 1、有了資料源(com.zaxxer.hikari.HikariDataSource),可以拿到資料庫連接(java.sql.Connection),有了連接,就可以使用連接和原生的 JDBC 陳述句來操作資料庫

? 2、即使不使用第三方第資料庫操作框架,如 MyBatis等,Spring 本身也對原生的JDBC 做了輕量級的封裝,即 org.springframework.jdbc.core.JdbcTemplate,

? 3、資料庫操作的所有 CRUD 方法都在 JdbcTemplate 中,

? 4、Spring Boot 不僅提供了默認的資料源,同時默認已經配置好了 JdbcTemplate 放在了容器中,程式員只需自己注入即可使用

? 5、JdbcTemplate 的自動配置原理是依賴 org.springframework.boot.autoconfigure.jdbc 包下的 org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration 類

JdbcTemplate主要提供以下幾類方法:

  1. execute方法:可以用于執行任何SQL陳述句,一般用于執行DDL陳述句;
  2. update方法及batchUpdate方法:update方法用于執行新增、修改、洗掉等陳述句;batchUpdate方法用于執行批處理相關陳述句;
  3. query方法及queryForxxx方法:用于執行查詢相關陳述句;
  4. call方法:用于執行存盤程序、函式相關陳述句,

測驗:

package com.kk.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 {
    
    //JdbcTemplate 是 core 包的核心類,用于簡化 JDBC操作,還能避免一些常見的錯誤,如忘記關閉資料庫連接
    //Spring Boot 默認提供了資料源,默認提供了 org.springframework.jdbc.core.JdbcTemplate
    //JdbcTemplate 中會自己注入資料源,使用起來也不用再自己來關閉資料庫連接
    @Autowired
    JdbcTemplate jdbcTemplate;
    
   	//查詢資料庫的所有資訊
    //沒有物體類,資料庫中的東西怎么獲取? Map
   	//List 中的1個 Map 對應資料庫的 1行資料
    //Map 中的 key 對應資料庫的欄位名,value 對應資料庫的欄位值
    @GetMapping("/userList")
    public List<Map<String ,Object>> userList(){
        String sql="select * from user";
        List<Map<String, Object>> list_maps = jdbcTemplate.queryForList(sql);
        return list_maps;
    }

    @GetMapping("/addUser")
    public String addUser(){
        String sql="insert into mybatis.user(id,name,pwd) values(2,'dabai','123456')";
       jdbcTemplate.update(sql);
        return "update-ok";
    }

    @GetMapping("/updateUser/{id}")
    public String updateUser(@PathVariable("id") int id){
        String sql="update mybatis.user set name=?,pwd=? where id="+id;
        //封裝
        Object[] objects = new Object[2];
        objects[0]="xiaobai";
        objects[1]="9999999";
        jdbcTemplate.update(sql,objects);
        return "updateUser-ok";
    }

    @GetMapping("/deleteUser/{id}")
    public String deleteUser(@PathVariable("id") int id){
        String sql="delete from mybatis.user where id=?";
        jdbcTemplate.update(sql,id);
        return "deleteUser-ok";
    }
}

測驗成功!

原理探究 :

org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration 資料源配置類作用 :根據邏輯判斷之后,添加資料源;

SpringBoot默認支持以下資料源:

  1. com.zaxxer.hikari.HikariDataSource (Spring Boot 2.0 以上,默認使用此資料源)

  2. org.apache.tomcat.jdbc.pool.DataSource

  3. org.apache.commons.dbcp2.BasicDataSource

    可以使用 spring.datasource.type 指定自定義的資料源型別,值為要使用的連接池實作的完全限定名,默認情況下,它是從類路徑自動檢測的,

	 @Configuration
    @ConditionalOnMissingBean({DataSource.class})
    @ConditionalOnProperty(
        name = {"spring.datasource.type"}
    )
    static class Generic {
        Generic() {
        }

        @Bean
        public DataSource dataSource(DataSourceProperties properties) {
            return properties.initializeDataSourceBuilder().build();
        }
    }

4、自定義資料源 DruidDataSource

DRUID 簡介

  1. ? Druid 是阿里巴巴開源平臺上一個資料庫連接池實作,結合了 C3P0、DBCP、PROXOOL 等 DB 池的優點,同時 加入了日志監控,
  2. ? Druid 可以很好的監控 DB 池連接和 SQL 的執行情況,天生就是針對監控而生的 DB 連接池,
  3. ? Spring Boot 2.0 以上默認使用 Hikari 資料源,可以說 Hikari 與 Driud 都是當前 Java Web 上最優秀的資料源,我們 來重點介紹 Spring Boot 如何集成 Druid 資料源,如何實作資料庫監控,

*com.alibaba.druid.pool.DruidDataSource 基本配置引數如下:*

配置預設值說明
name配置這個屬性的意義在于,如果存在多個資料源,監控的時候可以通過名字來區分開來, 如果沒有配置,將會生成一個名字,格式是:“DataSource-” + System.identityHashCode(this). 另外配置此屬性至少在1.0.5版本中是不起作用的,強行設定name會出錯 詳情-點此處,
url連接資料庫的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/使用ConfigFilter
driverClassName根據url自動識別這一項可配可不配,如果不配置druid會根據url自動識別dbType,然后選擇相應的driverClassName
initialSize0初始化時建立物理連接的個數,初始化發生在顯示呼叫init方法,或者第一次getConnection時
maxActive8最大連接池數量
maxIdle8已經不再使用,配置了也沒效果
minIdle最小連接池數量
maxWait獲取連接時最大等待時間,單位毫秒,配置了maxWait之后,預設啟用公平鎖,并發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖,
poolPreparedStatementsfalse是否快取preparedStatement,也就是PSCache,PSCache對支持游標的資料庫性能提升巨大,比如說oracle,在mysql下建議關閉,
maxOpenPreparedStatements-1要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true,在Druid中,不會存在Oracle下PSCache占用記憶體過多的問題,可以把這個數值配置大一些,比如說100
validationQuery用來檢測連接是否有效的sql,要求是一個查詢陳述句,如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用,
validationQueryTimeout單位:秒,檢測連接是否有效的超時時間,底層呼叫jdbc Statement物件的void setQueryTimeout(int seconds)方法
testOnBorrowtrue申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能,
testOnReturnfalse歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
testWhileIdlefalse建議配置為true,不影響性能,并且保證安全性,申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效,
timeBetweenEvictionRunsMillis1分鐘(1.0.14)有兩個含義: 1) Destroy執行緒會檢測連接的間隔時間,如果連接空閑時間大于等于minEvictableIdleTimeMillis則關閉物理連接 2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
numTestsPerEvictionRun不再使用,一個DruidDataSource只支持一個EvictionRun
minEvictableIdleTimeMillis30分鐘(1.0.14)連接保持空閑而不被驅逐的最長時間
connectionInitSqls物理連接初始化的時候執行的sql
exceptionSorter根據dbType自動識別當資料庫拋出一些不可恢復的例外時,拋棄連接
filters屬性型別是字串,通過別名的方式配置擴展插件,常用的插件有: 監控統計用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
proxyFilters型別是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關系,并非替換關系

引入資料源

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.6</version>
</dependency>

查看專案依賴,匯入成功!

img

切換資料源;

? 之前已經說過 Spring Boot 2.0 以上默認使用 com.zaxxer.hikari.HikariDataSource 資料源,可以通過 spring.datasource.type 指定資料源,

type: com.alibaba.druid.pool.DruidDataSource

img

設定資料源連接初始化大小、最大連接數、等待時間、最小連接數 等設定項;

#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

log4****日志依賴

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

測驗

public class SpringbootDemoDataApplicationTests {

    //注入資料源
    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() throws SQLException {
        //看一下默認資料源
        System.out.println(dataSource.getClass());
        //獲得連接
        Connection connection =   dataSource.getConnection();
        System.out.println(connection);

        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
        System.out.println("druidDataSource 資料源最大連接數:" + druidDataSource.getMaxActive());
        System.out.println("druidDataSource 資料源初始化連接數:" + druidDataSource.getInitialSize());

        //關閉連接
        connection.close();
    }

}

測驗成功!

1、配置 Druid 資料源監控

? Druid 資料源具有監控的功能,并提供了一個web界面方便用戶查看,類似安裝路由器 時,它也提供了一個默認的 web 頁面,

? 所以第一步需要設定 Druid 的后臺管理頁面,比如登錄賬號、密碼等配置后臺管理;

package com.kk.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.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")  //關聯application.yaml中的spring.datasource
    @Bean
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }

    //配置 Druid 監控管理后臺的Servlet;
    //內置 Servler 容器時沒有web.xml檔案,所以使用 Spring Boot 的注冊 Servlet 方式
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

        Map<String, String> initParams = new HashMap<>();
        initParams.put("loginUsername", "admin"); //后臺管理界面的登錄賬號
        initParams.put("loginPassword", "123456"); //后臺管理界面的登錄密碼

        //后臺允許誰可以訪問
        //initParams.put("allow", "localhost"):表示只有本機可以訪問
        //initParams.put("allow", ""):為慷訓者為null時,表示允許所有訪問
        initParams.put("allow", "");
        //deny:Druid 后臺拒絕誰訪問
        //initParams.put("kuangshen", "192.168.1.20");表示禁止此ip訪問

        //設定初始化引數
        bean.setInitParameters(initParams);
        return bean;
        //這些引數可以在 com.alibaba.druid.support.http.StatViewServlet 的父類 com.alibaba.druid.support.http.ResourceServlet 中找到
    }



    //filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new WebStatFilter());

        //可以過濾哪些請求?
        HashMap<String, String> initParameters = new HashMap<>();
        //這些東西不進行統計
        initParameters.put("exclusions","*.js,*.css,/druid/*");


        bean.setInitParameters(initParameters);
        return bean;
    }
}

測驗訪問! http://localhost:8080/druid/login.html

img

img

img

2、配置 Druid web 監控 filter

? 這個過濾器的作用就是統計 web 應用請求中所有的資料庫資訊,比如 發出的 sql 陳述句,sql 執行的時間、請求次數、請求的 url 地址、以及seesion 監控、資料庫表的訪問次數 等等,

//filter
@Bean
public FilterRegistrationBean webStatFilter(){
    FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new WebStatFilter());

    //可以過濾哪些請求?
    HashMap<String, String> initParameters = new HashMap<>();
    //這些東西不進行統計
    initParameters.put("exclusions","*.js,*.css,/druid/*");


    bean.setInitParameters(initParameters);
    return bean;
}

img

執行sql

img

執行sql之后會有記錄

img

5、SpringBoot 整合mybatis

1. 匯入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>

2.配置資料庫連接資訊

# 資料庫驅動:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 資料源名稱
spring.datasource.name=defaultDataSource
# 資料庫連接地址
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
# 資料庫用戶名&密碼:
spring.datasource.username=root
spring.datasource.password=123456

測驗一下連接是否成功!

package com.kk;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.SQLException;

@SpringBootTest
class Springboot05MybatisApplicationTests {

    @Autowired
    DataSource dataSource;
    @Test
    void contextLoads() throws SQLException {
        System.out.println(dataSource.getClass());
        System.out.println(dataSource.getConnection());
    }

}

測驗成功!

3,創建物體類

package com.kk.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

4.配置Mapper介面類

package com.kk.mapper;

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

import java.util.List;

//這個注解表示 這是一個mybatis 的mapper類
@Mapper  //controller層
@Repository  //spring
public interface UserMapper {



    List<User> queryUserList();

    User queryUserById(int id);

    int addUser(User user);

    int updateUser(User user);

    int deleteUser(int id);




}

5.撰寫controller

package com.kk.controller;

import com.kk.mapper.UserMapper;
import com.kk.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/queryUserList")
    public List<User> queryUserList(){
        List<User> userList = userMapper.queryUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        return userList;
    }

    //根據id選擇用戶
    @GetMapping("/queryUserById")
    public String selectUserById(){
        User user = userMapper.queryUserById(1);
        System.out.println(user);
        return "ok";
    }
    //添加一個用戶
    @GetMapping("/addUser")
    public String addUser(){
        userMapper.addUser(new User(1,"大黃","9999999"));
        userMapper.addUser(new User(3,"大黃","9999999"));
        userMapper.addUser(new User(4,"大黃","9999999"));

        return "ok";
    }
    //修改一個用戶
    @GetMapping("/updateUser")
    public String updateUser(){
        userMapper.updateUser(new User(5,"黃毛","999999"));
        return "ok";
    }
    //根據id刪除用戶
    @GetMapping("/deleteUser")
    public String deleteUser(){
        userMapper.deleteUser(5);
        return "ok";
    }
}

img

6.SpringBoot 整合

? 以前 MyBatis 未與 spring 整合時,配置資料源、事務、連接資料庫的賬號、密碼等都是在 myBatis 核心組態檔中進行的
? myBatis 與 springboot 整合后,配置資料源、事務、連接資料庫的賬號、密碼等就交由 spring 管理,因此,在這里我們即使不使用mybatis組態檔也完全ok!
既然已經提供了 myBatis 的映射組態檔,就需要告訴 spring boot 這些檔案的位置

# 整合mybatis
# 設定別名以及設定能讓spring識別
#指定myBatis的核心組態檔與Mapper映射檔案
# 注意:對應物體類的路徑
mybatis.type-aliases-package=com.kk.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

? springboot 官方并沒有提供 myBaits 的啟動器,是 myBatis 官方提供的開發包來適配的 spring boot,從 pom.xml 檔案中的依賴包名也能看出來,并非是以 spring-boot 開頭的;

? 同理上面全域組態檔中的這兩行配置也是以 mybatis 開頭 而非 spring 開頭也充分說明這些都是 myBatis 官方提供的

從 org.mybatis.spring.boot.autoconfigure.MybatisProperties 中查看所有配置項

@ConfigurationProperties(
    prefix = "mybatis"
)
public class MybatisProperties {
    public static final String MYBATIS_PREFIX = "mybatis";
    private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
    private String configLocation;
    private String[] mapperLocations;
    private String typeAliasesPackage;
    private Class<?> typeAliasesSuperType;
    private String typeHandlersPackage;
    private boolean checkConfigLocation = false;
    private ExecutorType executorType;
    private Class<? extends LanguageDriver> defaultScriptingLanguageDriver;
    private Properties configurationProperties;
    @NestedConfigurationProperty
    private Configuration configuration;

ybatis"
)
public class MybatisProperties {
public static final String MYBATIS_PREFIX = “mybatis”;
private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
private String configLocation;
private String[] mapperLocations;
private String typeAliasesPackage;
private Class<?> typeAliasesSuperType;
private String typeHandlersPackage;
private boolean checkConfigLocation = false;
private ExecutorType executorType;
private Class<? extends LanguageDriver> defaultScriptingLanguageDriver;
private Properties configurationProperties;
@NestedConfigurationProperty
private Configuration configuration;


 [官方檔案](

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/336281.html

標籤:其他

上一篇:自學Java半年多,我掌握了這些技術!!!

下一篇:最簡二分模板(秒殺Leetcode大部分二分題目)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more