配置Mybatis環境

配置Mybatis環境

  • MyBatis是什么
  • 配置Mybatis環境

MyBatis是什么

MyBatis 一個支持普通 SQL 查詢、存儲過程以及高級映射的持久層框架。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作,使得開發者可以更專注于 SQL 本身,而不必花費過多精力在繁瑣的數據庫操作細節上。

最原始的JDBC操作數據庫的方式有以下問題:

  1. 數據庫連接頻繁創建、釋放浪費資源進而影響系統性能;
  2. sql代碼寫在 java文件當中,如果在開發過程中我們改動某個sql,就需要去修改java代碼,改完之后還需要重新編譯;
  3. 對結果集的解析也是硬編碼,對查詢結果的解析過程依賴于硬編碼的字段信息和顯式的數據類型轉換,缺乏靈活性和動態性,sql變化會導致解析結果的代碼也跟著變化,系統不易維護。

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

  1. 在 SqlMapConfig.xml 中配置數據連接池,使用連接池管理數據庫鏈接,避免了連接頻繁創建和釋放;
  2. 將 SQL 語句分離到配置文件中,MyBatis 允許將 SQL 語句寫在 XML 映射文件或使用注解的方式定義,與 Java 業務代碼完全分離;
  3. 提供自動映射機制,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,再新建 maven 文件夾用于存項目開發jar包

在這里插入圖片描述

接下來我們需要創建maven的項目,打開IDEA,點擊 Project -> New Project -> Maven -> next 即可創建成功

在這里插入圖片描述

自動進入剛創建好的maven項目,我們點擊 File -> Settings,進行maven配置

在這里插入圖片描述

稍等幾秒鐘IDEA解析依賴項,創建成功的樣子如圖:

在這里插入圖片描述

導入maven相關依賴,MyBatis的3.4.5的版本的坐標、MySQL驅動的jar包、Junit單元測試的jar包、log4j日志jar包
在pox.xml中追加如下內容進行配置,maven會在底層對其進行管理

<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包,稍等幾秒就加載成功了

在這里插入圖片描述

接下來我們需要創建 SqlMapConfig.xml 文件,是整個框架的核心配置入口,主要用于配置 MyBatis 的運行環境、數據庫連接信息、類型別名、映射文件路徑等關鍵信息。
下圖是創建SqlMapConfig.xml模板內容,按照模板創建SqlMapConfig.xml文件,這里我們需要配置數據庫環境,可以配置多個environment環境,通過 default 屬性指定默認環境,以及配置 Mapper 映射文件的路徑,告訴 MyBatis 去哪里找映射文件。

在這里插入圖片描述

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

創建 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();
}

在resources目錄下,創建mapper文件夾編寫 Mapper 映射文件用于管理sql語句,創建UserMapper.xml文件模板新建mybatis-mapper.xml文件,如圖

在這里插入圖片描述

<?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"><select id="findAll" resultType="com.qcby.entity.User">select * from user</select>
</mapper>

mapper namespace="com.qcby.dao.UserDao" 是名稱空間,該文件相當于是UserDao接口的實現類,實現類要實現接口中的方法
select id="findAll" 中的id屬性是方法名,實現UserDao接口中方法的名稱
parameterType 指定輸入參數的類型,resultType 指定輸出結果的類型

在Test文件下創建測試類sqlsession會話Userdao.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 mapper = 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接口代理對象mapper = 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());}}
}

@Test 是 Java 單元測試框架中用于標記測試方法的注解,用于標識一個方法是測試方法,方便框架自動執行并驗證代碼功能

findAll() 方法的實現結果如圖:

在這里插入圖片描述

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

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

相關文章

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享 在大規模分布式微服務架構中&#xff0c;如何在多集群環境下平滑、安全地發布新版本&#xff0c;一直是保證高可用、高可靠的關鍵需求。本文以真實生產環境案例為基礎&#xff0c;分享我們團隊基于Istio Servic…

