MyBatis-Plus 混合使用 XML 和注解

mybatisplus代碼生成器:

版本匹配是個比較麻煩的問題,這是我的配置:

       <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.2</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version> <!-- 推薦版本 --></dependency>
CodeGenerator:
package com.neuedu.hisweb.utils;import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.annotation.FieldFill; // 引入正確的枚舉類
import org.apache.commons.lang3.StringUtils;import java.util.Collections;
import java.util.Scanner;public class CodeGenerator {private static final String URL = "jdbc:mysql://localhost:3306/his02?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true";private static final String USERNAME = "root";private static final String PASSWORD = "1";private static final String AUTHOR = "xj";private static final String PARENT_PACKAGE = "com.neuedu.hisweb";private static final String OUTPUT_DIR = System.getProperty("user.dir") + "/src/main/java";public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);System.out.println("請輸入" + tip + ":");if (scanner.hasNext()) {String ipt = scanner.next();if (StringUtils.isNotBlank(ipt)) {return ipt;}}throw new MybatisPlusException("請輸入正確的" + tip + "!");}public static void main(String[] args) {// 獲取需要生成的表名String tables = scanner("表名,多個英文逗號分割");FastAutoGenerator.create(URL, USERNAME, PASSWORD).globalConfig(builder -> {builder.author(AUTHOR).outputDir(OUTPUT_DIR).fileOverride().disableOpenDir().dateType(DateType.ONLY_DATE).commentDate("yyyy-MM-dd");}).packageConfig(builder -> {builder.parent(PARENT_PACKAGE).entity("entity").service("service").serviceImpl("service.impl").mapper("mapper").controller("controller").pathInfo(Collections.singletonMap(OutputFile.xml,System.getProperty("user.dir") + "/src/main/resources/mapper"));}).strategyConfig(builder -> {builder.addInclude(tables.split(",")).entityBuilder().enableLombok().naming(NamingStrategy.underline_to_camel).columnNaming(NamingStrategy.underline_to_camel).logicDeleteColumnName("deleted").versionColumnName("version").addTableFills(new Column("create_time", FieldFill.INSERT),  // 修改為正確的枚舉值new Column("update_time", FieldFill.INSERT_UPDATE)  // 修改為正確的枚舉值).controllerBuilder().enableRestStyle().formatFileName("%sController").serviceBuilder().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl").mapperBuilder().formatMapperFileName("%sMapper").formatXmlFileName("%sMapper");}).templateEngine(new FreemarkerTemplateEngine()).execute();}
}

MyBatis-Plus 混合使用 XML 和注解配置

一、配置原則

  1. 優先級:XML 配置會覆蓋注解配置。
  2. 最佳實踐
    • 簡單的 CRUD 操作可以使用注解(如?@Select@Insert?等)。
    • 復雜的 SQL 查詢(如多表關聯、動態 SQL)建議使用 XML 配置。
  3. XML 文件位置:默認放在?resources/mapper?目錄下,文件名與 Mapper 接口名對應。

二、具體配置方法

1.?基礎配置

確保?application.yml?或?application.properties?中正確配置 MyBatis-Plus:

# application.yml
mybatis-plus:# Mapper XML 文件路徑mapper-locations: classpath:mapper/*.xml# 實體掃描,多個package用逗號或者分號分隔type-aliases-package: com.neuedu.hisweb.entityconfiguration:# 開啟駝峰命名map-underscore-to-camel-case: true
2.?混合使用示例

Mapper 接口

package com.neuedu.hisweb.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.neuedu.hisweb.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;public interface UserMapper extends BaseMapper<User> {// 1. 使用注解實現簡單查詢@Select("SELECT * FROM user WHERE age > #{age}")List<User> selectByAge(int age);// 2. 使用注解實現帶參數的插入@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id")int insertUser(User user);// 3. 使用 XML 實現復雜查詢(XML 文件中定義該方法)List<User> selectUserWithDepartment();
}

對應的 XML 文件resources/mapper/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.neuedu.hisweb.mapper.UserMapper"><!-- 實現 UserMapper 接口中定義的 selectUserWithDepartment 方法 --><select id="selectUserWithDepartment" resultType="com.neuedu.hisweb.entity.User">SELECT u.*, d.name as dept_name FROM user uLEFT JOIN department d ON u.dept_id = d.idWHERE u.deleted = 0</select><!-- 可以添加更多復雜 SQL -->
</mapper>

