【Mybatis入門】配置Mybatis(IDEA)

Mybatis和JDBC一樣,是連接數據庫的工具。它是一款優秀的持久層框架,主要用于 Java 語言中簡化數據庫操作,實現對象與數據庫表之間的映射。

Mybatis相比于JDBC的優勢

Mybatis消除了傳統 JDBC 代碼中繁瑣的手動處理、參數設置、結果集解析等重復工作,讓開發者更專注于 SQL 邏輯本身。

JDBC操作數據庫的大概流程如下:

1.加載數據庫驅動

2.創建并獲取數據庫連接對象connection

3.通過連接對象獲取會話對象statement

4.編寫sql語句

5.如果有參數的話需要通過Statement設置參數

6.執行sql語句并獲取結果

7.關閉資源

上述操作流程會造成一些問題:

  • JDBC連接數據庫頻繁創建、釋放,浪費資源進而影響系統性能。
  • sql代碼寫在java文件當中,如果在開發過程中我們改動某個sql,就需要去修改java代碼,改完之后還需要重新編譯。
  • JDBC對結果集的解析是硬編碼,sql變化會導致解析結果的代碼也跟著變化,系統不易維護。

而針對 JDBC 編程的劣勢,MyBatis 提供了以下解決方案:

  • 在 SqlMapConfig.xml 中配置數據連接池,使用連接池管理數據庫鏈接,避免了連接頻繁創建和釋放;
  • 將 SQL 語句分離到配置文件中,MyBatis 允許將 SQL 語句寫在 XML 映射文件或使用注解的方式定義,與 Java 業務代碼完全分離;
  • 提供自動映射機制,MyBatis 可以根據 SQL 查詢結果的列名與 Java 實體類的屬性名進行自動匹配,將結果集自動封裝為對應的實體對象,無需手動編寫結果集解析代碼。

Mybatis環境配置

創建數據庫和表結構

create database mybatis_demo; use mybatis_demo;CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用戶名稱',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性別',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'老王','2018-02-27
17:47:08','男','北京'),(2,'熊大','2018-03-02 15:09:37','女','上海'),(3,'熊二','2018-03-04
11:34:34','女','深圳'),(4,'光頭強','2018-03-04 12:04:06','男','廣州');

建好后的表如圖:

之后去官網下載 MyBatis,在D盤根目錄解壓下載的MyBatis文件 apache-maven-3.6.2,同樣在D盤根目錄新建 maven 文件夾用于存項目開發jar包。

下載好后就可以打開IDEA,我們創建一個Maven項目

之后點擊 File -> Settings,將Maven配置成我們本地下載的文件

建好后的項目如圖:

在pom.xml文件中導入maven相關依賴,用于聲明項目運行或編譯時需要依賴的第三方庫(Jar 包),Maven 會根據這些配置自動下載并管理這些依賴。

引入坐標

1. 引入MyBatis的3.4.5的版本的坐標

2. 引入MySQL驅動的jar包,5.1.6版本

3. 引入Junit單元測試的jar包

4. 引入log4j的jar包,1.2.12版本(需要引入log4j.properties的配置文件)

<dependencies>
<!--mybatis核心包--> 
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驅動包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

點擊加載jar包后即可使用

依舊是在 File -> Settings中,我們手動創建 SqlMapConfig.xml 模版文件(名字無所謂),用于配置 MyBatis 的運行環境、數據庫連接信息、類型別名、映射文件路徑等關鍵信息。
這里我們需要配置數據庫環境,可以配置多個environment環境,通過 default 屬性指定默認mysql環境,以及配置 Mapper 映射文件的路徑,告訴 MyBatis 去哪里找映射文件。

在resources目錄下按照模板創建SqlMapConfig.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- settings:控制mybatis的全局行為--><settings><!--設置mybatis輸出日志--><!--logImpl:表示對日志的控制--><!--STDOUT_LOGGING:將日志輸出到控制臺上--><setting name="logImpl" value="STDOUT_LOGGING" /></settings><environments default="mysql"><environment id="mysql"><!--配置事務的類型,使用本地事務策略--><transactionManager type="JDBC"></transactionManager><!--是否使用連接池 POOLED表示使用鏈接池,UNPOOLED表示不使用連接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers>
</configuration>

創建dao包和entity包