Kubernetes(k8s)之認識Pod

01了解Pod Pod是Kubernetes創建或部署的最小/最簡單的基本單位,一個Pod代表集群上正在運行的一個進程。 一個Pod封裝一個應用容器(也可以有多個容器),存儲資源、一個獨立的網絡IP以及管理控制容器運行方式的策略選項。它可能由單個容器或多個容器共享組成的資源。 Kubern…

Nginx服務做負載均衡網關

1. 概述 內部Nginx服務器做服務網關&#xff0c;代理后端應用服務&#xff0c;卸載ssl域名證書&#xff0c;將接收的https請求&#xff0c;轉發至后端http服務。華為防火墻負責NAT&#xff0c;啟用服務器負載均衡功能&#xff0c;將公網虛擬IP端口映射到內部多臺Nginx服務器上…

十三、請求響應-請求:日期參數和JSON參數

日期參數代碼&#xff1a;日期參數 //日期時間參數RequestMapping("/dataParam")public String dataParam(DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}結果JSON參…

可信數據庫大會現場,TDengine 時序數據庫展示核電場景下的高性能與 AI 創新

設備在升級&#xff0c;場站在擴建&#xff0c;但數據系統卻還在“跟不上”。這正是許多核電企業在推進數字化轉型過程中最真實的感受。高頻采集、長周期存儲、精度要求高……這些構成了對數據庫系統的“煉獄級考驗”。在這樣一個背景下&#xff0c;國產數據庫的能力邊界正在被…

ctflearn-POST practice

靶場地址&#xff1a;165.227.106.113/post.php 解題&#xff1a; 一.分析題目 提示&#xff1a; 知道要用POST請求提交表單&#xff0c;看一下源碼信息 得到可能需要用post請求方式去提交表單&#xff0c;并且傳數據admin和password&#xff0c;這邊提供兩種方式 方法一&…

FPGA實現OV7670攝像頭圖像處理至VGA顯示器

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;本項目基于FPGA技術&#xff0c;結合OV7670攝像頭傳感器進行視頻捕獲&#xff0c;經SDRAM存儲&#xff0c;并通過VGA顯示器展示。同時&#xff0c;集成了中值濾波算法提高圖像清晰度。該項目涉及數字圖像處理系…

使用python寫一套完整的智能體小程序

創建一個簡單的智能體&#xff08;Agent&#xff09;程序在人工智能和自動化任務中&#xff0c;智能體&#xff08;Agent&#xff09;是指能夠感知環境并通過決策和行動來實現目標的實體。Python 提供了豐富的庫和框架&#xff0c;可以用于構建智能體程序&#xff0c;例如使用 …

電商項目_性能優化_海量數據讀寫、存儲、檢索

海量數據讀寫方式選擇高并發讀寫場景分析無論任何業務系統&#xff0c;無非就是兩個操作&#xff1a;寫和讀。 在海量數據和高并發的場景下&#xff0c;寫和讀就會成為系統性能的瓶頸。下面分析不同業務場景下面臨的問題&#xff1a;側重“高并發讀”的系統場景1&#xff1a;搜…

RabbitMQ面試精講 Day 9:優先級隊列與惰性隊列

【RabbitMQ面試精講 Day 9】優先級隊列與惰性隊列 文章標簽 RabbitMQ,優先級隊列,惰性隊列,消息隊列,面試技巧,系統架構 文章簡述 本文是"RabbitMQ面試精講"系列第9天&#xff0c;深入解析優先級隊列與惰性隊列的實現原理與實戰應用。文章詳細講解優先級隊列的排…

[硬件電路-121]:模擬電路 - 信號處理電路 - 模擬電路中常見的難題

