MyBatis之数据操作增删改查基础全解

简介: 本文详解MyBatis四大核心操作:增删改查及模糊查询。涵盖事务提交、参数绑定(#与$区别)、资源管理及接口-映射规范,并提供完整代码示例与最佳实践,助你快速掌握MyBatis基础应用。(239字)

💡【开发哲学共勉】

在 MyBatis 的世界里,事务提交是对数据变更的郑重承诺,参数绑定藏着对安全的敬畏,资源闭环是对系统的温柔守护,而接口与映射的一 一对应,恰是规范赋予效率的礼物

🎉 前言

本节来讲解一下如何使用MyBatis来对数据库做一个基本的增删改查操作,希望能够帮助到你(๑•̀ㅂ•́)و✧

个人主页:艺杯羹🌿

系列专栏:MyBatis🚀

1. ➕MyBatis添加数据

现在来演示一下如何添加用户

1.1. 持久层接口添加方法

// 写在UserMapper接口里
void add(User user);

1.2. 映射文件添加标签

// 写在UserMapper.xml配置文件中
<insert id="add" parameterType="com.itbaizhan.pojo.User">
   insert into user(username,sex,address) values(#{username},#{sex},#{address})
</insert>

1.3. 编写测试方法

// 在测试包下的测试类里进行测试
@Test
public void testAdd() throws Exception{
   InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
   SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
   SqlSessionFactory factory = builder.build(is);
   SqlSession session = factory.openSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = new User("罗阳", "男", "北京");
   mapper.add(user);
   // 提交事务,默认手动提交事务
   // 所以要先提交事务,然后再关闭资源
   // 如果没有提交事务,虽然不会报错,但是数据不会写到表当中
   session.commit();
   session.close();
   is.close();
 }

接口如图:

注意:

  1. 当接口方法的参数类型为POJO类型时,SQL语句中绑定参数时使用 #{POJO的属性名} 即可
  2. MyBatis事务默认手动提交,所以在执行完增删改方法后,需要手动调用SqlSession对象的事务提交方法,否则数据库将不发生改变
    查询不改变数据库,所以不用提交事务

2. ✏️MyBatis修改数据

因为在操作数据库的时候,像前面的配置获取SqlSession的代码,是可以复用的,所以这里先将这个配置获取SqlSession的代码提取出来

2.1. 代码的优化

MyBatis的测试方法在操作数据库前都需要获取代理对象,操作数据库后都需要释放资源,可以利用Junit的前置后置方法,优化测试类代码

InputStream is = null;
SqlSession session = null;
UserMapper userMapper = null;
@Before
public void before() throws IOException {
  // (1)读取核心配置文件
  is = Resources.getResourceAsStream("SqlMapConfig.xml");
  // (2)创建SqlSessionFactoryBuilder对象
  SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  // (3)SqlSessionFactoryBuilder对象获取SqlSessionFactory对象
  SqlSessionFactory factory = builder.build(is);
  // (4)SqlSessionFactory对象获取SqlSession对象
  session = factory.openSession();
  // (5)获取代理对象
  userMapper = session.getMapper(UserMapper.class);
}
@After
public void after() throws IOException {
  // 释放资源
  session.close();
  is.close();
}

现在来修改一下用户

2.2. 持久层接口添加方法

void update(User user);

2.3. 映射文件添加标签

<update id="update" parameterType="com.yibeigen.pojo.User">
        update User
        set username = #{username}, sex = #{sex}, address=#{address}
        where id = #{id}
</update>

2.4. 编写测试方法

// 这里直接使用Mapper动态代理就可以了(๑•̀ㅂ•́)و✧
@Test
public void testUpdate(){
    User user = new User(6, "老王", "男", "溆浦");
    userMapper.update(user);
    sqlSession.commit();
}

3. 🗑️MyBatis删除数据与根据Id查询

因为删除和查询都和上面操作差不多,所以这里就两个一起讲了

3.1. 删除用户

  1. 持久层接口添加方法
    void delete(int userId);
  2. 映射文件添加标签
<delete id="delete" parameterType="int">
   delete from user where id = #{id}
</delete>

注:当方法的参数类型是简单数据类型时,#{}中可以写任意名称
简单数据类型:基本数据类型、字符串等

  1. 编写测试方法
@Test
public void testDelete(){
  userMapper.delete(8);
  session.commit();
}

3.2. 根据ID查询用户

  1. 持久层接口添加方法
    User findById( int userId );
  2. 映射文件添加标签
<select id="findById" parameterType="int" resultType="com.yibeigen.pojo.User">
   select * from user where id = #{userId}
</select>

3. 编写测试方法

@Test
public void testFindById(){
  User user = userMapper.findById(1);
  System.out.println(user);
}

4. 🌫️MyBatis模糊查询

模糊查询一共有三个写法:#, $,

4.1. 使用 # 定义参数

1. 持久层接口添加方法
List findByNameLike(String username);

2. 映射文件添加标签

<select id="findByUsernameLike" parameterType="String" resultType="com.yibeigen.pojo.User">
        select * from user where username like #{name}
 </select>

3. 编写测试方法

@Test
public void testFindByNameLike(){
  List<User> users = userMapper.findByNameLike("%王%");
  for (User user:users){
    System.out.println(user);
   }
}

这里使用 # 和上面写的#是一个意思,像这里的第2步映射文件中的 #{name} 就相当于是这个类中的name值
然后我们在测试类中传值的时候,要注意加上 %
我们看到在映射文件中,parameterType 的值为 string 而没有写 java.lang.String
这是因为,系统已经给 java.lang.String取了别名 string,所以直接用就可以了  

数据类型

别名

数据类型

别名

byte

_byte

Byte

byte

long

_long

Long

long

short

_short

Short

short

int

_int

Integer

int/integer

int

_integer

Double

double

double

_double

Float

float

float

_float

Boolean

boolean

boolean

_boolean

Date

date

String

string

BigDecimal

decimal/bigdecimal

Object

object

Map

map

HashMap

hashmap

List

list

ArrayList

arraylist

Collection

collection

Iterator

iterator



4.2. 使用$定义参数

模糊查询如果不想在调用方法时参数加%,可以使用拼接参数的方式设置
Sql:

<select id="findByUsernameLike" parameterType="string" resultType="com.yibeigen.pojo.User">
   select * from user where username like '%${value}%'
</select>
%${value}%:必须这么写

测试方法写法如下:

@Test
public void testFindByNameLike(){
  List<User> users = userMapper.findByUsernameLike("金");
  users.forEach(System.out::println);
}

#和$的区别:

  1. #表示sql模板的占位符,$表示将字符串拼接到sql模板中。
  2. #可以防止sql注入,一般能用就不用$。
  3. ${}内部的参数名必须写value。

4.3. 使用 定义参数

如果使用 # 还不想在调用方法的参数中添加 %
可以使用 , 允许我们在 Sql语句以外创建一个变量  并可以将其绑定到当前的Sql语句中。用法如下:

<select id="findByUsernameLike" parameterType="string" resultType="com.yibeigen.pojo.User">
  <bind name="likeName" value="'%'+username+'%'"/>
   select * from user where username like #{likeName}
</select>

测试方法写法如下:

@Test
public void testFindByNameLike(){
  List<User> users = userMapper.findByUsernameLike("金");
  users.forEach(System.out::println);
}

5. 总结

到此,文章就告一段落,希望能够帮助到你🙂

目录
相关文章
|
2月前
|
缓存 测试技术 API
大模型API中转站避坑:满血验证、倍率换算与降智识别(附压测代码)
从工程师视角系统梳理大模型API中转站的评估方法:讲清兑换比例与倍率的真实换算关系,给出满血模型验证三招(复杂推理压测、模型指认、长上下文压力测试)与可运行的Python压测脚本,并总结稳定性、协议兼容、计费透明等接入要点和先测后充的避坑建议。
|
2月前
|
缓存 人工智能 计算机视觉
Qwen3.8-Flash模型介绍:能力、上下文限制、费用定价详细说明
通义千问最新多模态大模型Qwen3.8-Flash(ID:qwen3.8-flash),原生支持百万级上下文(100万tokens)、文本/图像/视频输入,输出为文本。具备Function Calling、结构化输出、联网搜索(限北京/新加坡)等能力,兼容OpenAI/Anthropic协议,已在阿里云百炼平台开放免费试用(赠100万Tokens)。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
|
2月前
|
Java 程序员 应用服务中间件
Maven之初识与安装
本文详解Maven安装与配置全流程:从基础概念、下载安装、环境变量配置到版本验证,助新手一次理清逻辑、顺利完成部署;涵盖一键构建、依赖管理核心功能,并提供交流支持。
170 0
Maven之初识与安装
|
2月前
|
人工智能 自然语言处理 API
LangChain+LangGraph架构拆解:基于复杂AI任务编排与状态管理的大模型应用开发21.4
本文深度解析LangChain与LangGraph两大主流大模型开发框架:LangChain以链式组件封装实现快速入门与轻量应用;LangGraph则通过有向状态图支持分支、循环、多智能体等复杂编排。二者互补协同,构成从Demo到生产级AI应用的完整技术栈。
197 2
阿里云轻量应用服务器68元/年,新用户特价,不要退款,重新买价格459元,涨价了!
阿里云轻量应用服务器新用户专享价68元/年(2核2G、200M带宽、40GB ESSD),秒杀低至38元。⚠️地域选定后不可修改,退款将失去新用户资格,再购恢复原价459元/年!务必下单前确认地域,避免浪费优惠。阿里云轻量应用服务器官网:https://t.aliyun.com/U/dwftch
|
2月前
|
人工智能 安全 中间件
AI 帮你改了 20 个文件,最后 3 个忘了改——长任务为什么总是"差一口气"?
AI长任务常因“失忆”、误删、静默跳过、截断编造等问题翻车。UseIO通过Plan驱动拆解、检查点回滚、三级安全门控、结构化错误处理与交付前四点复查,构建工程级可靠性防护链,显著提升多文件重构等复杂任务的完成率与稳定性。(239字)
|
2月前
|
人工智能 C语言
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
本文详解三类经典编程题:十进制转任意进制(填空)、非素数求和(修改)与重复数字统计(设计),含完整代码、逐空分析及易错点解析,助你夯实C语言基础。
117 2
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
|
2月前
|
Java 应用服务中间件 Shell
Tomcat 使用与配置全解
Tomcat是Apache开源的轻量级Java Web容器,实现Servlet/JSP规范,支持Web应用部署与运行。需搭配JDK使用,目录结构清晰(如webapps存应用、conf存配置),默认端口8080,启动简单,广泛用于开发与中小型项目部署。
145 1
Tomcat 使用与配置全解
|
2月前
|
SQL Java 数据库连接
MyBatis 之基础概念与框架原理详解
MyBatis是一款轻量级半自动ORM框架,封装JDBC,让开发者专注SQL编写与业务逻辑;支持XML/注解配置、动态SQL、高级映射,SQL与代码分离,灵活高效,显著提升持久层开发效率。(239字)
121 1
MyBatis 之基础概念与框架原理详解
|
2月前
|
存储 C语言
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
本文详解C语言二级考试三类典型题:统计字母及非字母字符个数、数字字符串转双精度浮点数、二维数组上下三角区域数据对调。含题目解析、错误定位与完整代码,适合备考学生、中职生及编程爱好者提升实战能力。
113 1
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调

热门文章

最新文章