ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、級聯查詢案例、resultMap映射

DAY21.1 Java核心基礎

ORM

Object Relationship Mapping 對象關系映射

面向對象的程序到—關系型數據庫的映射

比如java – MySQL的映射

ORM框架就是實現這個映射的框架

Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC

Spring Data JPA的底層就是Hibernate

Mybatis和Hibernate

Mybatis是一個JDBC封裝的工具,是幫助開發者實現數據持久化 工作的框架

Mybatis和Hibernate的區別?

Mybatis:半自動框架,Mybatis沒有實現java對象到數據庫表的映射,只實現了java程序和sql之間的映射

Hibernate:全自動框架,開發者只需要調用接口就可以完成相關的操作,整個框架已經封裝好,不需要開發者關注

但是全自動框架不靈活,有些業務場景實現并不方便,半自動框架靈活,可以根據具體業務來寫sql,更適合現代企業級項目的開發

Mybatis的優缺點

優點:

  • 極大簡化了JDBC的開發
  • 更好上手,有更好的靈活性
  • 通過定義sql在xml文件里面降低程序的耦合度
  • 支持動態sql,可以根據業務靈活實現需求

缺點:

  • 數據庫遷移的時候需要更改大量的sql語句
  • 相較于Hibernate,需要完成更多的工作,定義sql,設置sql與數據庫表的關系

使用教程

使用原生接口:

創建maven工程,導入相關依賴

    <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.31</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency>

創建實體類User

@Data
public class User  {private Integer id;private String name;private String pwd;private String email;
}

在resource創建一個config.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置MyBatis運行環境 --><environments default="development"><environment id="development"><!-- 配置JDBC事務管理 --><transactionManager type="JDBC"></transactionManager><!-- 數據源 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mytest1"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments>
</configuration>

兩種使用方式:

  • 使用原生接口

  • 使用mapper代理

使用原生接口

創建mapper文件

namespace:通常設置為文件所在包名和文件

UserMapper.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.shuwu.mapper.UserMapper"><select id="get" parameterType="int" resultType="com.shuwu.entity.User">select * from user where id = #{id}</select>
</mapper>

在配置文件添加注冊mapper,讓配置文件可以掃描到

<mappers><mapper resource="com/shuwu/mapper/UserMapper.xml"></mapper>
</mappers>

測試用例:

public class Test {public static void main(String[] args) {// 找到類加載器,通過配置文件的輸入流然后創建一個SqlSession工廠InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("com/mybatis-config.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);// 獲取sqlsessionSqlSession sqlSession = build.openSession();// 調用Mybatis原生接口執行sqlString statement = "com.shuwu.mapper.UserMapper.get";User user = sqlSession.selectOne(statement, 1);System.out.println(user);}
}

測試結果:

image-20250407105705462

要確保數據庫里面有對應的表結構

1、通過配置文件創建 MyBatis 環境(數據源、Mapper)

2、構建環境需要使用 SqlSessionFactory

使用mapper代理實現自定義接口

自定義接口,開發者只需要定義,不需要實現

定義mapper接口

public interface UserMapper {public User getUserById(Integer id);public List<User> getAllUser();
}

mapper接口映射的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.shuwu.mapper.UserMapper"><select id="getUserById" resultType="com.shuwu.entity.User">select * from user where id = #{id}</select><select id="getAllUser" resultType="com.shuwu.entity.User">select * from user</select>
</mapper>

要注意!!

  • namespace需要指定到mapper接口的文件
  • 方法名和xml里面的id必須一致
  • 返回值的resultType的放回類型必須一致
  • 方法傳遞參數名字必須對應,如果不一致可以用@Param來聲明參數名字

比如:

