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
- parameterType:参数类型,可以省略,MyBatis会自动推断
- resultType:返回类型,可以是
teacher
、实体类全限定名等
重点注意:
#{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)
插入数据有两种常见写法:
方式一:直接插入
<insert id=\"insertEmp\"> insert into emp (eid, ename, fid) values (#{eid}, #{ename}, #{fid})</insert>
对应的Java方法:
int insertEmp(@Param(\"eid\") int eid, @Param(\"ename\") String ename, @Param(\"fid\") int fid);
方式二:通过对象插入
@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}
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>
- 核心逻辑:
表示“插入”定义好的
userColumns
片段。给片段中的
${alias}
动态赋值,实现“同一模板,不同参数”。
八、从 SqlSessionFactory 中获取 SqlSession
1. 什么是 SqlSessionFactory 和 SqlSession ?
-
SqlSessionFactory
:
类比“工厂”,专门用来生产SqlSession
实例。- 作用:创建数据库连接会话,是 MyBatis 的核心入口。
- 特点:重量级对象,通常在程序启动时创建一次(单例模式)。
-
SqlSession
:
类比“数据库连接”,用于执行 SQL 操作(增删改查)。- 作用:包含所有操作数据库的方法(如
selectOne
、insert
),并管理事务。 - 特点:轻量级对象,每次执行 SQL 时创建,使用后需关闭释放资源。
- 作用:包含所有操作数据库的方法(如
2. 如何从 SqlSessionFactory 中获取 SqlSession ?
步骤 1:创建 SqlSessionFactory
// 加载配置文件并创建工厂(示例代码)String resource = \"mybatis-config.xml\";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
步骤 2:获取 SqlSession 实例
try (SqlSession session = sqlSessionFactory.openSession()) { // 在这里执行 SQL 操作} // try-with-resources 自动关闭 session(无需手动调用 close())
- 关键方法:
openSession()
- 默认参数
autoCommit=false
(手动提交事务),适用于查询或需要事务控制的场景。 openSession(true)
:自动提交事务(简单场景可选,但不推荐)。
- 默认参数
3. 执行 SQL 的两种方式
方式 1:直接通过 SqlSession执行(旧版用法)
try (SqlSession session = sqlSessionFactory.openSession()) { // 直接调用 session 的方法执行 SQL,需传入 SQL 的唯一标识(字符串)和参数 Emp emp = (Emp) session.selectOne(\"com.niit.mapper.EmpMapper.findEmpById\", 1); // 注意:返回值需强制类型转换,字符串字面值易出错(如拼写错误)}
- 缺点:
- SQL 标识是字符串,写错会导致运行时错误(如找不到 SQL)。
- 返回值需手动强转,不够安全。
方式 2:通过 Mapper 接口执行(推荐用法)
第一步:定义 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 配置文件中注册(如
)。
- 接口方法名必须与 XML 中 SQL 的
第二步:通过 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();}
- 优点:
- 类型安全:参数和返回值直接对应 Java 类型,编译期检查错误。
- 代码简洁:无需写字符串标识,避免拼写错误。
- 易维护:接口方法名即 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