SpringBoot09:整合JDBC、Druid、Mybatis

12、整合JDBC、Druid、Mybatis

SpringData簡介

對于數(shù)據(jù)庫訪問,無論是SQL(關(guān)系型數(shù)據(jù)庫)還是NOSQL(非關(guān)系型),SpringBoot底層都是采用Spring Data的方式進(jìn)行 統(tǒng)一處理。

Spring Boot 底層都是采用 Spring Data 的方式進(jìn)行統(tǒng)一處理各種數(shù)據(jù)庫,Spring Data 也是 Spring 中與 Spring Boot、Spring Cloud 等齊名的知名項目。

Sping Data 官網(wǎng):https://spring.io/projects/spring-data

數(shù)據(jù)庫相關(guān)的啟動器 :可以參考官方文檔:

https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter

整合JDBC

創(chuàng)建測試項目測試數(shù)據(jù)源

1、新建一個項目springboot-04-data ,引入相應(yīng)模塊!

2、項目建好之后,發(fā)現(xiàn)自動幫我們導(dǎo)入如下的啟動器

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

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

3、編寫yaml配置文件連接數(shù)據(jù)庫

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3308/vueblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver

4、配置完這一些東西后,我們就可以直接去使用了,因為SpringBoot已經(jīng)默認(rèn)幫我們進(jìn)行了自動配置;去測試類測試一下

@SpringBootTest
class Springboot04DataApplicationTests {

    @Autowired
    DataSource  dataSource;

    @Test
    void contextLoads() throws SQLException {
        //查看一下默認(rèn)數(shù)據(jù)源
        System.out.println(dataSource.getClass());
        //獲得連接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        //關(guān)閉連接
        connection.close();
    }

}

結(jié)果:我們可以看到他默認(rèn)給我們配置的數(shù)據(jù)源為 : class com.zaxxer.hikari.HikariDataSource , 我們并沒有手動配置

我們來全局搜索一下,找到數(shù)據(jù)源的所有自動配置都在 :DataSourceAutoConfiguration文件:

@Import({Hikari.class, Tomcat.class, Dbcp2.class, OracleUcp.class, Generic.class, DataSourceJmxConfiguration.class})
protected static class PooledDataSourceConfiguration {
    protected PooledDataSourceConfiguration() {
    }
}

這里導(dǎo)入的類都在 DataSourceConfiguration 配置類下,可以看出 Spring Boot 2.4.4 默認(rèn)使用HikariDataSource 數(shù)據(jù)源,而以前版本,如 Spring Boot 1.5 默認(rèn)使用 org.apache.tomcat.jdbc.pool.DataSource 作為數(shù)據(jù)源;

HikariDataSource 號稱 Java WEB 當(dāng)前速度最快的數(shù)據(jù)源,相比于傳統(tǒng)的 C3P0 、DBCP、Tomcat jdbc 等連接池更加優(yōu)秀;

可以使用 spring.datasource.type 指定自定義的數(shù)據(jù)源類型,值為 要使用的連接池實現(xiàn)的完全限定名。

關(guān)于數(shù)據(jù)源我們并不做介紹,有了數(shù)據(jù)庫連接,顯然就可以 CRUD 操作數(shù)據(jù)庫了。但是我們需要先了解一個對象 JdbcTemplate

JdbcTemplate

1、有了數(shù)據(jù)源(com.zaxxer.hikari.HikariDataSource),然后可以拿到數(shù)據(jù)庫連接(java.sql.Connection),有了連接,就可以使用原生的 JDBC 語句來操作數(shù)據(jù)庫;

2、即使不使用第三方第數(shù)據(jù)庫操作框架,如 MyBatis等,Spring 本身也對原生的JDBC 做了輕量級的封裝,即JdbcTemplate。

3、數(shù)據(jù)庫操作的所有 CRUD 方法都在 JdbcTemplate 中。

4、Spring Boot 不僅提供了默認(rèn)的數(shù)據(jù)源,同時默認(rèn)已經(jīng)配置好了 JdbcTemplate 放在了容器中,程序員只需自己注入即可使用

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

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

  • execute方法:可以用于執(zhí)行任何SQL語句,一般用于執(zhí)行DDL語句;
  • update方法及batchUpdate方法:update方法用于執(zhí)行新增、修改、刪除等語句;batchUpdate方法用于執(zhí)行批處理相關(guān)語句;
  • query方法及queryForXXX方法:用于執(zhí)行查詢相關(guān)語句;
  • call方法:用于執(zhí)行存儲過程、函數(shù)相關(guān)語句。