 public User getUserById(@Param("id") Integer id2);

增加、刪除、修改用戶

<?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.shuwu.mapper.UserMapper"><insert id="addUser">insert into user(name,pwd,email) values(#{name},#{pwd},#{email})</insert><update id="updateUser" parameterType="com.shuwu.entity.User">update user set name=#{name},pwd=#{pwd},email=#{email} where id = #{id}</update><delete id="deleteUser" parameterType="integer">delete from user where id = #{id}</delete><select id="getUserById" resultType="com.shuwu.entity.User">select * from user where id = #{id}</select><select id="getAllUser" resultType="com.shuwu.entity.User">select * from user</select>
</mapper>
public interface UserMapper {public User getUserById(@Param("id") Integer id2);public List<User> getAllUser();public int addUser(User user);public int deleteUser(@Param("id") Integer id);
}
public static void main(String[] args) {// 找到類加載器,然后創建一個工廠InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("com/mybatis-config.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);// 獲取sqlsessionSqlSession sqlSession = build.openSession();// 獲取接口的代理對象UserMapper mapper = sqlSession.getMapper(UserMapper.class);// 添加用戶mapper.addUser(new User(null,"shuwu","123","123@qq.com"));// 根據id刪除用戶mapper.deleteUser(4);// 根據User的id修改用戶信息mapper.updateUser(new User(1,"shuwu","123","123@qq.com"));// 提交事務sqlSession.commit();
}

增刪改 數據庫的時候要注意需要提交事務,不然MySQL只會保存不會添加進數據庫

sqlSession.commit();

Mapperxml

全局配置文件 mybatis-config.xml

Mapper 配置文件 UserMapper.xml

mybatis-config.xml:主要用來定義數據源信息和一些基本配置,事務管理、打印 SQL,開啟二級緩存、設置延遲加載

UserMapper.xml:定義對應接口方法的 SQL 實現,需要在 mybatis-config.xml 中進行注冊才可以使用

半自動化的 ORM 框架,SQL 需要開發者自定義,MyBatis 關注的是 Java 對象和 SQL 之間的關系,SQL 語句是在 Mapper.xml 中定義

parameterType

參數數據類型介紹

包裝類型

Integer類型

public int deleteUser(@Param("id") Integer id);
<delete id="deleteUser" parameterType="integer">delete from user where id = #{id}
</delete>

用戶的SQL語句是where id = #{id},這里的id可能是int或Integer。如果調用這個方法時傳入的是單個參數,比如Integer,MyBatis會自動識別參數類型,不需要顯式指定parameterType。

String類型

public User getByUserName(@Param("name") String name);
<select id="getByUserName" resultType="com.shuwu.entity.User">select * from user where name=#{name}
</select>

基本數據類型

int、flout、double…

public User getByAge(int age);
<select id="getByAge" parameterType="int" resultType="com.southwind.entity.User">select * from user where age = #{age}
</select>

實體類

public List<User> getAllUser();
<select id="getAllUser" resultType="com.shuwu.entity.User">select * from user
</select>

5、多個參數

public User getUsernameAndAge(String username,Integer age);
<select id="getUsernameAndAge" resultType="com.southwind.entity.User">select * from user where username = #{param1} and age = #{param2}
</select>

resultType

返回類型

1、基本數據類型

public int getCount();
<select id="getCount" resultType="int">select count(*) from user
</select>

2、包裝類

public Integer getCount2();
<select id="getCount2" resultType="java.lang.Integer">select count(*) from user
</select>

3、String

public String getUsernameById(Integer id);
<select id="getUsernameById" parameterType="java.lang.Integer" resultType="java.lang.String">select username from user where id = #{id}
</select>

4、實體類

public User getById(Integer id);
<select id="getById" parameterType="java.lang.Integer" resultType="com.southwind.entity.User">select * from user where id = #{id}
</select>

級聯查詢

實際開發中常見的是一對多和多對多關系

如果要查詢學生信息和班級信息的關系呢?

SELECT student.id sid, student.`name` sname,class.id cid,class.`name` cname from student,class where student.cid = class.id

怎么在java程序中實現呢

先定義一個可以接收這個參數的student對象

@Data
public class Student  {private Integer id;private String name;private Class clazz;
}
@Data
public class Class  {private Integer id;private String name;
}

但是有時候這個字段和數據庫里面的字段不匹配怎么辦呢?

這個clazz怎么和數據庫對應呢?

這個時候就需要寫一個字段映射了

mapper接口

public List<Student> getAllStudent();

xml映射

通過使用 resultMap="StudentMap"來設置一個返回值的字段映射

<resultMap id="StudentMap" type="com.shuwu.entity.Student"><id property="id" column="sid"/><result property="name" column="sname"/><association property="clazz" javaType="com.shuwu.entity.Class"><id property="id" column="cid"/><result property="name" column="cname"/></association></resultMap><select id="getAllStudent" resultType="com.shuwu.entity.Student" resultMap="StudentMap">SELECT student.id sid, student.`name` sname,class.id cid,class.`name` cname from student,class where student.cid = class.id
</select>

測試輸入:

System.out.println(mapper.getAllStudent());

image-20250407225235917

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

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

相關文章

【學習自用】配置文件中的配置項

server.port服務器端口&#xff0c;常被用于指定應用程序運行時所監聽的端口號spring.datasource.url用于配置數據源的數據庫連接URLspring.datasource.username用于指定連接數據庫的用戶名spring.datasource.password用于配置數據源時設置數據庫連接密碼的屬性mybatis.mapper-…

使用protobuf編譯提示無法打開包括文件: ‘absl/log/absl_log.h’: No such file or directory

問題原因 Protobuf 依賴 Abseil&#xff1a; Protobuf 3.20 版本開始依賴 Abseil&#xff0c;但你的系統未正確安裝或配置 Abseil。 頭文件路徑未包含&#xff1a; 編譯器找不到 absl/log/absl_log.h&#xff0c;可能是因為 Abseil 未正確安裝或未在項目中設置包含路徑。 …

Spring AI Alibaba 文檔檢索使用

一、文檔檢索 (Document Retriever)簡介 1、核心概念 文檔檢索&#xff08;DocumentRetriever&#xff09;是一種信息檢索技術&#xff0c;旨在從大量未結構化或半結構化文檔中快速找到與特定查詢相關的文檔或信息。文檔檢索通常以在線(online)方式運行。 DocumentRetriever通…

前端面試核心知識點整理:從 JavaScript 到 Vue 全解析

一、JavaScript 異步編程核心:Promise 與 async/await 1. Promise 深度解析 定義:Promise 是處理異步操作的對象,代表一個異步操作的最終狀態(成功 / 失敗)。三種狀態: pending(進行中):初始狀態,異步操作未完成。fulfilled(已成功):異步操作成功,調用 resolve …

音視頻(四)android編譯

前言 前面已經講了在windows上應用了&#xff0c;這章主要講述android上編譯 1&#xff1a;環境 git 如果失敗 直接跑到相應網站 手動下載 ubuntu22.* android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hluk 為什么用這個&#xff0…

【kind管理腳本-3】腳本函數說明文檔 —— 便捷使用 kind 創建、刪除、管理集群腳本

下面是一份詳細的說明文檔&#xff0c;介紹該腳本的功能、用法及各部分的含義&#xff0c;供您參考和使用&#xff1a; Kind 集群管理腳本說明文檔 此腳本主要用于管理 Kind&#xff08;Kubernetes IN Docker&#xff09;集群&#xff0c;提供創建、刪除、導出 kubeconfig、加…

【計算機行業發展與重塑】

計算機行業正經歷前所未有的變革&#xff0c;AI技術的爆發式發展與產業升級的深度融合&#xff0c;正在重塑行業格局與就業市場。以下從行業趨勢、AI的核心價值、就業需求三個維度展開分析。 一、行業趨勢&#xff1a;AI驅動下的多極增長 AI成為核心引擎 生成式AI的突破&#…

(高頻SQL50題)1667. 修復表中的名字

問題 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | ------------------------- user_id 是該表的主鍵(具有唯一值的列)。 該表包含用戶的 ID 和名字…

基于人工智能的醫學影像關聯分析:利用潛在空間幾何混雜因素校正法|文獻速遞-深度學習醫療AI最新文獻

Title 題目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的醫學影像關聯分析&#xff1a;利用潛在空間幾何混雜因素校正法 01 文獻速遞介紹 人工智能&#xff08;AI&#xff09;已成為各個領域的…

開源免費虛擬化軟件PVE功能介紹

Proxmox VE&#xff08;PVE&#xff09;提供了一個基于 Web UI&#xff08;管理界面&#xff09;的虛擬化管理平臺&#xff0c;用戶可以通過瀏覽器管理 虛擬機&#xff08;VM&#xff09;、容器&#xff08;LXC&#xff09;、存儲、網絡、備份、用戶權限等。 一、PVE Web 界面…

新球體育比分狀態監控

文章目錄 目標分析監控邏輯代碼目標分析 網頁監控地址:aHR0cHM6Ly9saXZlLnRpdGFuMDA3LmNvbS9pbmRleDJpbjEuYXNweD9pZD0x 監控邏輯 比分等數據主要是依賴JS加載得到,通過ajax后端進行渲染 代碼 # -*- coding: utf-8 -*-import warnings warnings.filterwarnings(ignore) f…

【lodash的omit函數詳解 - 從入門到精通】

lodash的omit函數詳解 - 從入門到精通 小白視角&#xff1a;什么是omit&#xff1f; omit在英文中意為"忽略"或"省略"。在編程中&#xff0c;它就是從一個對象中刪除不需要的屬性&#xff0c;返回一個新對象。 // 原始對象 const person {name: "…

軟考筆記9——數據庫技術基礎

第九章節——數據庫技術基礎 數據庫技術基礎 第九章節——數據庫技術基礎一、基本概念1. 數據庫與數據庫系統2. 數據庫的三級模式2.1 內模式2.2 概念模式2.3 外模式2.4 數據庫的兩級映射2.5 數據庫設計的基本步驟 二、數據模型1. 基本概念2. E-R模型2.1 實體2.2 聯系2.3 屬性 3…

Django分頁教程及示例

推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 完整代碼示例:結論Django的分頁模塊允許你將大量數據分割成更小的塊(頁面)。這對于以可管理的方式顯示項目列表,如博客文章或產品…

int 與 Integer 的區別詳解

1. 本質區別 特性intInteger類型基本數據類型&#xff08;Primitive&#xff09;包裝類&#xff08;Wrapper Class&#xff09;存儲位置棧&#xff08;或作為對象成員在堆中&#xff09;堆&#xff08;對象實例&#xff09;默認值0null&#xff08;可能導致 NullPointerExcept…

mariadb使用docker compose方式安裝

問題 本地mac m1上面的mysql和mariadb突然不用使用了&#xff0c;重新安裝也不想&#xff0c;最近mac系統也更新了&#xff0c;brew也更新了&#xff0c;重新安裝mariadb還是不能正常使用&#xff0c;現在我打算使用docker來安裝本地的mariadb了。 默認配置文件my.cnf 從容器…

基于React + Antd + Java的OFD文件上傳預覽實現方案(OFD文件轉圖片)

一、前端實現方案(React + Antd) import React, {useState } from react; import {Upload, Button, Image, Carousel } from antd; import {UploadOutlined } from @ant-design/icons;const OFDUploadPreview = () => {const [previewImages, setPreviewImages] = useSta…

從零構建大語言模型全棧開發指南:第四部分:工程實踐與部署-4.3.1LangChain與Dify平臺實戰:從RAG到Agent工作流

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 LangChain與Dify平臺實戰:從RAG到Agent工作流 - 4.3.1 LangChain與Dify平臺實戰:從RAG到Agent工作流1. LangChain核心組件與RAG架構設計1.1 LangChain核心模塊1.2 RAG架構實現流程2. RAG實戰:企業知識…

操作 Office Excel 文檔類庫Excelize

Excelize 是 Go 語言編寫的一個用來操作 Office Excel 文檔類庫&#xff0c;基于 ECMA-376 OOXML 技術標準。可以使用它來讀取、寫入 XLSX 文件&#xff0c;相比較其他的開源類庫&#xff0c;Excelize 支持操作帶有數據透視表、切片器、圖表與圖片的 Excel 并支持向 Excel 中插…

R Excel 文件:高效數據處理與可視化工具的完美結合

R Excel 文件&#xff1a;高效數據處理與可視化工具的完美結合 引言 在數據分析和處理領域&#xff0c;R語言因其強大的數據處理能力和豐富的可視化功能而備受青睞。而Excel作為最常用的電子表格軟件&#xff0c;其廣泛的應用也使得R與Excel的結合成為數據處理與可視化的理想…