mybatis多表映射-分步查詢

1、建庫建表

create database `mybatis-example`;
use `mybatis-example`;
create table t_book
(bid   varchar(20) primary key,bname varchar(20),stuid varchar(20)
);
insert into t_book values('b001','Java','s001');
insert into t_book values('b002','Python','s002');
insert into t_book values('b003','C++','s003');
insert into t_book values('b004','PHP','s003');
create table t_stu(sid varchar(20)  primary key,sname varchar(20)
);
insert into t_stu values('s001','張三');
insert into t_stu values('s002','李四');
insert into t_stu values('s003','王五');
alter table t_bookadd constraint fk_book_stuid foreign key (stuid) references t_stu (sid);

2、pom.xml

    <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!-- MySQL驅動 mybatis底層依賴jdbc驅動實現,本次不需要導入連接池,mybatis自帶! --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--junit5測試--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- 日志 , 會自動傳遞slf4j門面--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency></dependencies>

?3、logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true"><!-- 指定日志輸出的位置,ConsoleAppender表示輸出到控制臺 --><appender name="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 日志輸出的格式 --><!-- 按照順序分別是:時間、日志級別、線程名稱、打印日志的類、日志主體內容、換行 --><pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern><charset>UTF-8</charset></encoder></appender><!-- 設置全局日志級別。日志級別按順序分別是:TRACE、DEBUG、INFO、WARN、ERROR --><!-- 指定任何一個日志級別都只打印當前級別和后面級別的日志。 --><root level="DEBUG"><!-- 指定打印日志的appender,這里通過“STDOUT”引用了前面配置的appender --><appender-ref ref="STDOUT" /></root><!-- 根據特殊需求指定局部日志級別,可以是包名或全類名。 --><logger name="com.atguigu.mybatis" level="DEBUG" />
</configuration>

4、Stu.java

package com.atguigu.mybatis.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Stu {private String sid;private String sname;//對多:一個學員擁有多本圖書private List<Book> bookList;
}

5、Book.java

package com.atguigu.mybatis.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {private String bid;private String bname;private String stuid;//對一關聯:一本圖書屬于一個學員private Stu stu;
}

6、StuMapper.java

package com.atguigu.mybatis.mapper;
import com.atguigu.mybatis.pojo.Stu;
import java.util.List;
public interface StuMapper {//Stu元素僅僅有自身的信息List<Stu> getStuList();//每一個Stu元素,包含了自身的信息,以及對應的書籍信息List<Stu> getStuListWithBookList();//演示分步查詢Stu getStuWithBookList(String sid);
}

7、mybatis-config.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><!-- 具體配置 --><!-- 從org.apache.ibatis.session.Configuration類中可以查看能使用的配置項 --><!-- 將mapUnderscoreToCamelCase屬性配置為true,表示開啟自動映射駝峰式命名規則 --><!-- 規則要求數據庫表字段命名方式:單詞_單詞 --><!-- 規則要求Java實體類屬性名命名方式:首字母小寫的駝峰式命名 --><settings><setting name="autoMappingBehavior" value="FULL"/><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--<typeAlias type="com.atguigu.mybatis.pojo.Employee" alias="emp"/>--><package name="com.atguigu.mybatis.pojo"/></typeAliases><!-- environments表示配置Mybatis的開發環境,可以配置多個環境,在眾多具體環境中,使用default屬性指定實際運行時使用的環境。default屬性的取值是environment標簽的id屬性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一個具體的環境 --><environment id="development"><!-- Mybatis的內置的事務管理器 --><transactionManager type="JDBC"/><!-- 配置數據源 --><dataSource type="POOLED"><!-- 建立數據庫連接的具體信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!-- Mapper注冊:指定Mybatis映射文件的具體位置 --><!-- mapper標簽:配置一個具體的Mapper映射文件 --><!-- resource屬性:指定Mapper映射文件的實際存儲位置,這里需要使用一個以類路徑根目錄為基準的相對路徑 --><!-- 對Maven工程的目錄結構來說,resources目錄下的內容會直接放入類路徑,所以這里我們可以以resources目錄為基準 --><mapper resource="mappers/StuMapper.xml"/><mapper resource="mappers/BookMapper.xml"/></mappers></configuration>