測試

編寫一個Controller,注入 jdbcTemplate,編寫測試方法進(jìn)行訪問測試;

package com.sen.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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

@RestController
@RequestMapping("/jdbc")
public class JdbcController {

    /**
     * Spring Boot 默認(rèn)提供了數(shù)據(jù)源,默認(rèn)提供了 org.springframework.jdbc.core.JdbcTemplate
     * JdbcTemplate 中會自己注入數(shù)據(jù)源,用于簡化 JDBC操作
     * 還能避免一些常見的錯誤,使用起來也不用再自己來關(guān)閉數(shù)據(jù)庫連接
     */
    @Autowired
    JdbcTemplate jdbcTemplate;

    //查詢employee表中所有數(shù)據(jù)
    //List 中的1個 Map 對應(yīng)數(shù)據(jù)庫的 1行數(shù)據(jù)
    //Map 中的 key 對應(yīng)數(shù)據(jù)庫的字段名,value 對應(yīng)數(shù)據(jù)庫的字段值
    @GetMapping("/blogs")
    public List<Map<String, Object>> list(){
        String sql = "select * from vueblog.m_blog";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
        return maps;
    }

    //新增一個用戶
    @GetMapping("/add")
    public String addUser(){
        //插入語句,注意時間問題
        String sql = "insert into mybatis.user(id, name, pwd)" +
                " values (4,'小三',123456)";
        jdbcTemplate.update(sql);
        //查詢
        return "addOk";
    }
    //修改用戶信息
    @GetMapping("/update/{id}")
    public String updateUser(@PathVariable("id") int id){
        //插入語句,注意時間問題
        String sql = "update  mybatis.user set  name=? , pwd=? where id="+id ;
        //數(shù)據(jù)
        Object[] objects = new Object[2];
        objects[0] = "小尼姑";
        objects[1] = "123456";

        jdbcTemplate.update(sql,objects);
        //查詢
        return "updateOk";
    }

    //刪除一個用戶
    @GetMapping("/delete/{id}")
    public String addUser(@PathVariable("id") int id){
        //插入語句,注意時間問題
        String sql = "delete from mybatis.user where id=?";
        jdbcTemplate.update(sql,id);
        //查詢
        return "deleteOk";
    }
}

測試請求,結(jié)果正常;

整合Druid【重點】

Druid簡介

Java程序很大一部分要操作數(shù)據(jù)庫,為了提高性能操作數(shù)據(jù)庫的時候,又不得不使用數(shù)據(jù)庫連接池。

Druid 是阿里巴巴開源平臺上一個數(shù)據(jù)庫連接池實現(xiàn),結(jié)合了 C3P0、DBCP 等 DB 池的優(yōu)點,同時加入了日志監(jiān)控。

Druid 可以很好的監(jiān)控 DB 池連接和 SQL 的執(zhí)行情況,天生就是針對監(jiān)控而生的 DB 連接池。

Druid已經(jīng)在阿里巴巴部署了超過600個應(yīng)用,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗。

Spring Boot 2.0 以上默認(rèn)使用 Hikari 數(shù)據(jù)源,可以說 Hikari 與 Driud 都是當(dāng)前 Java Web 上最優(yōu)秀的數(shù)據(jù)源,我們來重點介紹 Spring Boot 如何集成 Druid 數(shù)據(jù)源,如何實現(xiàn)數(shù)據(jù)庫監(jiān)控。

Github地址:https://github.com/alibaba/druid/

com.alibaba.druid.pool.DruidDataSource 基本配置參數(shù)如下:

