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

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.lryc.cn/news/608378.html

相关文章:

  • 驾驶场景玩手机识别:陌讯行为特征融合算法误检率↓76% 实战解析
  • 综合:单臂路由+三层交换技术+telnet配置+DHCP
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月2日第154弹
  • 位菜:仪式锚与价值符
  • 先学Python还是c++?
  • Mybatis学习之各种查询功能(五)
  • Web 开发 10
  • stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(二)
  • sqli-labs:Less-20关卡详细解析
  • 沿街晾晒识别准确率↑32%:陌讯多模态融合算法实战解析
  • Linux网络-------4.传输层协议UDP/TCP-----原理
  • QUdpSocket 详解:从协议基础、通信模式、数据传输特点、应用场景、调用方式到实战应用全面解析
  • kong网关集成Safeline WAF 插件
  • 力扣刷题日常(11-12)
  • [硬件电路-122]:模拟电路 - 信号处理电路 - 模拟电路与数字电路、各自的面临的难题对比?
  • 面试实战,问题二十二,Java JDK 17 有哪些新特性,怎么回答
  • 【0基础PS】PS工具详解--图案图章工具
  • 二叉树算法之【Z字型层序遍历】
  • ctfshow_源码压缩包泄露
  • AIGC系列:本地部署大模型
  • Rust进阶-part2-泛型
  • Flutter基础知识
  • 在线问诊系统源码解析:图文+视频双模式架构开发全攻略
  • CH32V单片机启用 FPU 速度测试
  • 江协科技STM32 13-1 PWR电源控制
  • 从零打造大语言模型--处理文本数据
  • FFmpeg+javacpp中纯音频播放
  • 互联网医院系统,互联网医院好处有哪些?
  • 音视频学习(四十八):PCM和WAV
  • CatBoost 完整解析:类别特征友好的梯度提升框架