8、mappers/StuMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口類的全限定名,這樣實現對應 -->
<mapper namespace="com.atguigu.mybatis.mapper.StuMapper"><select id="getStuList" resultType="Stu">select * from t_stu</select><select id="getStuListWithBookList" resultMap="StuWithBookListResultMap">select * from t_stu t1 inner join t_book t2 on t1.sid=t2.stuid</select><resultMap id="StuWithBookListResultMap" type="Stu"><id property="sid" column="sid"/><!--<result property="sname" column="sname"/>--><!--對多關聯--><collection property="bookList" ofType="Book"><id property="bid" column="bid"/><!--<result property="bname" column="bname"/>--></collection></resultMap><select id="getStuWithBookList" resultMap="StuWithBookListResultMap2">select * from t_stu where sid=#{value}</select><resultMap id="StuWithBookListResultMap2" type="Stu"><id property="sid" column="sid"/><collection property="bookList" select="com.atguigu.mybatis.mapper.BookMapper.getBookListBySid" column="sid"/></resultMap></mapper>

9、mappers/BookMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口類的全限定名,這樣實現對應 -->
<mapper namespace="com.atguigu.mybatis.mapper.BookMapper"><select id="getBook" resultType="Book">select * from t_bookwhere bid=#{value}</select><select id="getBook2" resultMap="BookWithStuResultMap">select * from t_book t1 inner join t_stu t2 on t1.stuid=t2.sidwhere t1.bid=#{value}</select><resultMap id="BookWithStuResultMap" type="Book"><id property="bid" column="bid"/><!--<result property="bname" column="bname"/>--><!--對一關聯--><association property="stu" javaType="Stu"><id property="sid" column="stuid"/><!--column或者可以寫sid--><!--<result property="sname" column="sname"/>--></association></resultMap><select id="getBookListBySid" resultType="Book">select * from t_book where stuid=#{value}</select>
</mapper>

10、logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true"><!-- 指定日志輸出的位置,ConsoleAppender表示輸出到控制臺 --><appender name="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 日志輸出的格式 --><!-- 按照順序分別是:時間、日志級別、線程名稱、打印日志的類、日志主體內容、換行 --><pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern><charset>UTF-8</charset></encoder></appender><!-- 設置全局日志級別。日志級別按順序分別是:TRACE、DEBUG、INFO、WARN、ERROR --><!-- 指定任何一個日志級別都只打印當前級別和后面級別的日志。 --><root level="DEBUG"><!-- 指定打印日志的appender,這里通過“STDOUT”引用了前面配置的appender --><appender-ref ref="STDOUT" /></root><!-- 根據特殊需求指定局部日志級別,可以是包名或全類名。 --><logger name="com.atguigu.mybatis" level="DEBUG" />
</configuration>

11、MybatisTest.java

package com.atguigu.mybatis;
//import com.atguigu.mybatis.mapper.BookMapper;
import com.atguigu.mybatis.mapper.StuMapper;
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.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
public class MybatisTest {SqlSessionFactory sqlSessionFactory;SqlSession sqlSession;StuMapper stuMapper;//BookMapper bookMapper;@BeforeEachpublic void setup() throws IOException {// 獲取資源流,讀取"mybatis-config.xml"文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 使用資源流創建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 使用SqlSessionFactory打開一個SessionsqlSession = sqlSessionFactory.openSession();//基于Mapper接口編程stuMapper = sqlSession.getMapper(StuMapper.class);//bookMapper = sqlSession.getMapper(BookMapper.class);}// 在每個測試用例之后執行的清理方法@AfterEachpublic void teardown() {sqlSession.commit();  // 提交事務sqlSession.close();  // 關閉SqlSession}@Testpublic void test01() {//stuMapper.getStuList().forEach(System.out::println);//stuMapper.getStuListWithBookList().forEach(System.out::println);//System.out.println(bookMapper.getBook("b001"));//System.out.println(bookMapper.getBook2("b002"));System.out.println(stuMapper.getStuWithBookList("s003"));}
}

?12、<setting name="autoMappingBehavior" value="FULL"/>

<setting name="autoMappingBehavior" value="FULL"/>?是 MyBatis 配置文件中的一個設置項,用于控制 自動映射行為

