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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值