JavaWeb(04)

MyBatis 時一款優秀的持久層框架,用于簡化JDBC的開發
The MyBatis Blog

目錄

  • MyBatis入門
  • Mybatis基礎CRUD
  • Mybatis動態SQL

Mybatis入門

  • 快速入門

  • JDBC介紹

  • 數據庫連接池

  • lombok

  • 準備工作(創建springboot工程,數據庫表user,實體類User)

  • 引入Mybatis的相關依賴,配置Mybatis(數據庫的連接信息)

  • 編寫SQL語句

  1. 數據庫表中的字段和實例用的屬性名一一對應

  2. 配置Mybatis的依賴

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234
  1. 編寫SQL語句
@Mapper
public interface UserMapper {@Select("select * from user")public List<User> list();
}
  1. 編寫測試
@SpringBootTest
class SpringbootMybatisQuickstart1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test1(){List<User> userList = userMapper.list();userList.stream().forEach(user -> {System.out.println(user);});}
}

注:要在主入口上面添加@MapperScan("org.mybatis.mapper") ,告訴bean對象在哪個文件夾下

@SpringBootApplication  
@MapperScan("org.mybatis.mapper")  
public class MybatisApplication {  public static void main(String[] args) {  SpringApplication.run(MybatisApplication.class, args);  }  }

JDBC(Java DataBase Connectivity)介紹

本質

  • sun 公司官方定義的一套操作所有關系型數據庫的規范,即接口。
  • 各個數據庫廠商去實現這套接口,提供數據庫驅動 jar 包。
  • 我們可以使用這套接口(JDBC)編程,真正執行的代碼是驅動 jar 包中的實現類。

數據庫連接池

  • 數據庫連接池是個容器,負責分配、管理數據庫連接 (Connection)
  • 它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個
  • 釋放空閑時間超過最大空閑時間的連接,來避免因為沒有釋放連接而引起的數據庫連接遺漏

優勢

  • 資源重用
  • 提升系統響應速度
  • 避免數據庫連接遺漏

注:springboot默認的數據庫連接池 Hikari

小結

  • 是一個容器,負責分配、管理數據庫連接 (Connection)
  • 優勢:資源復用、提升系統響應速度
  • 接口:DataSource
  • 產品:C3P0、DBCP、Druid、Hikari

lombok

  • 是一個實用的Java類庫,能通過注解的形式自動生成構造器,getter/setter, equals , hashcode,toString 等方法,并可以自動化生成日志變量,簡化java開發,提高效率
注解作用
@Getter/@Setter為所有的屬性提供 get/set 方法
@ToString會給類自動生成易閱讀的 toString 方法
@EqualsAndHashCode根據類所擁有的非靜態字段自動重寫 equals 方法和 hashCode 方法
@Data提供了更綜合的生成代碼功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor為實體類生成無參的構造器方法
@AllArgsConstructor為實體類生成除了 static 修飾的字段之外帶有各參數的構造器方法

lombok的依賴

<dependency>  <groupId>org.projectlombok</groupId>  <artifactId>lombok</artifactId>  
</dependency>

Mybatis基礎操作

準備

  • 準備數據庫表
  • 創建一個新的springboot,選擇引入對應的起步依賴(mybatis,mysql)
  • application.properties 中引入數據庫連接信息
  • 創建對應的實體類 Emp(實體類屬性采用駝峰命名)
  • 準備Mapper接口EmpMapper

注:

  • Java中的 LocalDateTime --> datetime
  • Java中的 LocalDate --> date
  • Java中的屬性采用大駝峰命名,數據庫中采用下劃線命名

刪除

@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);
}
@SpringBootTest
class SpringbootMybatisQuickstart1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test(){int delete = userMapper.delete(12);sout(delete);}
}

注:如果mapper接口方法形參只有一個普通連續的參數,#{} 里面的屬性名可以隨便寫

  • #{} 生成預編譯SQL,會自動設置參數值
  • 預編譯SQL
    • 性能更高
    • 更安全(防止SQL注入)
  • ${}
    • 拼接SQL,存在SQL注入問題

新增

@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);@Insert("... values(#{name})")public void insert(Emp emp);
}

注:name是emp中的屬性名

主鍵返回:在數據添加成功后,許喲啊獲取插入數據庫數據的主鍵

實現

@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("... values(#{name})")public void insert(Emp emp);

會將主鍵封裝到emp實類的 id 屬性中

更新

@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);@Insert("... values(#{name})")public void insert(Emp emp);@Update("...")public void update(Emp emp);}

查詢