MyBatis 是一個 Java 的持久層框架,它允許你使用 SQL 語句來操作數據庫,并將結果映射到 Java 對象上。在 MyBatis 中,你可以使用?<resultMap>?元素來定義結果映射規則,指定如何將數據庫的結果集映射到 Java 對象上。然而,為了簡化配置,MyBatis 提供了自動映射的特性,可以自動將結果集的列名映射到 Java 對象的屬性上。

autoMappingBehavior?設置項用于控制自動映射的行為,它有三個可能的值:

  1. NONE:表示取消自動映射。
  2. PARTIAL:默認值,表示只會自動映射結果集中存在而 Java 對象中也有的字段,如果 Java 對象中有某些字段在結果集中不存在,則不會自動映射。
  3. FULL:表示會自動映射結果集中所有列名到 Java 對象的屬性上,無論 Java 對象是否有該屬性。

所以,<setting name="autoMappingBehavior" value="FULL"/>?的作用是讓 MyBatis 自動映射結果集中的所有列名到 Java 對象的屬性上,無論 Java 對象是否有該屬性。這可以簡化配置,但也可能導致一些意外的映射結果,需要謹慎使用。

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

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

相關文章

C++大型項目經驗

1 附加包含目錄 在Visual Studio中&#xff0c;“附加包含目錄”&#xff08;Additional Include Directories&#xff09;是一個編譯器設置&#xff0c;它指示編譯器在查找包含文件&#xff08;通常是頭文件&#xff0c;擴展名為.h或.hpp&#xff09;時去哪些額外的文件夾路徑…

函數的棧幀

我們每次在調用函數的時候&#xff0c;都說會進行傳參。每次創建函數&#xff0c;或者進行遞歸的時候&#xff0c;也會說會進行壓棧。 那么&#xff0c;今天我們就來具體看看函數到底是如何進行壓棧&#xff0c;傳參的操作。 什么是棧&#xff1f; 首先我們要知道&#xff0c;…

Error opening file for writing報錯解決

報錯展示及描述 在安裝pycharm的時候出現了一下報錯&#xff0c; Error opening file for writing。 報錯原因 一般出現這種報錯都是文件權限的原因&#xff0c;檢查一下&#xff0c;果然這個文件夾權限是【只讀】 查看文件權限的方式&#xff1a;【右擊】文件夾名稱&#xff0…

CSS結構偽類選擇器之否定偽類:not()

結構偽類選擇器是針對 HTML 層級結構的偽類選擇器。 常用的結構化偽類選擇器有&#xff1a; :root選擇器、:not選擇器、:only-child選擇器、:first-child選擇器、:last-child選擇器、 :nth-child選擇器、:nth-child(n)選擇器、:nth-last-child(n)選擇器、:nth-of-type(n)選擇…

046:vue通過axios調用json地址數據的方法

第046個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…

Userwindows pc電腦生成一個電腦唯一機器碼

在Windows PC上生成一個唯一標識碼通常涉及到計算機硬件和軟件的信息。有一些常見的方式可以獲取到一個較為唯一的標識碼&#xff1a; 1. 硬件信息&#xff1a; 可以通過獲取計算機的硬件信息來生成一個唯一標識碼。這可能包括CPU序列號、硬盤序列號、網卡MAC地址等。但請注意…

ffmpeg過濾器filter理論與實戰

文章目錄 前言一、DirectShow1、簡介2、程序基本結構3、架構 二、過濾器1、視頻過濾器 -vf2、音頻過濾器 -af3、過濾器鏈&#xff08;Filterchain&#xff09;4、過濾器圖&#xff08;Filtergraph&#xff09;①、基本語法②、Filtergraph 的分類 5、結構體間的關系圖 三、過濾…

Vue項目中WebSocket封裝