三、注意事項

  1. 方法名匹配:XML 文件中的?id?必須與 Mapper 接口中的方法名一致。
  2. 參數處理
    • 注解方式:使用?@Param?注解為參數命名。
    • XML 方式:可以直接使用參數名或索引。
  3. 沖突處理
    • 如果同一方法在 XML 和注解中都有定義,XML 配置會覆蓋注解配置。
  4. XML 文件路徑
    • 確保?mapper-locations?配置正確指向 XML 文件。
    • 推薦使用?classpath:mapper/*.xml?或?classpath*:mapper/**/*.xml

四、動態 SQL 示例

對于復雜的動態 SQL,XML 方式更加靈活:

<select id="selectUserByCondition" resultType="com.neuedu.hisweb.entity.User">SELECT * FROM user<where><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null">AND age &gt;= #{age}</if><if test="deptId != null">AND dept_id = #{deptId}</if></where>ORDER BY create_time DESC
</select>

五、常見問題

  1. XML 文件未被加載

    • 檢查?mapper-locations?配置是否正確。
    • 確保 XML 文件在?resources?目錄下的正確位置。
  2. 方法找不到

    • 檢查 XML 中的?namespace?是否與 Mapper 接口的全限定名一致。
    • 檢查方法名(id)是否匹配。
  3. 依賴問題

    • 確保項目中包含 MyBatis-Plus 和 MyBatis 的依賴:

      <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>
      </dependency>
      

@MapperScan?與?mapper-locations?的功能的兼容性

  • @MapperScan?負責讓 Spring 容器識別 Mapper 接口。
  • mapper-locations?負責讓 MyBatis-Plus 加載 XML 中的 SQL 定義。
    只要兩者的路徑配置與實際文件位置一致,即可同時使用,不會產生沖突。