模擬電路設計是電子工程中極具挑戰性的領域&#xff0c;其核心難題源于信號的連續性、元件的非理想特性以及環境干擾的復雜性。以下是模擬電路中常見的難題及其技術本質與解決方案&#xff1a;1. 噪聲與干擾&#xff1a;信號的“隱形殺手”技術本質&#xff1a;模擬信號對微小電…

Java 大視界 -- Java 大數據在智能交通智能停車誘導與車位共享優化中的應用(381)

Java 大視界 -- Java 大數據在智能交通智能停車誘導與車位共享優化中的應用&#xff08;381&#xff09;引言&#xff1a;正文&#xff1a;一、智能停車的 “老大難”&#xff1a;不只是 “車位少” 那么簡單1.1 車主與車位的 “錯位困境”1.1.1 信息滯后的 “睜眼瞎”1.1.2 車…

基于落霞歸雁思維框架的自動化測試實踐與探索

基于落霞歸雁思維框架的自動化測試實踐與探索 在當今快速發展的軟件開發領域&#xff0c;自動化測試已成為提高軟件質量和開發效率的關鍵環節。本文將結合落霞歸雁的思維框架——“觀察現象 → 找規律 → 應用規律 → 實踐驗證”&#xff0c;探討如何將其應用于自動化測試領域&…

Unity Shader編程進階:掌握高階渲染技術 C# 實戰案例

Unity Shader編程完全入門指南&#xff1a;從零到實戰 C# 本文將深入探討Unity Shader編程的高級技術&#xff0c;包括自定義光照模型、后處理效果、GPU實例化、表面著色器深度應用等&#xff0c;幫助開發者提升渲染效果與性能優化能力。 提示&#xff1a;內容純個人編寫&#…

(論文速讀)Text-IF:基于語義文本引導的退化感知交互式圖像融合方法

論文信息論文題目&#xff1a;Text-IF: Leveraging Semantic Text Guidance for Degradation-Aware and Interactive Image Fusion&#xff08;Text-IF:利用語義文本指導退化感知和交互式圖像融合&#xff09;會議&#xff1a;CVPR2024摘要&#xff1a;圖像融合的目的是將不同源…

python創建一個excel文件

以下是使用Python根據指定名稱創建Excel文件的兩種實現方法&#xff0c;根據需求選擇適合的方案&#xff1a;方法一&#xff1a;使用pandas庫&#xff08;適合結構化數據&#xff09; # 安裝依賴&#xff08;命令行執行&#xff09; # pip install pandas openpyxlimport panda…

C++高頻知識點(十四)

文章目錄66. 程序什么時候應該使用多線程&#xff0c;什么時候單線程效率高&#xff1f;67. 死鎖的原因和避免死鎖的避免預防死鎖&#xff1a;破壞持有并等待條件68. TCP擁塞控制四個階段輪換過程描述69. C的內存管理70. 構造函數可以是虛函數嗎&#xff0c;析構函數呢66. 程序…

淺窺Claude-Prompting for Agents的Talk

Prompting for Agents先說一句&#xff1a;顏值這么高&#xff0c;你倆要出道啊。此圖基本就是claude倡導的agent prompt結構了&#xff0c;可以看到經過一年時間的演變&#xff0c;基本都是follow這個結構去寫prompt。我比較喜歡用Role→react→task→histroy→few shot→rule…

【MySQL04】:基礎查詢

MySQL的基本查詢表的增刪查改 insert(插入) insert [info] table_name [(colume, [,colume] ...)] values (value_list) ...對于value_list我們通過,作為分隔符 插入替換我們使用on duplicate key update, 表示如果存在主鍵沖突, 會進行更新, 這個字段后面還有寫更新的字段repl…

NGINX反向代理golang后端服務

nginx配置參考&#xff08;/etc/nginx/sites-available路徑下創建配置文件&#xff09; server {listen 80; # 監聽80端口server_name ip; # 你的域名或IPlocation / {root /var/www/test_page/;index index.html; # 默認文件try_files $uri $uri/ /index.html; # 單頁…