@Mapper
public interface UserMapper {@Select("select * from user")public Emp list();
}
  • 數據封裝

    • 實體類屬性名 和 數據庫表查詢返回的字段名一致,mybatis會自動封裝
    • 如果實體類屬性 和 數據庫表查詢返回的字段名不一致,不能自動封裝
  • 解決方案

    • 起別名
    • 通過 @Results注解手動映射封裝
    • 開啟mybatis的駝峰命名自動映射的開關
@Mapper
public interface UserMapper {@Select("select user_name userName from user")public Emp list();
}
@Mapper
public interface UserMapper {@Result({@Resule(coulmn = "user_name", property = "userName")@Resule(coulmn = "xxx", property = "xxx")})@Select("select user_name UserName from user")public Emp list();
}

條件查詢 中使用concat的案例

@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);

XML映射文件

  • 規范
    • XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下
    • XML映射文件的namespace屬性為Mapper接口全限定名一致
    • XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致
  • 復雜的MySQL,推薦使用XML

注:到官網找到配置SQL語句的XML的約束

  • 插件介紹
    • MybatisX是一款基于IDEA的快速開發Mybatis的插件,為效率而生

動態SQL

例子:

<select id="list" resultType="com.itheima.pojo.Emp">select id, username, password, name, gender, image, job,entrydate, dept_id, create_time, update_time from empwhere<if test="name != null">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc
</select>
  • <where>
    • 動態生成where (如果if 里面都不成立,就不會生成where)
    • 自動去除多余的andor
  • <set>
    • 動態生成 set
    • 自動去除 ,
    • 用于 update 語句中
  • <if>
    • 用于判斷條件是否成立,使用test屬性進行判斷,如果條件為true,則拼接SQL
  • <foreach>
    • collection:遍歷的集合
    • item:遍歷出來的元素
    • open:遍歷開始前拼接的SQL片段
    • close:遍歷結束后拼接的SQL片段
  • <sql><include>
    • 提高SQL的復用性
    • sql --> 需要一個id
    • include --> refid 指定引入的sql

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

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

相關文章

統計學1:伯努利模型的參數估計與等價性分析

伯努利模型的參數估計方法 1. 統計學習方法三要素對比方法模型策略算法極大似然估計概率模型經驗風險最小化數值解貝葉斯估計概率模型結構風險最小化解析解2. 極大似然估計 2.1 模型設定 設P(x1)θP(x1)\thetaP(x1)θ&#xff0c;則P(x0)1?θP(x0)1-\thetaP(x0)1?θ 2.2 似然…

游戲行業DDoS攻防實戰指南

一、游戲DDoS攻擊特征分析游戲行業DDoS攻擊呈現高度復合化特征&#xff0c;攻擊手段日益專業化。2023年Akamai監測數據顯示&#xff0c;63%的游戲服務器攻擊采用UDP反射放大&#xff08;如NTP、Memcached協議&#xff09;與HTTP慢速攻擊&#xff08;如Slowloris&#xff09;相結…

[自動化Adapt] 錄制引擎 | iframe 穿透 | NTP | AIOSQLite | 數據分片

鏈接&#xff1a;https://github.com/OpenAdaptAI/OpenAdapt/wiki/OpenAdapt-Architecture-(draft) docs&#xff1a;OpenAdapt OpenAdapt 是一個開源項目&#xff0c;旨在 記錄 和 回放 用戶在計算機上的交互行為。 它如同智能助手般 觀察 我們的操作&#xff08;鼠標點擊、…

ipv6學習

ipv6的歷史背景和及展望ipv6普及不夠&#xff0c;ipv4快要用完。ipv6技術部分ivp6包頭結構ipv6不允許分片&#xff0c;減輕中間設備壓力。IPv6 包頭結構可按字段分層解析&#xff0c;核心特點是 固定頭部長度&#xff08;40 字節&#xff09; &#xff0c;將可選功能移至擴展頭…

軟件定義汽車 --- 電子電氣架構的驅動

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

HTML5 語義元素

HTML5 語義元素 引言 HTML5 作為現代網頁開發的基礎&#xff0c;引入了許多新的語義元素&#xff0c;這些元素使得網頁內容更加結構化&#xff0c;便于搜索引擎更好地理解和索引頁面內容。本文將詳細介紹 HTML5 中的語義元素&#xff0c;并探討其在網頁設計中的應用。 HTML5…

vue3 el-select el-option 使用

在 Vue 3 中&#xff0c;el-select 是 Element Plus 組件庫中的一個選擇器組件&#xff0c;它允許用戶從下拉菜單中選擇一個或多個選項。如果你想在使用 Vue 3 和 Element Plus 時讓 el-select 支持多種選擇&#xff08;即多選&#xff09;&#xff0c;你可以通過設置 multiple…

windows搬運文件腳本

