当前位置: 首页 > 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.dtcms.com/a/311137.html

相关文章:

  • 【安装教程】Docker Desktop 安装与使用教程
  • 从毫秒到真义:构建工业级RAG系统的向量检索优化指南
  • Python爬虫实战:研究mahotas库,构建图像获取及处理系统
  • (思维)洛谷 P13551 ももいろの鍵 题解
  • 位菜:仪式锚与价值符
  • 24黑马SpringCloud的Docker本地目录挂载出现相关问题解决
  • 【图像处理基石】用Python实现基础滤镜效果
  • LLM中Function Call的原理及应用
  • 工业仪表盘识别误检率↓79%!陌讯多模态融合算法在设备巡检中的落地优化​
  • 安全光幕Muting功能程序逻辑设计
  • [mssql] 分析SQL Server中执行效率较低的SQL语句
  • Git、Gitee、GitHub、GitLab完整讲解:从基础到进阶
  • GaussDB 约束的使用举例
  • Leetcode-141.环形链表
  • Rust: 工具链版本更新
  • Linux网络-------4.传输层协议UDP/TCP-----原理
  • Ajax——异步前后端交互提升OA系统性能体验
  • python chardet文本编码识别代码
  • Java单元测试和设计模式
  • uniapp 富文本rich-text 文本首行缩进和图片居中
  • Day 29: 复习
  • 音视频学习(四十五):声音的产生
  • 数据集-目标检测系列- 地球仪 数据集 globe>> DataBall
  • 前端应用权限设计面面观
  • 网络基础实操篇-05-路由基础-最佳实践
  • 【机器学习】非线性分类算法(上):KNN(基于距离相似度)与朴素(特征独立)贝叶斯(基于概率统计)
  • MybatisPlus-逻辑删除
  • 【ElementPlus】深入探索ElementPlus:前端界面的全能组件库
  • 【Conda】配置Conda镜像源
  • 【Linux】vim—基操