SpringBoot+Spring+MyBatis相關知識點

目錄

?

一、相關概念

1.spring框架

2.springcloud

3.SpringBoot項目

4.注解

5.SpringBoot的文件結構

6.啟動類原理

二、相關操作

1.Jar方式打包

2.自定義返回的業務狀態碼

?3.Jackson

4.加載配置文件

5.異常處理

三、優化配置

?1.簡化sql語句

2.查詢操作

復雜查詢

?一對一聯表查詢

一對多聯表查詢

小結


?

一、相關概念

1.spring框架

也可稱為DI,IoC,AOP框架,相當于是一個容器,每一個對象就是一個bean

對于項目構建過程:Controller -> Service -> Dao

未用框架時,需要實例化service實現類來調用方法

private UserService userService = new UserService();

使用Spring框架后,可通過注解來實現自動裝配對象

@Autowire

private UserService userService

2.springcloud

是基于springboot, 只不過是在之前基礎上多了幾個插件包

3.SpringBoot項目

SpringBoot是一個通過注解簡化配置的web開發框架。

有兩種創建方式:

本地創建-先創建一個普通maven項目,再參考官方文檔:Getting Started | Building an Application with Spring Boot

添加相關maven依賴;

在線創建 -https://start.spring.io/

開發JSON接口,可通過@RestController注解實現,可將要顯示的數據序列化成JSON對象.

4.注解

本質是繼承Annotation接口,起到說明、配置的作用

常見注解:

@Controller用于標記類是一個控制器,返回頁面的時使用,但如果要返回JSON,需要再添加@ResponseBody

@RestController 用于標記類是一個控制器,并返回JSON數據,實現接口返回數據會被序列化為JSON,相當于@Controller+@ResponseBody

@RequestMapping 設置路由映射,為某個方法設置子路徑

@GetMapping用于設置get請求查詢接口的路徑,相當于@RequestMapping(method = RequestMethod.GET)

同理有

@PostMapping = @RequestMapping(method = RequestMethod.POST) @PutMapping = @RequestMapping(method = RequestMethod.PUT)

@DeleteMapping = @RequestMapping(method = RequestMethod.DELETE)

@SpringBootApplication 用于標記是SringBoot應用,里面包含多個子注解,相當于@Configuration(spring掃描注入)+@EnableAutoConfiguration(自動載入所需Bean)+@ComponentScan(spring掃描包的范圍)

@Component標記這個是一個組件,相當于在啟動類中添加@Bean,new一個對象

@Scheduled注解是一個定時任務注解,可以在方法上添加,表示這個方法是一個定時任務方法