使用方法&#xff1a;copy_files_by_prefix.bat [目標目錄] [結果目錄] [文件名前綴] [可選參數&#xff1a;文件包含內容]echo off chcp 65001 >nul setlocal enabledelayedexpansion:: Check parameters if "%~3""" (echo Usage: %~nx0 [SourceDir] […

C++ 中 initializer_list 類型推導

在 C 中&#xff0c;initializer_list 是一種用于表示列表初始化的標準庫模板類&#xff0c;提供了一種方便的方式來初始化容器或者進行函數調用時傳遞一組參數。initializer_list&& 類型推導涉及到右值引用和移動語義&#xff0c;這在現代 C 中變得越來越重要。initia…

自動駕駛中的傳感器技術22——Camera(13)

1、可靠性驗證的目標車載攝像頭作為自動駕駛和高級駕駛輔助系統&#xff08;ADAS&#xff09;的核心傳感器&#xff0c;其可靠性直接影響到行車安全。可靠性驗證的目標如下&#xff1a;暴露產品缺陷&#xff1a;在研制階段&#xff0c;通過測試發現并修正產品設計中的問題&…

一周學會Matplotlib3 Python 數據可視化-圖形的組成部分

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

三萬字帶你了解那些年面過的Java八股文

Java基礎 1. String 和StringBuffer 和 StringBuilder的區別&#xff1f; String 字符串常量 StringBuffer 字符串變量&#xff08;線程安全&#xff09; StringBuilder 字符串變量&#xff08;非線程安全&#xff09; 2. sleep() 區間wait()區間有什么區別&#xff1f; sleep…

HTML 媒體元素概述

HTML 提供了多種元素用于嵌入和控制多媒體內容&#xff0c;包括音頻、視頻、圖像、畫布等。以下是常用的 HTML 媒體元素及其用法&#xff1a;音頻 (<audio>)<audio> 元素用于嵌入音頻內容&#xff0c;支持 MP3、WAV、OGG 等格式。 示例代碼&#xff1a;<audio c…

http請求結構體解析

copy了一個接口的curl用來說明http請求的三個結構&#xff1a;請求行&#xff0c;請求頭&#xff0c;請求體 文章目錄一、請求的curl報文示例二、解析1. 請求行&#xff08;Request Line&#xff09;2. 請求頭&#xff08;Request Headers&#xff09;3. 請求體&#xff08;Req…

無人機遙控器舵量技術解析

一、舵量的核心作用1. 精確控制的核心 舵量值&#xff08;通常以PWM微秒值表示&#xff09;量化了操作指令的強度&#xff1a; 小舵量&#xff08;1000μs&#xff09;&#xff1a;對應舵機最小角度或電機最低轉速&#xff1b; 中點&#xff08;1500μs&#xff09;&#xf…

Git分支相關命令

在 Git 中&#xff0c;分支管理是非常重要的一部分。下面是一些常用的 Git 分支操作命令及其示例。 1. 查看所有分支 要查看項目中的所有分支&#xff08;包括本地和遠程&#xff09;&#xff0c;可以使用&#xff1a; git branch -a僅查看本地分支&#xff1a;git branch2. 創…

Apache Flink 的詳細介紹

Apache Flink 是一個開源的分布式流處理框架&#xff0c;專注于高吞吐、低延遲、 Exactly-Once 語義的實時數據處理&#xff0c;同時也支持批處理&#xff08;將批數據視為有限流&#xff09;。它廣泛應用于實時數據分析、實時 ETL、監控告警、欺詐檢測等場景&#xff0c;是當前…

Qt 常用控件 - 5

Qt 常用控件 - 4https://blog.csdn.net/Small_entreprene/article/details/149830464 前文補充 QRadioButton&#xff08;單選按鈕&#xff09; QRadioButton 是單選按鈕&#xff0c;允許在多個選項中選擇一個。作為 QAbstractButton 和 QWidget 的子類&#xff0c;前面介紹…

vue的響應式原理

Vue.js 的響應式原理是其核心特性之一&#xff0c;使得數據變化能夠自動更新到視圖。Vue 的響應式系統主要依賴于 Object.defineProperty&#xff08;在 Vue 2.x 中&#xff09;和 Proxy&#xff08;在 Vue 3.x 中&#xff09;來實現數據的觀察和更新。以下是對 Vue 響應式原理…

【AI論文】PixNerd:像素神經場擴散

摘要&#xff1a;擴散變換器目前所取得的成功在很大程度上依賴于預訓練變分自編碼器&#xff08;VAE&#xff09;所塑造的壓縮潛在空間。然而&#xff0c;這種兩階段訓練模式不可避免地會引入累積誤差和解碼偽影。為解決上述問題&#xff0c;研究人員選擇回歸像素空間&#xff…