> 技术文档 > MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查


MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession

  • 前言
  • 一、查询(Select)
  • 二、插入(Insert)
    • 方式一:直接插入
    • 方式二:通过对象插入
  • 三、更新(Update)
  • 四、删除(Delete)
  • 五、#{} 和 ${} 的区别
    • #{} 的用法
    • $ 的用法
  • 六、参数传递技巧
    • 1. 单个参数
    • 2. 多个参数
    • 3. 对象参数
  • 七、SQL元素
    • 1. 什么是 sql 元素?
    • 2. SQL元素基本用法
      • (1). 定义 SQL 片段
      • (2). 引用 SQL 片段
  • 八、从 SqlSessionFactory 中获取 SqlSession
    • 1. 什么是 SqlSessionFactory 和 SqlSession ?
    • 2. 如何从 SqlSessionFactory 中获取 SqlSession ?
      • 步骤 1:创建 SqlSessionFactory
      • 步骤 2:获取 SqlSession 实例
    • 3. 执行 SQL 的两种方式
      • 方式 1:直接通过 SqlSession执行(旧版用法)
      • 方式 2:通过 Mapper 接口执行(推荐用法)
        • 第一步:定义 Mapper 接口
        • 第二步:通过 session.getMapper() 获取接口实例

前言

  • 在上一篇文章中,我们详细解析了MyBatis的核心配置体系,包括XML配置结构、多环境管理方案、类型别名机制以及属性与映射器的高级用法
  • 本文将基于这些基础知识,深入探讨MyBatis XML映射器的实战应用,通过完整案例演示如何使用MyBatis实现MySQL数据库的标准CRUD操作(创建、查询、更新、删除)。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的MyBatis实战指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12969707.html?spm=1001.2014.3001.5482


一、查询(Select)

查询是MyBatis中最常用的操作,我们先看一个例子

<select id=\"selectPerson\" parameterType=\"int\" resultType=\"hashmap\"> SELECT * FROM PERSON WHERE ID = #{id}</select>
  • id:在命名空间中唯一标识这条SQL,比如selectAllTeachers

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查
MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

  • parameterType:参数类型,可以省略,MyBatis会自动推断
  • resultType:返回类型,可以是teacher、实体类全限定名等
    MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

重点注意

  • #{id} 是MyBatis的参数占位符,会防止SQL注入,相当于JDBC中的?
  • 例如上面的SQL,MyBatis会处理成:SELECT * FROM PERSON WHERE ID=?

例子分析

<select id=\"findEmpById\" resultType=\"com.niit.pojo.Emp\" parameterType=\"int\"> select * from emp where eid=#{id111};</select>

这个查询通过员工ID查询数据,返回Emp对象。注意参数名要和#{}里的一致。

二、插入(Insert)

插入数据有两种常见写法

方式一:直接插入

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

<insert id=\"insertEmp\"> insert into emp (eid, ename, fid) values (#{eid}, #{ename}, #{fid})</insert>

对应的Java方法:
MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

