当前位置: 首页 > ds >正文

MyBatis与MySQL

要理解 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 的区别

维度MyBatisMySQL
本质Java 持久层框架(ORM 工具)关系型数据库管理系统(DBMS)
作用简化 Java 与数据库的交互(映射对象与 SQL)存储数据、执行 SQL 语句、管理数据完整性
语法形式基于 XML 标签(如<select><if>)或 Java 注解(如@Select基于 SQL 语言(如SELECTINSERTJOIN
处理对象关联 Java 方法与 SQL,处理对象与数据的映射直接操作数据表、行、列等数据结构
执行依赖依赖数据库(如 MySQL、Oracle)执行 SQL自身作为数据库引擎,直接执行 SQL
核心能力动态 SQL 生成、参数映射、结果映射、事务管理等数据存储、索引、事务(ACID)、SQL 解析执行等

三、总结

  • MyBatis是 “中间层”,专注于 Java 代码与 SQL 的映射,解决 “对象 - 关系” 不匹配问题,简化数据库操作的代码编写。
  • MySQL是 “数据存储层”,专注于数据的存储和 SQL 的执行,是 MyBatis 操作的目标数据库之一。

实际开发中,MyBatis 负责 “怎么调用 SQL”,而 MySQL 负责 “怎么执行 SQL 并返回数据”,两者配合完成从 Java 对象到数据库数据的全流程操作。

http://www.xdnf.cn/news/16982.html

相关文章:

  • 深入理解C++中的Lazy Evaluation:延迟计算的艺术
  • PostGIS面试题及详细答案120道之 (081-090 )
  • uniapp倒计时计算
  • 称重传感器的价格迷局:定制化与规模化的博弈之道
  • C++11 -- 智能指针
  • PHP面向对象编程与数据库操作完全指南-上
  • pve 删除集群
  • 优化算法专栏——阅读导引
  • 损失函数和调度器相关类代码回顾理解 |nn.CrossEntropyLoss\CosineAnnealingLR
  • 1 前言:什么是 CICD 为什么要学 CICD
  • Java试题-选择题(3)
  • (28)运动目标检测之随机曲线上的离散点进行插值
  • 利用CompletableFuture优化查询效率
  • Android Material Components 全面解析:打造现代化 Material Design 应用
  • Prim算法
  • javascript中call、apply 和 bind 的区别详解
  • 2025新征程杯全国54校园足球锦标赛在北京世园公园隆重开幕
  • qt贝塞尔曲线演示工具
  • Nestjs框架: 请求生命周期与应用生命周期
  • Java向量化
  • python列表推导式
  • Android Frameworks从零开始
  • codex体验失败记录
  • 删除MicroGame
  • 基于单片机汽车少儿安全预警系统
  • 【PyTorch✨】01 初识PyTorch
  • 自动驾驶的未来:多模态传感器钻机
  • SQL中的HAVING用法
  • ICML 2025 | 深度剖析时序 Transformer:为何有效,瓶颈何在?
  • ZYNQ与MPSoC实战:从Vitis入门到项目开发