要理解 MyBatis 語法及其與 MySQL 的區別,首先需要明確兩者的本質定位:MyBatis 是 Java 的持久層框架(負責 Java 對象與數據庫數據的映射),而MySQL 是關系型數據庫管理系統(負責數據的存儲和 SQL 執行)。兩者屬于不同層面的技術,但在實際開發中常配合使用。
一、MyBatis 語法詳解
MyBatis 的核心是通過映射配置(XML 文件或注解)將 Java 方法與 SQL 語句關聯,簡化 JDBC 的繁瑣操作。其語法主要體現在映射規則、參數傳遞、結果處理和動態 SQL 等方面。
1. 核心配置文件(mybatis-config.xml)
用于全局配置 MyBatis,包括數據庫連接信息、映射文件路徑、插件等。
示例:
<?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><!-- 環境配置(數據庫連接) --><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!-- 映射文件路徑(關聯SQL與Java方法) --><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>
2. 映射文件(如 UserMapper.xml)
最常用的 MyBatis 語法載體,用于定義 SQL 語句與 Java 接口方法的映射。核心標簽包括<select>
、<insert>
、<update>
、<delete>
等。
(1)基礎查詢(select 標簽)
<!-- namespace對應Java接口的全類名 -->
<mapper namespace="com.example.mapper.UserMapper"><!-- id對應接口中的方法名,resultType指定返回值類型(Java對象) --><select id="getUserById" parameterType="int" resultType="com.example.pojo.User">SELECT id, username, age FROM user WHERE id = #{id}</select>
</mapper>
對應的 Java 接口:
public interface UserMapper {User getUserById(int id); // 方法名與xml中id一致
}
(2)參數傳遞
#{param}
:預編譯參數(推薦,防止 SQL 注入),如#{id}
。${param}
:字符串拼接(有注入風險,用于動態表名等場景),如${tableName}
。- 多參數傳遞:使用
@Param
注解或Map
:<select id="getUserByUsernameAndAge" resultType="User">SELECT * FROM user WHERE username = #{username} AND age = #{age} </select>
接口:User getUserByUsernameAndAge(@Param("username") String name, @Param("age") int age);
(3)結果映射(ResultMap)
解決 Java 對象屬性與數據庫列名不匹配的問題(如 Java 屬性userName
對應數據庫列user_name
):
<resultMap id="userResultMap" type="User"><id property="id" column="id"/> <!-- 主鍵映射 --><result property="userName" column="user_name"/> <!-- 普通字段映射 --><result property="userAge" column="user_age"/>
</resultMap><select id="getUser" resultMap="userResultMap">SELECT id, user_name, user_age FROM user WHERE id = #{id}
</select>
(4)動態 SQL(核心特性)
根據條件動態生成 SQL,避免手動拼接 SQL 的麻煩。常用標簽:
<if>
:條件判斷<where>
:自動處理 AND/OR 邏輯<foreach>
:遍歷集合(如 IN 查詢)<choose>
/<when>
/<otherwise>
:類似 Java 的 switch-case
示例(動態查詢用戶):
<select id="getUserByCondition" parameterType="User" resultType="User">SELECT * FROM user<where><if test="username != null">AND username LIKE CONCAT('%', #{username}, '%')</if><if test="age != null">AND age = #{age}</if></where>
</select>
示例(批量插入):
<insert id="batchInsert" parameterType="java.util.List">INSERT INTO user (username, age) VALUES<foreach collection="list" item="item" separator=",">(#{item.username}, #{item.age})</foreach>
</insert>
(5)注解方式(簡化配置)
對于簡單 SQL,可直接用注解替代 XML:
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(int id);@Insert("INSERT INTO user (username, age) VALUES (#{username}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id") // 返回自增主鍵void insertUser(User user);
}
二、MyBatis 與 MySQL 的區別
維度 | MyBatis | MySQL |
---|---|---|
本質 | Java 持久層框架(ORM 工具) | 關系型數據庫管理系統(DBMS) |
作用 | 簡化 Java 與數據庫的交互(映射對象與 SQL) | 存儲數據、執行 SQL 語句、管理數據完整性 |
語法形式 | 基于 XML 標簽(如<select> 、<if> )或 Java 注解(如@Select ) | 基于 SQL 語言(如SELECT 、INSERT 、JOIN ) |
處理對象 | 關聯 Java 方法與 SQL,處理對象與數據的映射 | 直接操作數據表、行、列等數據結構 |
執行依賴 | 依賴數據庫(如 MySQL、Oracle)執行 SQL | 自身作為數據庫引擎,直接執行 SQL |
核心能力 | 動態 SQL 生成、參數映射、結果映射、事務管理等 | 數據存儲、索引、事務(ACID)、SQL 解析執行等 |
三、總結
- MyBatis是 “中間層”,專注于 Java 代碼與 SQL 的映射,解決 “對象 - 關系” 不匹配問題,簡化數據庫操作的代碼編寫。
- MySQL是 “數據存儲層”,專注于數據的存儲和 SQL 的執行,是 MyBatis 操作的目標數據庫之一。
實際開發中,MyBatis 負責 “怎么調用 SQL”,而 MySQL 負責 “怎么執行 SQL 并返回數據”,兩者配合完成從 Java 對象到數據庫數據的全流程操作。