int insertEmp(@Param(\"eid\") int eid, @Param(\"ename\") String ename, @Param(\"fid\") int fid);

方式二:通过对象插入

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

@Insert(\"insert into emp values (#{eid},#{ename},#{fid})\")int insertOneEmp(Emp emp);

这种方式直接传入Emp对象,MyBatis会自动映射对象属性到SQL参数。

获取自增主键
如果表使用自增主键(如MySQL的ID),可以这样配置:

<insert id=\"insertAuthor\" useGeneratedKeys=\"true\" keyProperty=\"id\"> insert into Author (username,password,email,bio) values (#{username},#{password},#{email},#{bio})</insert>
  • useGeneratedKeys=\"true\":开启自增主键获取
  • keyProperty=\"id\":将自增ID赋值给对象的id属性

三、更新(Update)

更新操作和插入类似,看个例子

<update id=\"updateEmp\"> update emp set ename=#{ename}, fid=#{fid} where eid=#{eid}</update>

对应的Java方法:

int updateEmp(@Param(\"eid\") int eid, @Param(\"ename\") String ename, @Param(\"fid\") int fid);

四、删除(Delete)

删除操作最简单,看例子:

<delete id=\"deleteEmpById\" parameterType=\"int\"> delete from emp where eid=#{eid}</delete>

对应的Java方法:

int deleteEmpById(int eid);

五、#{} 和 ${} 的区别

这是MyBatis中很重要的一个知识点

#{} 的用法

  • 用于参数替换,会自动处理类型和转义
  • 防止SQL注入,推荐优先使用
  • 例子:WHERE eid=#{id} 会被处理成 WHERE eid=?

$ 的用法

  • 直接进行字符串替换,不做任何处理
  • 有SQL注入风险,慎用!
  • 主要用于动态表名、列名等场景
  • 例子:WHERE ${column} =#{value}

六、参数传递技巧

1. 单个参数

可以直接使用,无需额外处理:

Emp findEmpById(int id); // XML中直接用#{id}

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

2. 多个参数

需要用@Param注解指定参数名:

Emp findEmpByFidAndName(@Param(\"id\")int id, @Param(\"name\")String name);

对应的XML:

<select id=\"findEmpByFidAndName\" resultType=\"com.niit.pojo.Emp\"> select * from emp where eid=#{id} and ename=#{name};</select>

3. 对象参数

直接传入对象,MyBatis会自动映射属性:

int insertOneEmp(Emp emp); // XML中用#{属性名}

七、SQL元素

1. 什么是 sql 元素?

作用:定义可重复使用的 SQL 代码片段,避免重复编写相同 SQL,提升开发效率。
类比:类似 Java 中的“方法”,把常用的 SQL 片段抽出来,需要时直接“调用”。

2. SQL元素基本用法

(1). 定义 SQL 片段

<sql id=\"userColumns\"> ${alias}.id, ${alias}.username, ${alias}.password </sql>
  • id:给片段起一个唯一名字(如 userColumns),方便后续引用。
  • ${alias}:参数占位符,类似“变量”,使用时需传入具体值。

(2). 引用 SQL 片段

<select id=\"selectUsers\" resultType=\"map\"> select  <include refid=\"userColumns\"> <property name=\"alias\" value=\"t1\"/>  </include>,  <include refid=\"userColumns\"> <property name=\"alias\" value=\"t2\"/>  </include> from some_table t1 cross join some_table t2</select>
  • 核心逻辑
    1. 表示“插入”定义好的 userColumns 片段。
    2. 给片段中的 ${alias} 动态赋值,实现“同一模板,不同参数”。

八、从 SqlSessionFactory 中获取 SqlSession

1. 什么是 SqlSessionFactory 和 SqlSession ?

  • SqlSessionFactory
    类比“工厂”,专门用来生产 SqlSession 实例。

    • 作用:创建数据库连接会话,是 MyBatis 的核心入口
    • 特点:重量级对象,通常在程序启动时创建一次(单例模式)。
      MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查
  • SqlSession
    类比“数据库连接”,用于执行 SQL 操作(增删改查)。

    • 作用:包含所有操作数据库的方法(如 selectOneinsert),并管理事务。
    • 特点:轻量级对象,每次执行 SQL 时创建,使用后需关闭释放资源。
      MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

2. 如何从 SqlSessionFactory 中获取 SqlSession ?

步骤 1:创建 SqlSessionFactory

// 加载配置文件并创建工厂(示例代码)String resource = \"mybatis-config.xml\";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

步骤 2:获取 SqlSession 实例

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

try (SqlSession session = sqlSessionFactory.openSession()) { // 在这里执行 SQL 操作} // try-with-resources 自动关闭 session(无需手动调用 close())
  • 关键方法openSession()
    • 默认参数 autoCommit=false(手动提交事务),适用于查询或需要事务控制的场景。
    • openSession(true):自动提交事务(简单场景可选,但不推荐)。

3. 执行 SQL 的两种方式

方式 1:直接通过 SqlSession执行(旧版用法)

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

try (SqlSession session = sqlSessionFactory.openSession()) { // 直接调用 session 的方法执行 SQL,需传入 SQL 的唯一标识(字符串)和参数 Emp emp = (Emp) session.selectOne(\"com.niit.mapper.EmpMapper.findEmpById\", 1); // 注意:返回值需强制类型转换,字符串字面值易出错(如拼写错误)}
  • 缺点
    1. SQL 标识是字符串,写错会导致运行时错误(如找不到 SQL)。
    2. 返回值需手动强转,不够安全。

方式 2:通过 Mapper 接口执行(推荐用法)

MyBatis实战指南(四)MyBatis XML实战:利用MyBatis实现MySQL数据库的增删查改,SQL元素与从 SqlSessionFactory 中获取 SqlSession_sqlsessionfactory 增删改查

第一步:定义 Mapper 接口
package com.niit.mapper;import com.niit.pojo.Emp;import java.util.List;public interface EmpMapper { List<Emp> selectAllEmps(); // 对应 XML 中 id=\"selectAllEmps\" 的  标签 Emp findEmpById(int id); // 对应 XML 中 id=\"findEmpById\" 的  标签}
  • 要求
    • 接口方法名必须与 XML 中 SQL 的 id 一致。
    • 接口所在包需在 MyBatis 配置文件中注册(如 )。
第二步:通过 session.getMapper() 获取接口实例
try (SqlSession session = sqlSessionFactory.openSession()) { // 获取 Mapper 接口的代理对象(MyBatis 动态生成实现类) EmpMapper mapper = session.getMapper(EmpMapper.class); // 直接调用接口方法执行 SQL,参数和返回值类型安全 Emp emp = mapper.findEmpById(1); // 无需字符串标识和强制类型转换 List<Emp> emps = mapper.selectAllEmps();}
  • 优点
    1. 类型安全:参数和返回值直接对应 Java 类型,编译期检查错误。
    2. 代码简洁:无需写字符串标识,避免拼写错误。
    3. 易维护:接口方法名即 SQL 功能描述,可读性强。

以上就是这篇博客的全部内容,下一篇我们将继续探索MyBatis的更多精彩内容。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的MyBatis实战指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12969707.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述