配置 缺省值 說明
name 配置這個屬性的意義在于,如果存在多個數(shù)據(jù)源,監(jiān)控的時候可以通過名字來區(qū)分開來。如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此屬性至少在1.0.5版本中是不起作用的,強(qiáng)行設(shè)置name會出錯。詳情-點此處。
url 連接數(shù)據(jù)庫的url,不同數(shù)據(jù)庫不一樣。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username 連接數(shù)據(jù)庫的用戶名
password 連接數(shù)據(jù)庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細(xì)看這里
driverClassName 根據(jù)url自動識別 這一項可配可不配,如果不配置druid會根據(jù)url自動識別dbType,然后選擇相應(yīng)的driverClassName
initialSize 0 初始化時建立物理連接的個數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時
maxActive 8 最大連接池數(shù)量
maxIdle 8 已經(jīng)不再使用,配置了也沒效果
minIdle 最小連接池數(shù)量
maxWait 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
poolPreparedStatements false 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標(biāo)的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql下建議關(guān)閉。
maxPoolPreparedStatementPerConnectionSize -1 要啟用PSCache,必須配置大于0,當(dāng)大于0時,poolPreparedStatements自動觸發(fā)修改為true。在Druid中,不會存在Oracle下PSCache占用內(nèi)存過多的問題,可以把這個數(shù)值配置大一些,比如說100
validationQuery 用來檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用。
validationQueryTimeout 單位:秒,檢測連接是否有效的超時時間。底層調(diào)用jdbc Statement對象的void setQueryTimeout(int seconds)方法
testOnBorrow true 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testOnReturn false 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testWhileIdle false 建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。
keepAlive false (1.0.28) 連接池中的minIdle數(shù)量以內(nèi)的連接,空閑時間超過minEvictableIdleTimeMillis,則會執(zhí)行keepAlive操作。
timeBetweenEvictionRunsMillis 1分鐘(1.0.14) 有兩個含義: 1) Destroy線程會檢測連接的間隔時間,如果連接空閑時間大于等于minEvictableIdleTimeMillis則關(guān)閉物理連接。 2) testWhileIdle的判斷依據(jù),詳細(xì)看testWhileIdle屬性的說明
numTestsPerEvictionRun 30分鐘(1.0.14) 不再使用,一個DruidDataSource只支持一個EvictionRun
minEvictableIdleTimeMillis 連接保持空閑而不被驅(qū)逐的最小時間
connectionInitSqls 物理連接初始化的時候執(zhí)行的sql
exceptionSorter 根據(jù)dbType自動識別 當(dāng)數(shù)據(jù)庫拋出一些不可恢復(fù)的異常時,拋棄連接
filters 屬性類型是字符串,通過別名的方式配置擴(kuò)展插件,常用的插件有: 監(jiān)控統(tǒng)計用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
proxyFilters 類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關(guān)系,并非替換關(guān)系

配置數(shù)據(jù)源

1、添上Druid數(shù)據(jù)源依賴

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.5</version>
</dependency>

2、切換數(shù)據(jù)源:之前說 Spring Boot以上 默認(rèn)使用com.zaxxer.hikari.HikariDataSource 數(shù)據(jù)源,但可以 通過 spring.datasource.type 指定數(shù)據(jù)源。

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3308/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource 

3、數(shù)據(jù)源切換之后,在測試類中注入 DataSource,然后獲取到它,輸出一看便知是否成功切換;

4、切換成功!既然切換成功,就可以設(shè)置數(shù)據(jù)源連接初始化大小、最大連接數(shù)、等待時間、最小連接數(shù) 等設(shè)置項;可以查看源碼

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3308/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource


    #Spring Boot 默認(rèn)是不注入這些屬性值的,需要自己綁定
    #druid 數(shù)據(jù)源專有配置
    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

    #配置監(jiān)控統(tǒng)計攔截的filters,stat:監(jiān)控統(tǒng)計、log4j:日志記錄、wall:防御sql注入
    #如果允許時報錯  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #則導(dǎo)入 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

5、導(dǎo)入Log4j 的依賴

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

6、現(xiàn)在需要程序員自己為 DruidDataSource 綁定全局配置文件中的參數(shù),再添加到容器中,而不再使用 Spring Boot 的自動生成了;我們需要 自己添加 DruidDataSource 組件到容器中,并綁定屬性;

package com.sen.config;


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DruidConfig {

    /*
       將自定義的 Druid數(shù)據(jù)源添加到容器中,不再讓 Spring Boot 自動創(chuàng)建
       綁定全局配置文件中的 druid 數(shù)據(jù)源屬性到 com.alibaba.druid.pool.DruidDataSource從而讓它們生效
       @ConfigurationProperties(prefix = "spring.datasource"):作用就是將 全局配置文件中
       前綴為 spring.datasource的屬性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名參數(shù)中
     */
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
}

7、去測試類中測試一下;看是否成功!

package com.sen;

import com.alibaba.druid.pool.DruidDataSource;
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 {
        //查看一下默認(rèn)數(shù)據(jù)源
        System.out.println(dataSource.getClass());
        //獲得連接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
        System.out.println("druidDataSource 數(shù)據(jù)源最大連接數(shù):" + druidDataSource.getMaxActive());
        System.out.println("druidDataSource 數(shù)據(jù)源初始化連接數(shù):" + druidDataSource.getInitialSize());

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

}

輸出結(jié)果 :可見配置參數(shù)已經(jīng)生效!

配置Druid數(shù)據(jù)源監(jiān)控

Druid 數(shù)據(jù)源具有監(jiān)控的功能,并提供了一個 web 界面方便用戶查看,類似安裝 路由器 時,人家也提供了一個默認(rèn)的 web 頁面。

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

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

    // 這些參數(shù)可以在 com.alibaba.druid.support.http.StatViewServlet
    // 的父類 com.alibaba.druid.support.http.ResourceServlet 中找到
    Map<String, String> initParams = new HashMap<>();
    initParams.put("loginUsername", "admin"); //后臺管理界面的登錄賬號
    initParams.put("loginPassword", "123456"); //后臺管理界面的登錄密碼

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

    //設(shè)置初始化參數(shù)
    bean.setInitParameters(initParams);
    return bean;
}

配置完畢后,我們可以選擇訪問 :http://localhost:8080/druid/login.html

配置 Druid web 監(jiān)控 filter 過濾器

//配置 Druid 監(jiān)控 之  web 監(jiān)控的 filter
//WebStatFilter:用于配置Web和Druid數(shù)據(jù)源之間的管理關(guān)聯(lián)監(jiān)控統(tǒng)計
@Bean
public FilterRegistrationBean webStatFilter() {
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new WebStatFilter());

    //exclusions:設(shè)置哪些請求進(jìn)行過濾排除掉,從而不進(jìn)行統(tǒng)計
    Map<String, String> initParams = new HashMap<>();
    initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
    bean.setInitParameters(initParams);

    //"/*" 表示過濾所有請求
    bean.setUrlPatterns(Arrays.asList("/*"));
    return bean;
}

平時在工作中,按需求進(jìn)行配置即可,主要用作監(jiān)控!

整合Mybatis【重點】

官方文檔:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

Maven倉庫地址:https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter/2.1.1

整合測試

1、導(dǎo)入Mybatis所需要的依賴

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>

2、配置數(shù)據(jù)庫連接信息

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3308/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource


    #Spring Boot 默認(rèn)是不注入這些屬性值的,需要自己綁定
    #druid 數(shù)據(jù)源專有配置
    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

    #配置監(jiān)控統(tǒng)計攔截的filters,stat:監(jiān)控統(tǒng)計、log4j:日志記錄、wall:防御sql注入
    #如果允許時報錯  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #則導(dǎo)入 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
    #整合mybatis
mybatis:
  type-aliases-package: com.sen.entity
  mapper-locations: classpath:mybatis/mapper/*.xml

3、測試數(shù)據(jù)庫是否連接成功!

@Test
void contextLoads() throws SQLException {
    //查看一下默認(rèn)數(shù)據(jù)源
    System.out.println(dataSource.getClass());
    //獲得連接
    Connection connection = dataSource.getConnection();
    System.out.println(connection);

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

4、創(chuàng)建實體類,導(dǎo)入 Lombok!

package com.sen.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    
    private Integer id;
    private String name;
}

5、創(chuàng)建mapper目錄以及對應(yīng)的 Mapper 接口

TeacherMapper.xml

<?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">

<mapper namespace="com.sen.mapper.TeacherMapper">

    <select id="getTeachers" resultType="Teacher">
        select * from mybatis.teacher;
    </select>

    <select id="getTeacherById" resultType="Teacher" parameterType="int">
        select * from mybatis.teacher where id = #{id};
    </select>

</mapper>

7、maven配置資源過濾問題

<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

8、在application.yaml中配置mybatis

#配置mybatis
mybatis:
  #指定xml掃描路徑
  mapper-locations: classpath:com/sen/mapper/*.xml
  #指定掃描別名下的包
  type-aliases-package: com.sen.entity

9、編寫 TeacherController 進(jìn)行測試!

package com.sen.controller;

import com.sen.entity.Teacher;
import com.sen.mapper.TeacherMapper;
import org.springframework.beans.factory.annotation.Autowired;
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;

@RestController
public class TeacherController {

    @Autowired
    TeacherMapper teacherMapper;

    //獲取所有部門信息
    @GetMapping("/getTeachers")
    public List<Teacher> getTeachers(){
        return  teacherMapper.getTeachers();
    }

    //通過id獲得部門
    @GetMapping("/getTeacher/{id}")
    public Teacher getTeacherById(@PathVariable("id") Integer id){
        return teacherMapper.getTeacherById(id);
    }
}

**啟動項目訪問進(jìn)行測試!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容