在entity包中編寫User的實體類,用于封裝 User 對象的屬性(與數據庫中的屬性相對應),屬性盡量使用包裝類型,具體的代碼如下(快捷鍵alt+enter:導入類; alt+insert:添加Getter、Setter、toString方法)

package com.qcby.entity;
import java.util.Date;public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;public User(){};public User(String username, Date birthday, String sex, String address) {this.username = username;this.birthday = birthday;this.sex = sex;this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

在dao包中創建 UserDao 接口,并且定義方法,接口將使用與實現分離,調用者只需依賴接口,無需依賴具體實現類,當需要替換實現時,只需更換實現類無需修改調用代碼,降低了代碼間的耦合度。

package com.qcby.dao;
import com.qcby.entity.User;
import java.util.List;public interface UserDao {
/*** 查詢所有用戶*/public List<User> findAll();
}

手動創建 mybatis-mapper.xml 模版文件(名字無所謂)

在resources目錄下,創建mapper文件夾,編寫 Mapper 映射文件用于管理sql語句,利用上面的mybatis-mapper.xml 模版文件創建UserMapper.xml文件,管理user表的sql語句。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcby.dao.UserDao">
<!--叫名稱空間,和接口綁定,該xml文件可以理解為UserDao接口的實現類,實現類來實現接口中的方法--><!--查詢方法的實現 id屬性是方法名,實現UserDao接口中方法的名稱
parameterType 指定輸入參數的類型,resultType 指定輸出結果的類型-->   <select id="findAll" resultType="com.qcby.entity.User">select * from user</select>
</mapper>

在Test文件下創建測試類sqlsession會話UserTest.java:

import com.qcby.Dao.UserDao;
import com.qcby.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserTest {private InputStream in = null;private SqlSession session = null;private UserDao userDao = null;@Before  //前置通知, 在方法執行之前執行public void init() throws IOException {//加載主配置文件,目的是為了構建SqlSessionFactory對象in = Resources.getResourceAsStream("SqlMapConfig.xml");//創建SqlSessionFactory對象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//通過SqlSessionFactory工廠對象創建SqlSesssion對象session = factory.openSession();//通過Session創建UserDao接口代理對象userDao = session.getMapper(UserDao.class);}@After  //@After: 后置通知, 在方法執行之后執行 。public void destory() throws IOException {//釋放資源session.close();in.close();}@Testpublic void findAll(){List<User> users = userDao.findAll();for (User user : users) {System.out.println(user.toString());}}
}

其中:

@Before :前置通知注解,在方法執行之前執行。首先,方法通過MyBatis提供的Resources工具類,調用getResourceAsStream方法讀取類路徑下名為SqlMapConfig.xml的主配置文件,將文件內容以輸入流in的形式加載到內存中,這個配置文件包含了數據庫連接信息、映射文件路徑等關鍵配置;接著,創建SqlSessionFactoryBuilder構建者對象,并調用其build方法,傳入前面獲取的配置文件輸入流,由此構建出SqlSessionFactory會話工廠對象,它是MyBatis框架的核心工廠,負責管理數據庫會話的創建;然后,通過SqlSessionFactory的openSession方法創建SqlSession會話對象,SqlSession就像Java程序與數據庫之間的橋梁,后續所有的數據庫操作都需要通過它來完成;最后,調用SqlSession的getMapper方法,傳入UserDao接口的字節碼對象,MyBatis會通過動態代理技術在運行時生成UserDao接口的代理實現類對象,并將其賦值給userDao變量,這個代理對象內部已經整合了SQL執行邏輯,后續只需調用userDao的方法就能直接操作數據庫

@Test :測試注解,標識這是一個可獨立運行的測試用例方法內部的邏輯是:首先調用之前通過動態代理生成的userDao對象的findAll方法,這個方法會觸發MyBatis執行對應的SQL查詢,并將查詢結果封裝成User對象的集合List;接著通過增強for循環遍歷這個用戶集合,對集合中的每個User對象調用toString()方法,將用戶的詳細信息轉換為字符串并打印到控制臺。整個方法的作用是測試UserDao接口中findAll方法的功能是否正常,通過執行查詢并輸出結果,驗證數據庫查詢操作是否能正確獲取并展示所有用戶數據。

@After:后置通知注解,在方法執行之后執行。方法內部主要實現了資源釋放的功能:首先通過session.close()關閉SqlSession對象,SqlSession作為Java程序與數據庫交互的會話橋梁,使用完畢后關閉可以釋放數據庫連接等資源,避免連接泄露;接著通過in.close()關閉之前打開的配置文件輸入流in,輸入流屬于IO資源,及時關閉能釋放系統文件句柄等資源,防止資源耗盡。整個方法的核心作用就是在測試方法執行完成后,清理初始化階段創建的資源,保證資源的合理使用和系統的穩定運行

運行后findAll方法的實現結果如圖:

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

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

相關文章

多路轉接之epoll 【接口】【細節問題】【LT與ET模式】【Reactor】

目錄 一.接口 1.1epoll_creaet 1.2epoll_ctl 1.3epoll_wait 二.細節問題 2.1 工作原理 2.2 epoll的demo 2.3 epoll的優點 三. LT 與 ET模式 理解ET 四. reactor 一.接口 1.1epoll_creaet 注意返回值是一個文件描述符 創建一個epoll模型 1.2epoll_ctl 返回值&…

滲透測試現已成為 CISO 戰略的核心

隨著數字供應鏈的擴展以及生成式人工智能在關鍵系統中的嵌入&#xff0c;安全領導者正在重新思考其網絡安全策略。Emerald Research 最近對 225 位安全領導者進行的一項調查發現&#xff0c;68% 的人擔心第三方軟件和組件帶來的風險。雖然大多數受訪者表示他們正在滿足監管要求…

音視頻學習(五十三):音頻重采樣

概述 音頻重采樣&#xff08;sample rate conversion, SRC&#xff09;是把采樣率從 Fs_in 變換為 Fs_out 的過程。常見場景有格式轉換&#xff08;44.1→48 kHz&#xff09;、采樣率匹配&#xff08;播放鏈路統一采樣率&#xff09;、以及通信中語音采樣率升降&#xff08;8 k…

【C#】正則表達式

一、核心優勢&#xff1a;用一小段規則搞定大量復雜的字符串匹配&#xff0c;查找和替換&#xff0c;并且可移植可復用。使用正則表達式的好處&#xff1a;1. 強大且靈活&#xff1a;可以一次性匹配非常復雜的規則&#xff0c;比如驗證郵箱、提取特定的格式日志、解析URL&#…

【[特殊字符][特殊字符] 協變與逆變:用“動物收容所”講清楚 PHP 類型的“靈活繼承”】

你有沒有遇到過這樣的問題&#xff1a;“為什么子類方法可以返回 Cat&#xff0c;而父類只寫了返回 Animal&#xff1f;” “為什么參數反而能從 CatFood 變成更寬泛的 Food&#xff1f;”這些看似“違反直覺”的設計&#xff0c;其實背后有一個優雅的編程概念&#xff1a;協變…

cesium/resium 修改子模型材質

我是 www.v2ex.com/t/1151549 的作者&#xff0c;在csdn這邊補全一些更多的信息 相關工具 主項目插件版本&#xff1a; "cesium": "^1.131.0",、"resium": "^1.19.0-beta.1"、"three": "^0.178.0"、"react…

nvm install 14.21.3 時npm 無法下載和識別

錯誤&#xff1a;C:\Users\H3C>nvm install 14.21.3 Downloading node.js version 14.21.3 (64-bit)... Complete Downloading npm... Creating C:\Users\H3C\AppData\Local\Temp\nvm-install-939491942\temp Downloading npm version 6.14.18... Error while downloading h…

【網絡運維】Linux:LNMP 項目實踐

LNMP 項目實踐 簡介&#xff1a;什么是 LAMP/LNMP LAMP&#xff1a;LinuxApacheMysql/MariadbPHP/Python/Perl。 LNMP&#xff1a;LinuxNginxMysql/MariadbPHP/Python/Perl。 Linux&#xff1a;操作系統&#xff0c;提供程序運行基礎。Apache/Nginx&#xff1a;Web 服務器&…

用 Docker 安裝并啟動 MySQL:從零到實戰的完整指南

用 Docker 安裝并啟動 MySQL&#xff1a;從零到實戰的完整指南MySQL 是目前最流行的關系型數據庫之一&#xff0c;廣泛應用于各類應用系統中。使用 Docker 部署 MySQL 可以極大簡化環境配置&#xff0c;保證開發、測試和生產環境的一致性。本文將詳細介紹如何使用 Docker 安裝、…

動態規劃----1.爬樓梯

70. 爬樓梯 - 力扣&#xff08;LeetCode&#xff09; /** 1階:1步,即1種; 2階:1步1步或直接2步,即2種 f(1) 1,f(2) 2 3階:由1階邁2步,或2階邁一步; 4階:由2階邁2步,或3階1步; n階:由n-2階邁2步,或n-1階邁1步 f(n) f(n - 1) f(n - 2) */ class Solution {/**1階:1步,即1種…

special topic 11 (1)

preface 雖然我知道專業課必須得學&#xff0c;但是要學的東西&#xff0c;好多&#xff0c;我對專業課很害怕&#xff0c;稍微往后挪一挪&#xff0c;今天學了兩個強化網課之后再學專業課吧。今天的目標是學完 11 到 14.任重道遠&#xff0c;加油&#xff01;從今天開始盡量早…

MTD和FTL的關系

在嵌入式存儲系統里&#xff0c;MTD&#xff08;Memory Technology Device&#xff09;和 FTL&#xff08;Flash Translation Layer&#xff09;是上下兩層、互相配合的概念。你可以把它想成**“原始硬件接口”和“硬盤驅動”**的關系。1. MTD 是什么定位&#xff1a;內核里對原…

自動駕駛 HIL 測試:構建 “以假亂真” 的實時數據注入系統

01 引言在端到端自動駕駛的研發競賽中&#xff0c;算法的迭代速度遠超物理世界的測試能力。單純依賴路測不僅成本高昂、周期漫長&#xff0c;更無法窮盡決定系統安全性的關鍵邊緣場景&#xff08;Corner Cases&#xff09;。因此&#xff0c;硬件在環&#xff08;HIL&#xff0…

jdk升級

列出所有的jdk版本 /usr/libexec/java_home -V 永久切換版本 export JAVA_HOME(/usr/libexec/javahome?v11)exportPATH(/usr/libexec/java_home -v 11) export PATH(/usr/libexec/javah?ome?v11)exportPATHJAVA_HOME/bin:$PATH 保存后執行 source ~/.zshrc

Openlayers基礎教程|從前端框架到GIS開發系列課程(24)openlayers結合canva繪制矩形繪制線

本章節講解Canvas如何結合 Openlayer 使用&#xff0c;首先我們講解Canvas的繪圖基礎。我們初始化地圖的時候可以看見&#xff0c;實際上Openlayer的地圖就是用Canvas實現繪制的。Canvas繪制基本概念什么是canvas&#xff1f;HTML5 <canvas> 元素用于圖形的繪制&#…

深度學習——01 深度學習簡介

1 什么是深度學習&#xff1f;人工智能是個大范疇&#xff0c;目標是打造智能機器和程序&#xff1b; 機器學習是實現人工智能的一種途徑&#xff0c;它能讓機器在不被明確編程的情況下自主學習&#xff1b;而深度學習&#xff0c;是機器學習的一個分支&#xff0c;它是基于深度…

自然語言處理( NLP)基礎

一、基本概念自然語言處理也就是Natural Language Processing&#xff0c;簡稱NLP。NLP就是人工只能和語言學領域的一個分支&#xff0c;涉及到計算機與人類語言之間的相互作用。主要目標是讓計算機能夠理解、解釋和生成人類語言的數據。1 自然語言處理的基本介紹NLP包括但不限…

云原生作業(nginx)

目錄 1 Web 服務基礎介紹 1.1 Web 服務介紹 1.1.1 Apache 經典的 Web 服務端 1.1.2 Nginx-高性能的 Web 服務端 1.1.3 用戶訪問體驗和性能 1.1.4 服務端 I/O 流程 1.2 I/O 模型 1.2.1 I/O 模型相關概念 1.2.2 網絡 I/O 模型 1.2.3 五種 IO 對比 1.2.4 I/O 的具體實現…

NY198NY203美光固態閃存NY215NY216

NY198NY203美光固態閃存NY215NY216技術架構與核心創新突破美光NY系列&#xff08;含NY198/NY203/NY215/NY216&#xff09;作為新一代企業級存儲解決方案&#xff0c;其底層采用232層NAND閃存三維堆疊工藝&#xff0c;如同垂直建造數字世界的摩天大樓&#xff0c;在有限芯片面積…

後端開發技術教學(四) 數據交互延伸

書接上回&#xff1a;後端開發技術教學(三) 表單提交、數據處理-CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一鍵部署 PHP 開發環境 小皮出品 前言 大家好&#xff0c;我是小楓。書接上期說到的後…