首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

MyBatis 配置文件詳解:resultMap 關聯映射、動態 SQL、Mapper 掃描最佳實踐

     編輯:Java 綜合教學

MyBatis 配置文件詳解:resultMap 關聯映射、動態 SQL、Mapper 掃描最佳實踐

MyBatis 配置文件是 ORM 映射核心。本文通過實例講解 resultMap 複雜關聯映射、association/collection、動態 SQL 標簽、Mapper 註冊方式,並給出生產級配置模板。

1. 核心配置文件結構

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <properties resource="jdbc.properties"/>
  <typeAliases>
    <package name="com.example.entity"/>
  </typeAliases>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">...</dataSource>
    </environment>
  </environments>
  <mappers>
    <package name="com.example.mapper"/>  <!-- 掃描包自動註冊 -->
  </mappers>
</configuration>

2. resultMap 關聯映射實戰

場景:員工表關聯部門表,一對一映射

<mapper namespace="com.example.mapper.EmpMapper">
  <resultMap id="empDeptMap" type="Emp">
    <id property="empId" column="emp_no"/>
    <result property="empName" column="ename"/>
    <result property="job" column="job"/>
    <!-- 一對一關聯:association -->
    <association property="dept" javaType="Dept">
      <id property="deptNo" column="dept_no"/>
      <result property="deptName" column="dname"/>
      <result property="loc" column="loc"/>
    </association>
  </resultMap>
  
  <select id="selectEmpWithDept" resultMap="empDeptMap">
    SELECT e.*, d.dept_no, d.dname, d.loc
    FROM emp e JOIN dept d ON e.dept_no = d.dept_no
  </select>
</mapper>

3. 一對多映射:collection

<resultMap id="deptEmpsMap" type="Dept">
  <id property="deptNo" column="dept_no"/>
  <result property="deptName" column="dname"/>
  <!-- 一對多:collection -->
  <collection property="emps" ofType="Emp">
    <id property="empId" column="emp_no"/>
    <result property="empName" column="ename"/>
  </collection>
</resultMap>

4. 動態 SQL 核心標簽

標簽用途示例
<if>條件判斷<if test="name != null">AND name=#{name}</if>
<where>智能 WHERE/AND/OR 處理自動去除首個 AND/OR
<trim>自定義前後綴處理<trim prefix="WHERE" suffixOverrides="AND|OR">
<foreach>集合遍歷<foreach item="id" collection="ids" separator=",">#{id}</foreach>
<choose/when/otherwise>多分支類似 switch-case
<bind>定義變量<bind name="pattern" value="'%' + name + '%'" />

5. 動態 SQL 實戰:條件查詢

<select id="selectByCondition" resultType="Emp">
  SELECT * FROM emp
  <where>
    <if test="empName != null and empName != ''">
      AND ename LIKE #{empName}
    </if>
    <if test="deptNo != null">
      AND dept_no = #{deptNo}
    </if>
    <if test="job != null">
      AND job = #{job}
    </if>
  </where>
  ORDER BY emp_no
</select>

6. #{ } vs ${ } 關鍵區別

  • #{ }:預編譯參數佔位符,防 SQL 注入,MyBatis 生成 PreparedStatement,參數設置用 setString/setInt
  • ${ }:字符串直接替換,構建 SQL 片段(如表名、排序字段),有注入風險,僅用於不可參數化場景

7. Mapper 註冊三種方式

  1. XML 相對路徑:<mapper resource="mapper/EmpMapper.xml"/>
  2. 全限定類名:<mapper class="com.example.mapper.EmpMapper"/>(需接口+XML同名同目錄)
  3. 包掃描(推薦):<package name="com.example.mapper"/>,Spring 整合用 MapperScannerConfigurer

8. 實體類與 DAO 接口

public class Dept {
    private Integer deptNo;
    private String deptName;
    private String loc;
    // getter/setter
}

public interface DeptMapper {
    List<Dept> selectAll();
    int insert(Dept dept);
    int deleteById(Integer deptNo);
    List<Dept> selectLikeName(@Param("name") String name);
}

9. 測試代碼

@Test
public void testSelectAll() {
    SqlSession session = sqlSessionFactory.openSession();
    DeptMapper mapper = session.getMapper(DeptMapper.class);
    List<Dept> list = mapper.selectAll();
    list.forEach(System.out::println);
}

總結

MyBatis 配置核心:resultMap 解決對象關係映射、動態 SQL 構建靈活查詢、#{ } 防注入、包掃描簡化註冊。生產環境建議:XML 與接口同包同名、複雜 SQL 抽取為片段(<sql>)、適當使用緩存(<cache>)、開啟 mapUnderscoreToCamelCase 自動駝峰映射。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved