要理解 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 对象到数据库数据的全流程操作。