WEBSOCKET 封裝引入初始化使用 封裝 utils下建立WebSocketManager.js class WebSocketManager {constructor() {this.url null;this.websocket null;this.isConnected false;this.listeners {onopen: [],onmessage: [],onclose: [],onerror: [],};this.reconnectionOptio…

QML如何與C++層進行信號槽通訊

//QML端為槽函數 //其中serial為C類的對象 //CSerial serial(暫且可以這么理解) QML&#xff1a; Connections{ target: serial onStringReceived:{ console.log("receive:"receiveString) } } //C端為信號 //C //C類…

kafka 常用命令【學習筆記】

Kafka 環境變量配置 export KAFKA_HOME/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/kafka export PATH P A T H : PATH: PATH:KAFKA_HOME/bin 查看主題 ./kafka-topics.sh --list --zookeeper localhost:2181 創建主題 ./kafka-topics.sh --create --zook…

保研畢業論文查重率多少通過【保姆教程】

大家好&#xff0c;今天來聊聊保研畢業論文查重率多少通過&#xff0c;希望能給大家提供一點參考。 以下是針對論文重復率高的情況&#xff0c;提供一些修改建議和技巧&#xff1a; 保研畢業論文查重率多少通過 在保研過程中&#xff0c;畢業論文的查重率是衡量學術誠信和論文…

JAVA8新特性之函數式編程詳解

JAVA8新特性之函數式編程詳解 前言一、初步了解函數式接口二、 Lambda表達式2.1 概述2.2 lambda省略規則2.3 lambda省略常見實例2.4 lambda表達式與函數式接口 三、 Stream流3.1 stream流的定義3.2 Stream流的特點3.3 Stream流的三個步驟3.4 Stream 和 Collection 集合的區別&a…

【HarmonyOS開發】拖拽動畫的實現

動畫的原理是在一個時間段內&#xff0c;多次改變UI外觀&#xff0c;由于人眼會產生視覺暫留&#xff0c;所以最終看到的就是一個“連續”的動畫。UI的一次改變稱為一個動畫幀&#xff0c;對應一次屏幕刷新&#xff0c;而決定動畫流暢度的一個重要指標就是幀率FPS&#xff08;F…

【帶頭學C++】----- 九、類和對象 ---- 9.12 C++之友元函數(9.12.1---12.4)

??????????????????????創做不易&#xff0c;麻煩點個關注???????????????????????? ??????????????????文末有驚喜&#xff01;獻舞一支&#xff01;???????????????????? 目錄 9.12…

TypeError: Cannot set properties of undefined (setting ‘xx‘)

在寫代碼中經常會遇到TypeError: Cannot set properties of undefined (setting ‘xx‘)&#xff0c;這個問題。 一般出現的場景&#xff1a;在調用接口訪問后端數據時&#xff0c;前端渲染顯示空白&#xff0c;并報此錯。例如&#xff0c;我在調用高德地圖&#xff0c;輸入經…

五:爬蟲-數據解析之xpath解析

三&#xff1a;數據解析之xpath解析 1.xpath介紹&#xff1a; ? xpath是XML路徑語言&#xff0c;它可以用來確定xml文檔中的元素位置&#xff0c;通過元素路徑來完成對元素的查找&#xff0c;HTML就是XML的一種實現方式&#xff0c;所以xpath是一種非常強大的定位方式? XPa…

vue2 element-ui select下拉框 選擇傳遞多個參數

<el-select v-model"select" slot"prepend" placeholder"請選擇" change"searchPostFn($event,123)"> <el-option :label"item.ziDianShuJu" :value"{value:item.id, label:item.ziDianShuJu}" v-for&qu…

Ubuntu系統使用快速入門實踐(七)——軟件安裝與使用(5)

Ubuntu系統使用快速入門實踐系列文章 下面是Ubuntu系統使用系列文章的總鏈接&#xff0c;本人發表這個系列的文章鏈接均收錄于此 Ubuntu系統使用快速入門實踐系列文章總鏈接 下面是專欄地址&#xff1a; Ubuntu系統使用快速入門實踐系列文章專欄 文章目錄 Ubuntu系統使用快速…

crypto-js加密、解密與node Crypto加解密模塊的應用

前端用crypto-js實現加解密&#xff0c;node端用Crypto模塊&#xff0c;兩者想要相同結果的話&#xff0c;就要保持加密密鑰和加密算法一致。 crypto-js加密、解密 參考&#xff1a; 『crypto-js 加密和解密』 前端使用CryptoJS加密解密 // DES算法 import CryptoJS from cryp…

【unity】【WebRTC】從0開始創建一個Unity遠程媒體流app-構建可同步場景

【背景】 最近在研究遠程畫面&#xff0c;所以就實踐了一下。技術采用我認為比較合適的WebRTC。 這篇文章的基礎是我的另一篇博文&#xff0c;如果希望順利完成本篇操作&#xff0c;請先關注我后查詢我的如下博文&#xff1a; 【WebRTC】【Unity】Unity Web RTC1-Unity中簡單實…