5.SpringBoot的文件結構

  • src/main/java:存放代碼
  • src/main/resources:存放靜態資源
  • static: 存放靜態文件,比如 css、js、image, (訪問方式?http://localhost:8080/js/main.js)
  • templates:存放靜態頁面jsp,html,tpl
  • config:存放配置文件,application.properties

靜態文件加載順序

META/resources ----->resources -------->static ------->public

6.啟動類原理

啟動類和controller分開存放,啟動類要放在根目錄下,在啟動類上只需要注解@SpringBootApplication

二、相關操作

1.Jar方式打包

只需在pom.xml文件中添加插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>?
如果沒有加,則執行jar包 ,報錯如下
java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar
no main manifest attribute, in spring-boot-demo-0.0.1-SNAPSHOT.jar

打包與啟動命令

  • 構建:mvn install

target目錄下的jar包就是打包后項目

  • 進到對應的target
  • 目錄啟動 java -jar xxxxx.jar
  • 保持后臺運行,守護進程 nohup java -jar xxx.jar &(但windows下沒有,只能在linux或mac下運行實現)

2.自定義返回的業務狀態碼

在utils包下添加JSONData工具類實現

package net.xdclass.demoproject.utils;/*** 接口返回工具類*/
public class JsonData {private int code;private Object data;private String msg;public int getCode() {return code;}public void setCode(int code) {this.code = code;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public JsonData(){}public JsonData(int code, Object data){this.code = code;this.data = data;}public JsonData(int code, Object data, String msg){this.code = code;this.data =data;this.msg = msg;}public static JsonData buildSuccess(Object data){return new JsonData(0,data);}public static JsonData buildError(String msg){return new JsonData(-1,"",msg);}public static JsonData buildError(String msg,int code){return new JsonData(code,"",msg);}@Overridepublic String toString() {return "JsonData{" +"code=" + code +", data=" + data +", msg='" + msg + '\'' +'}';}
}

在controller層中直接調用即可

//將返回的list對象用工具類封裝成json格式的字符串返回給前端
return JsonData.buildSuccess(video);

?3.Jackson

jackson注解,處理相關自動

@JsonIgnore(指定字段不返回)、@JsonFormat(pattern="yyyy-MM-dd hh:mm:ss",locale="zh",timezone="GMT+8")(指定日期格式)、@JsonInclude(Include.NON_NULL)(空字段不返回)、@JsonProperty(指定別名)

序列化和反序列化操作

      //序列化操作ObjectMapper objectMapper = new ObjectMapper();String jsonStr = objectMapper.writeValueAsString(list);System.out.println(jsonStr);//反序列化操作List<Video> temp = objectMapper.readValue(jsonStr,List.class);

4.加載配置文件

方式一

  • Controller中通過注解指定資源路徑(@PropertySource({"classpath:resource.properties"}))
  • 增加屬性@Value("${test.name}") private String name;

方式二:

創建一個實體類配置文件WXConfig

package net.xdclass.demoproject.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;import java.io.Serializable;@Configuration//表示這是一個配置類,用于加載配置文件中的屬性值,會被Spring容器掃描
@PropertySource(value="classpath:pay.properties")
public class WXConfig implements Serializable {@Value("${wxpay.appid}")//從配置文件中獲取屬性值,并賦值給payAppid//或者@Value("${wxpay.appid}")private String payAppid;@Value("${wxpay.secret}")private String paySecret;@Value("${wxpay.mechid}")private String payMechId;public String getPayAppid() {return payAppid;}public void setPayAppid(String payAppid) {this.payAppid = payAppid;}public String getPaySecret() {return paySecret;}public void setPaySecret(String paySecret) {this.paySecret = paySecret;}public String getPayMechId() {return payMechId;}public void setPayMechId(String payMechId) {this.payMechId = payMechId;}
}

在TestController中引入

package net.xdclass.demoproject.controller;import net.xdclass.demoproject.config.WXConfig;
import net.xdclass.demoproject.task.AsyncTask;
import net.xdclass.demoproject.utils.JsonData;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;@RestController
@RequestMapping("api/v1/test")
@PropertySource({"classpath:pay.properties"})//在classpath目錄下查找配置文件的路徑
public class TestController {@Value("${wxpay.appid}")//從配置文件中獲取屬性值,并賦值給payAppid
//    @Value("${wxpay.appid}")//方式2private String payAppid;@Value("${wxpay.secret}")private String paySecret;@Autowired//會自動將WXConfig對象注入到TestController對象中private WXConfig wxConfig;@GetMapping("get_config")public JsonData testConfig(){Map<String,String> map = new HashMap<>();
//        map.put("appid",payAppid);
//        map.put("secret",paySecret);
//
//        return JsonData.buildSuccess(map);//通過配置類獲取屬性值,并封裝成map對象返回給前端map.put("appid",wxConfig.getPayAppid());map.put("secret",wxConfig.getPaySecret());map.put("mechid",wxConfig.getPayMechId());return JsonData.buildSuccess(map);//將返回的map對象用工具類封裝成json格式的字符串返回給前端}}

在postman中可通過接口來訪問得到數據,來模擬客戶端

?

5.異常處理

全局異常處理實現

創建一個全局異常處理類

  • 類添加注解

@ControllerAdvice,如果需要返回json數據,則方法需要加@ResponseBody

@RestControllerAdvice, 默認返回json數據,方法不需要加@ResponseBody

  • 方法添加處理器

@ExceptionHandler(value=Exception.class)

package net.xdclass.demoproject.handler;import net.xdclass.demoproject.utils.JsonData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;/*** 標記這個是一個異常處理類*/
@RestControllerAdvice//標記這個是一個異常處理類,可以處理全局異常
public class CustomExtHandler {//處理特定異常:Exception.class@ExceptionHandler(value = Exception.class)//標記這個方法是一個異常處理方法,處理Exception.class異常JsonData handlerException(Exception e, HttpServletRequest request){//打印異常信息return JsonData.buildError("服務端出問題了", -2);}
}

?自定義全局異常

引入thymeleaf依賴

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

創建異常顯示視圖

resource目錄下新建templates,并新建error.html

創建異常處理類

package net.xdclass.demoproject.handler;import net.xdclass.demoproject.utils.JsonData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;/*** 標記這個是一個異常處理類*/
@ControllerAdvice//標記這個是一個異常處理類
public class CustomExtHandler {@ExceptionHandler(value = Exception.class)Object handlerException(Exception e, HttpServletRequest request){//打印異常信息:ModelAndView:視圖和模型的結合,可以將數據傳遞給視圖,并渲染視圖ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("error.html");//設置視圖名稱:error.html,會自動去templates目錄下查找error.html文件,并渲染System.out.println(e.getMessage());//打印異常信息//將異常信息傳遞給視圖modelAndView.addObject("msg",e.getMessage());return modelAndView;}
}

三、優化配置

?1.簡化sql語句

sql片段的使用:select * 去查詢數據庫不適用高并發項目

簡化前

<select id="selectById" parameterType="java.lang.Integer" resultType="Video">select id,title,summary,cover_img  from video where id = #       {video_id,jdbcType=INTEGER}</select>

簡化后

<sql id="base_video_field">id,title,summary,cover_img</sql><select id="selectById" parameterType="java.lang.Integer" resultType="Video">select <include refid="base_video_field"/>  from video where id = #       {video_id,jdbcType=INTEGER}</select>

2.查詢操作

復雜查詢

sql的兩種返回類型:resultType(適用于簡單查詢)、resultMap(適用于復雜查詢)?

用resultMap來實現:在xml文件中配置

<!--1.配置映射結果集 2.編寫查詢語句實現查詢-->
<resultMap id="VideoResultMap" type="Video"><!--id 指定查詢列的唯一標示column 數據庫字段的名稱property pojo類的名稱--><id column="id" property="id" jdbcType="INTEGER" /><result column="video_tile" property="title"  jdbcType="VARCHAR" /><result column="summary" property="summary"  jdbcType="VARCHAR" /><result column="cover_img"  property="coverImg"  jdbcType="VARCHAR" /></resultMap>
<!--通過配置resultMap將as后面的數據庫類型映射成as前面的java類型 --><select id="selectBaseFieldByIdWithResultMap" resultMap="VideoResultMap">select id , title as video_title, summary, cover_img from video where id = #{video_id}</select>

?在Mapper接口中編寫方法

   //復雜查詢Video selectBaseFieldByIdWithResultMap(@Param("video_id")int id);

啟動類中輸出

            //resultMap映射出來得到的結果System.out.println(videoMapper.selectBaseFieldByIdWithResultMap(30));

?一對一聯表查詢

當需要同時查詢兩個表的信息時,通過association來配置一對一的關聯表屬性。

xml文件中

<resultMap id="VideoOrderResultMap" type="VideoOrder"><!--配置id為唯一標識--><id column="id" property="id"/><!--配置結果集映射--><result column="user_id" property="userId"/><result column="out_trade_no" property="outTradeNo"/><result column="create_time" property="createTime"/><result column="state" property="state"/><result column="total_fee" property="totalFee"/><result column="video_id" property="videoId"/><result column="video_title" property="videoTitle"/><result column="video_img" property="videoImg"/><!--配置關聯表的映射屬性:association 配置屬性一對一property 對應videoOrder里面的user屬性名javaType 這個屬性的類型--><association property="user" javaType="User"><id property="id"  column="user_id"/><result property="name" column="name"/><result property="headImg" column="head_img"/><result property="createTime" column="create_time"/><result property="phone" column="phone"/></association></resultMap><!--一對一管理查詢訂單, 訂單內部包含用戶屬性--><select id="queryVideoOrderList" resultMap="VideoOrderResultMap">selecto.id id,o.user_id ,o.out_trade_no,o.create_time,o.state,o.total_fee,o.video_id,o.video_title,o.video_img,u.name,u.head_img,u.create_time,u.phonefrom video_order o left join user u on o.user_id = u.id</select>

mapper接口

package net.xdclass.online_class.dao;import net.xdclass.online_class.domain.User;
import net.xdclass.online_class.domain.VideoOrder;import java.util.List;public interface VideoOrderMapper {/*** 查詢全部訂單,關聯用戶信息* @return*/List<VideoOrder> queryVideoOrderList();}

啟動類中

           // resultmap association關聯查詢VideoOrderMapper videoOrderMapper = sqlSession.getMapper(VideoOrderMapper.class);//獲取mapper對象List<VideoOrder> videoOrderList = videoOrderMapper.queryVideoOrderList();//調用mapper接口中的方法System.out.println(videoOrderList.toString());//輸出結果

一對多聯表查詢

?查詢關聯表信息中的返回多條數據,用collection來實現接收多條數據

<resultMap id="UserOrderResultMap" type="User"><id property="id"  column="id"/><result property="name" column="name"/><result property="headImg" column="head_img"/><result property="createTime" column="create_time"/><result property="phone" column="phone"/><!--property 填寫pojo類中集合類屬性的名稱ofType 集合里面的pojo對象--><collection property="videoOrderList" ofType="VideoOrder"><!--配置主鍵,管理order的唯一標識--><id column="order_id" property="id"/><result column="user_id" property="userId"/><result column="out_trade_no" property="outTradeNo"/><result column="create_time" property="createTime"/><result column="state" property="state"/><result column="total_fee" property="totalFee"/><result column="video_id" property="videoId"/><result column="video_title" property="videoTitle"/><result column="video_img" property="videoImg"/></collection></resultMap><select id="queryUserOrder" resultMap="UserOrderResultMap">selectu.id,u.name,u.head_img,u.create_time,u.phone,o.id order_id,o.out_trade_no,o.user_id,o.create_time,o.state,o.total_fee,o.video_id,o.video_title,o.video_imgfrom user u left join video_order o on u.id = o.user_id</select>

小結

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900164.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《雙影奇境》手機版上線?ToDesk用跨平臺技術實現「全設備云電腦3A游戲」

《雙影奇境》是由Hazelight Studios研發發行的一款雙人合作冒險類游戲&#xff0c;玩家們在游戲中將扮演米歐和佐伊兩位風格迥異的女作家&#xff0c;劇情講述的是她們被騙進入一臺意在竊取創意的機器后便陷入了自己創作的故事之中&#xff0c;并且必須相互依靠&#xff0c;努力…

【教程】Windows下 Xshell 連接跳板機和開發機

需求 使用遠程連接工具 Xshell 連接跳板機&#xff0c;再從跳板機連接開發機&#xff0c;用戶登陸方式為使用密鑰。 方法 首先&#xff0c;建立一個會話&#xff0c;用于配置跳板機信息和開發機轉跳信息&#xff1a; 在【連接】頁面&#xff0c;給跳板機取個名字&#xff0c…

如何快速入門物聯網單片機開發?

背景 物聯網單片機硬件開發涉及多個階段&#xff0c;元器件是否“自己設計”取決于具體需求。以下是詳細解答和學習方案&#xff1a; 一、元器件是否自己設計&#xff1f; 通用元器件&#xff1a; 大多數情況下&#xff0c;開發者直接使用現成的標準化元器件&#xff08;如電阻…

每日一題(小白)模擬娛樂篇11

由題可知就是要求計算一個數字&#xff0c;可以整除10進制的每一位&#xff0c;亦可以整除8進制和16進制的每一位。要求找出第2023個能夠在三個進制下同時被10進制整除的數字。 Java中已經封裝了進制轉換的方法&#xff0c;以下是一些常用的轉換方法&#xff1a;&#x1f447;…

阿里巴巴langengine二次開發大模型平臺

阿里巴巴LangEngine開源了&#xff01;支撐億級網關規模的高可用Java原生AI應用開發框架 - Leepy - 博客園 阿里國際AI應用搭建平臺建設之路(上) - 框架篇 基于java二次開發 目前Spring ai、spring ai alibaba 都是java版本的二次基礎能力 重要的是前端工作流 如何與 服務端的…

MINIQMT學習課程Day8

獲取qmt賬號的資金賬號后&#xff0c;我們進入下一步&#xff0c;如何獲得當前賬號的持倉情況 還是之前的步驟&#xff0c;打開qmt&#xff0c;選擇獨立交易&#xff0c; 之后使用pycharm&#xff0c;編寫py文件。 from xtquant import xtdata from xtquant.xttrader import…

在QGIS中將矢量數據導出為JSON

在QGIS中將矢量數據導出為JSON的完整操作指南如下&#xff0c;支持GeoJSON標準格式及自定義配置&#xff1a; 一、標準GeoJSON導出&#xff08;推薦&#xff09; 適用場景&#xff1a;生成符合OGC標準的地理JSON文件&#xff0c;適用于Web地圖開發 準備圖層 確保目標圖層在QG…

Netty——連接超時 與 斷開重連

文章目錄 1. 處理連接超時和斷開重連的原因2. 處理連接超時和斷開重連的方法2.1 處理連接超時2.1.1 步驟一&#xff1a;配置連接超時時間2.1.2 步驟二&#xff1a;監聽連接結果 2.2 處理斷開重連2.2.1 步驟一&#xff1a;監聽連接斷開事件2.2.2 步驟二&#xff1a;實現重連邏輯…

Redis 與 AI:從緩存到智能搜索的融合之路

Redis 與 AI&#xff1a;從緩存到智能搜索的融合之路 在當今數字化時代&#xff0c;Redis 不僅是一個高性能的緩存系統&#xff0c;更是一個強大的 AI 支持平臺。Redis 通過其向量數據庫功能和 AI 工具&#xff0c;為現代應用提供了獨特的技術優勢。 一、Redis 的 AI 能力 &…

LeetCode435 -- 預定會議問題

0. ref 參考自 1. 題目描述 預定會議問題&#xff1a;給定我們一堆區間&#xff0c;區間不能重疊&#xff08; [ 1 , 2 ] [1,2] [1,2] 和 [ 2 , 3 ] [2,3] [2,3] 的 2 2 2 不算重疊&#xff09;&#xff0c;求最多能保留多少個區間&#xff1f; 做法&#xff1a;貪心&#…

leetcode51-N皇后

leetcode 51 思路 本題可以使用回溯算法來解決。回溯算法通過嘗試所有可能的解決方案來找到問題的解的算法&#xff0c;當發現當前的選擇無法得到有效的解決方案時&#xff0c;就回溯到上一步&#xff0c;嘗試其他的選擇。對于 N 皇后問題&#xff0c;我們可以逐行放置皇后&…

linux paste 命令

paste 是 Linux 中一個用于水平合并文件內容的命令行工具&#xff0c;它將多個文件的對應行以并行方式拼接&#xff0c;默認用制表符&#xff08;Tab&#xff09;分隔。 1. 基本語法 paste [選項] 文件1 文件2 ... 2. 常用選項 選項說明-d指定拼接后的分隔符&#xff08;默…

Linux 入門:基礎開發工具(上)vim,gcc/g++,make/makefile

目錄 一.軟件包管理器 一&#xff09;.軟件包 二&#xff09;.安裝軟件 三&#xff09;.刪除軟件 二.編輯器vim 一&#xff09;.vim的基本介紹 1.正常/普通/命令模式(Normal mode) 2.插入模式(Insert mode) 3.底行模式(last line mode) 二&#xff09;.vim的基本操作 …

在CPU服務器上部署Ollama和Dify的過程記錄

在本指南中&#xff0c;我將詳細介紹如何在CPU服務器上安裝和配置Ollama模型服務和Dify平臺&#xff0c;以及如何利用Docker實現這些服務的高效部署和遷移。本文分為三大部分&#xff1a;Ollama部署、Dify環境配置和Docker環境管理&#xff0c;適合需要在本地或私有環境中運行A…

請求被中止: 未能創建 SSL/TLS 安全通道。

需要安裝vs2019社區辦&#xff0c;下載VisualStudioSetup.exe后&#xff0c;報無法從"https://aka,ms/vs/16/release/channel"下載通道清單錯誤&#xff0c;接著打開%temp%目錄下的最新日志&#xff0c;發現日志里報&#xff1a; [27d4:000f][2025-04-04T21:15:43] …

第六課:AI繪畫進階模型

文章目錄 Part.01 文本嵌入(Embeddings)Part.02 低秩模型(LoRa)Part.03 超網絡(Hypernetwork)Part.01 文本嵌入(Embeddings) Embeddings(Textual Inversion)Checkpoint如果是字典,Embeddings就是書簽,讓檢索更加高效深度學習中Embeddings叫做嵌入式向量使用方法:下載Embeddi…

閱讀分析Linux0.11 /boot/setup.s

目錄 第一部分第二部分第三部分 該源文件功能分為三部分&#xff1a; &#xff08;1&#xff09;源文件開始部分是通過各種中斷指令&#xff0c; 初始化計算機的組成硬件&#xff0c;獲得硬件的參數&#xff0c;然后保存到段空間0X9000。該空間原來是保存加載到內存的引導扇區內…

TSMaster在新能源汽車研發測試中的硬核應用指南

——從仿真到標定&#xff0c;全面賦能智能汽車開發 引言&#xff1a;新能源汽車測試的挑戰與TSMaster的破局之道 新能源汽車的快速發展對研發測試提出了更高要求&#xff1a;復雜的電控系統、高實時性通信需求、多域融合的驗證場景&#xff0c;以及快速迭代的開發周期。傳統測…

web漏洞靶場學習分享

靶場&#xff1a;pikachu靶場 pikachu漏洞靶場漏洞類型: Burt Force(暴力破解漏洞)XSS(跨站腳本漏洞)CSRF(跨站請求偽造)SQL-Inject(SQL注入漏洞)RCE(遠程命令/代碼執行)Files Inclusion(文件包含漏洞)Unsafe file downloads(不安全的文件下載)Unsafe file uploads(不安全的文…

《Linux內存管理:實驗驅動的深度探索》【附錄】【實驗環境搭建 4】【Qemu 如何模擬numa架構】

我們在學習 linux 內核時&#xff0c;會涉及到很多 numa 的知識&#xff0c;那我們該如何在 qemu 中模擬這種情況&#xff0c;來配合我們的學習呢&#xff1f; 我們該如何模擬 如下的 numa 架構 Qemu 模擬 NUMA 架構 -M virt,gic-version3,virtualizationon,typevirt \ -cp…