一、兩者的核心功能區別

  1. @MapperScan("com.neuedu.hisweb.mapper")?的作用

    • 掃描 Mapper 接口:告訴 Spring 容器去哪里查找 MyBatis-Plus 的 Mapper 接口(如?PatientcostsMapper),并將這些接口注冊為 Spring Bean。
    • 必須配置:如果沒有該注解或未通過其他方式掃描 Mapper 接口,Spring 將無法識別這些接口,導致依賴注入失敗(如?@Autowired UserMapper?會報錯)。
  2. mapper-locations: classpath:mapper/*.xml?的作用

    • 指定 XML 映射文件路徑:告訴 MyBatis-Plus 去哪里查找 XML 格式的 SQL 映射文件(如?PatientcostsMapper.xml)。
    • 可選配置:如果 Mapper 接口中所有方法都使用注解(如?@Select)定義 SQL,則無需配置;若存在 XML 定義的 SQL,則必須配置正確路徑。

二、為什么需要同時使用?

  • 場景示例

    • Mapper 接口?PatientcostsMapper?繼承自?BaseMapper<Patientcosts>,自動獲得 CRUD 方法(無需 XML)。
    • 若該接口中定義了自定義方法(如?selectByCondition),且該方法的 SQL 在?PatientcostsMapper.xml?中實現,則必須通過?mapper-locations?配置 XML 路徑,否則 MyBatis-Plus 無法找到對應的 SQL 語句。

  • @MapperScan?解決的是?Mapper 接口的注冊問題mapper-locations?解決的是?XML 映射文件的加載問題,兩者功能獨立,可同時使用。

三、目錄結構建議

為避免混淆,建議按以下規范組織文件:

  1. Mapper 接口位置

    src/main/java/com/neuedu/hisweb/mapper/PatientcostsMapper.java
    
    ?

    (與?@MapperScan("com.neuedu.hisweb.mapper")?掃描路徑一致)

  2. XML 映射文件位置

    src/main/resources/mapper/PatientcostsMapper.xml
    
    ?

    (與?mapper-locations: classpath:mapper/*.xml?配置路徑一致)

四、可能的沖突場景與解決方案

1.?XML 與注解的 SQL 定義沖突
  • 問題:若 Mapper 接口的某個方法同時通過注解(如?@Select)和 XML 定義 SQL,則?XML 配置優先級更高,會覆蓋注解中的 SQL。
  • 解決方案:同一方法的 SQL 定義只能選擇一種方式(注解或 XML),避免重復定義。
2.?Mapper 接口未被掃描
  • 問題:若?@MapperScan?掃描路徑錯誤(如寫成?@MapperScan("com.neuedu.hisweb.dao")),則 Spring 無法找到?PatientcostsMapper,導致啟動時報錯。
  • 解決方案:確保?@MapperScan?的包路徑與 Mapper 接口實際路徑一致。

五、驗證配置是否生效

  1. 啟動應用:若控制臺無?NoSuchBeanDefinitionException?或?Invalid bound statement?錯誤,說明配置正確。
  2. 查看日志
    • 若配置了?mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl,執行 SQL 時會打印 XML 或注解中的 SQL 語句,可驗證是否正確加載。

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

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

相關文章

基于ssm的教學質量評估系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

【STM32】G030單片機開啟超過8個ADC通道的方法

如圖所示通道數量已經超過8個&#xff0c;按照之前博客的辦法已經行不通了 CubeMX配置STM32F103C8T6多路ADC配合DMA采集_stm32f103c8t6的adc采樣率-CSDN博客 這里筆者開了10個channel&#xff0c;注意切換為不完全配置&#xff0c;否則的話最多只有8個rank 開DMA&#xff0c;…

不同網絡I/O模型的原理

目錄 1、I/O的介紹 1.1、I/O 操作分類 1.2、I/O操作流程階段 1.3、I/O分類 2、同步I/O 2.1、阻塞I/O 2.2、非阻塞I/O 2.3、I/O復用 2.4、信號驅動式I/O 3、異步I/O 前言 在網絡I/O之中&#xff0c;I/O操作往往會涉及到兩個系統對象&#xff0c;一個是用戶空間調用I/O…

在正則表達式中語法 (?P<名字>內容)

&#x1f3af; 重點解釋&#xff1a;?P<xxx> 是什么語法&#xff1f; 這一整段&#xff1a; (?P<xxx>...)是 Python 正則表達式中 “命名捕獲組” 的語法。 咱們現在一個字一個字來解釋&#xff1a; ? (?...) 是干啥的&#xff1f; 這是一個捕獲組&#xff…

中興B860AV1.1_MSO9280_降級后開ADB-免刷機破解教程(非刷機)

中興B860AV1.1江蘇移動-自動降級包 關于中興b860av1.1頑固盒子降級教程終極版 將附件解壓好以后&#xff0c;準備一個8G以下的U盤重新格式化為FAT32格式后&#xff0c;并插入電腦 將以下文件及文件夾一同復制到優盤主目錄下&#xff08;見下圖&#xff09; 全選并復制到U盤主目…

2025-06-13【視頻處理】基于視頻內容轉場進行分割

問題&#xff1a;從網上下載的視頻文件&#xff0c;是由很多個各種不同的場景視頻片段合并而成。現在要求精確的把各個視頻片段從大視頻里分割出來。 效果如圖&#xff1a;已分割出來的小片段 思考過程 難點在于檢測場景變化。為什么呢&#xff1f;因為不同的視頻情況各異&am…

ReentrantLock和RLock

文章目錄 前言一、 ReentrantLock&#xff08;單機鎖&#xff0c;Java 內置&#xff09;示例&#xff1a;方法詳解 二、RLock&#xff08;分布式鎖&#xff0c;Redisson 提供&#xff09;示例:方法詳解 三、 對比總結:四、 如何選擇&#xff1f; 前言 ReentrantLock 和 RLock 都…

thinkphp ThinkPHP3.2.3完全開發手冊

慣例配置 應用設定 APP_USE_NAMESPACE > true, // 應用類庫是否使用命名空間 3.2.1新增 APP_SUB_DOMAIN_DEPLOY > false, // 是否開啟子域名部署 APP_SUB_DOMAIN_RULES > array(), // 子域名部署規則 APP_DOMAIN_SUFFIX > , // 域名后綴 如果是…

Python Day50 學習(仍為日志Day19的內容復習)

補充&#xff1a;梳理超參數調整流程&#xff08;邏輯&#xff09; 超參數調節的流程邏輯可以總結為以下幾個步驟&#xff1a; 1. 明確目標 確定你要優化的模型和評估指標&#xff08;如準確率、F1值、AUC等&#xff09;。 2. 選擇要調節的超參數 列出模型中影響較大的超參數…

公司網絡變差的解決方法(固定IP地址沖突)

問題描述 最近公司網絡變差&#xff0c;不知道為什么。&#xff08;別的同事反饋的&#xff0c;本人沒有感覺變差&#xff0c;也是比較奇怪的現象&#xff09; 現象有視頻會議變卡等。 調查過程 1.領導給網絡公司打電話溝通&#xff0c;對面遠程看了下&#xff0c;不是設備問…

使用Prometheus+Grafana+Alertmanager+Webhook-dingtalk搭建監控平臺

一、監控平臺介紹 1.監控平臺簡述普羅米修斯四件套,分別為Prometheus、Grafana、Alertmanager、Webhook-DingTalk。Prometheus一套開源的監控&報警&時間序列數據庫的組合,由SoundCloud公司開發,廣泛用于云原生環境和容器化應用的監控和性能分析。其提供了通用的數據…

UR機器人解鎖關節扭矩控制:利用英偉達Isaac Lab框架,推動裝配自動化的Sim2Real遷移

在工業制造領域&#xff0c;機器人裝配長期依賴固定自動化模式&#xff0c;面臨部署成本高、適配性差等挑戰。多部件裝配是制造業、汽車及航空航天等行業中的核心環節。傳統裝配系統通常針對特定任務設計&#xff0c;依賴大量人工工程部署&#xff0c;靈活性不足&#xff0c;難…

ABB 605系列

系列概述 ABB Relion605系列是專為配電網設計的保護繼電器產品系列&#xff0c;代表了中低壓電力系統保護領域的技術基準。基于ABB在電力保護領域數十年的經驗&#xff0c;該系列集成了最新的數字信號處理技術和網絡通信能力&#xff0c;為變電站自動化提供了完整的解決方案。…

Python|GIF 解析與構建(6):手搓 tk 錄制工具

目錄 Python&#xff5c;GIF 解析與構建&#xff08;6&#xff09;&#xff1a;手搓 tk 錄制工具 一、工具功能概覽 二、核心架構設計 1. 幀率控制模塊 2. 屏幕捕獲模塊 3. 主應用模塊 三、關鍵技術解析 1. 屏幕捕獲技術 2. 幀率控制原理 3. 透明窗口實現 四、使用指…

在VBA中,提取word表格的文本時,通常有什么干擾符號,需要清除

標題 在VBA中&#xff0c;提取word表格的文本時&#xff0c;通常有什么干擾符號,需要清除 正文 解決問題提取word表格的文本時&#xff0c;通常有什么干擾符號,需要清除 在VBA中提取Word表格文本時&#xff0c;常見的干擾符號及其清除方法如下&#xff1a; ?? 一、主要干擾符…

C++基礎學習:深入理解類中的構造函數、析構函數、this指針與new關鍵字

前言 在C面向對象編程中&#xff0c;類是構建復雜程序的基本單元。今天&#xff0c;我們將深入探討類中的幾個核心概念&#xff1a;構造函數、析構函數、this指針以及new關鍵字。這些概念對于理解C對象生命周期和內存管理至關重要。 1. 構造函數 構造函數是類的一個特殊成員…

2025 高考游記/總結

坐標GD 新課標一卷選手 前言 思緒有點亂&#xff0c;想想從哪里說起 沒想到這個博客已經三年沒發過東西了&#xff0c;上次發還是初三準備特長生的時候&#xff0c;一瞬間就已經高考結束了&#xff0c;有種不真實感 對于高中的三年&#xff0c;有很多話、很多感悟想說&#xff…

Python基礎之函數(1/3)

函數(基礎) [函數后續還會更新兩次] 一.認識函數的作用 函數就是將一段具有獨立功能的代碼塊整合到一個整體并命名&#xff0c;在需要的位置&#xff0c;調用這個名稱即可完成對應的需求 函數在開發過程中&#xff0c;可以更高效的實現代碼重用 二.函數的使用步驟 1定義函…

AWS CloudFormation實戰:構建可復用的ECS服務部署模板

一、前言 在云原生時代,基礎設施即代碼(IaC)已成為DevOps實踐的核心組件。AWS CloudFormation作為AWS原生的IaC服務,允許開發人員和系統管理員以聲明式方式定義和部署AWS資源。本文將深入探討如何構建一個通用的CloudFormation模板,用于在AWS ECS(Elastic Container Servic…

GRUB2 啟動配置的工作原理與優先級規則詳解

一、核心組件概述 /boot/loader/entries/ 類型:目錄,存儲 BLS (Boot Loader Specification) 格式的啟動項配置文件(如 20-custom-kernel-5.14.0.conf)。管理工具:由 grubby、kernel-install 等工具自動生成或修改。配置內容:每個文件定義一個啟動項的詳細參數(內核路徑、…