Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • Java核心基础

  • 框架的艺术

    • Spring

    • Mybatis

      • Mybatis的原理介绍及超详细使用
      • Mybatis增删改查,这一篇足以
        • (一)xml结构分析
        • (二)Mybatis基本增删改查
        • (三)使用Map传入更多参数
        • (四)基于注解的开发实现
          • 4.1 配置文件中引入接口类
          • 4.2 使用注解实现sql语句
          • 4.3 测试
        • (五)总结
      • Mybatis配置详细解析
      • MyBatis实现复杂环境的Sql查询
      • Mybatis日志原来是这样使用的
      • Mybatis动态Sql详解
      • Mybatis缓存详解
      • 想在一个项目中实现多数据源切换?几行代码就搞定了
      • 用了MybatisPlus后,我很久没有手写sql了
      • 用了MyBatis的项目 如何优雅地打印SQL
    • SpringBoot

    • MQ

    • Zookeeper

    • netty

  • 分布式与微服务

  • 开发经验大全

  • 版本新特性

  • Java
  • 框架的艺术
  • Mybatis
CodeEase
2023-09-20
目录

Mybatis增删改查,这一篇足以

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

在前面一章中我们对mybatis的基本环境进行了配置,并实现了最简单的select语句查询,在这一章中,我将对Mybatis实现更多复杂查询以及优化进行讲解。

# (一)xml结构分析

通过下面这个例子先对mapper.xml结构进行讲解

<mapper namespace="com.javayz.mapper.UserMapper">
    <select id="getUserById" resultType="com.javayz.pojo.User" parameterType="int">
        select * from user where id=#{id};
    </select>
</mapper>
1
2
3
4
5

namespace:在XXXmapper.xml中,我们首先需要通过namespace定位接口,这里要填的是这个xml所对应的接口全限定名。

id:id对应于namespace接口下的方法名

resultType:resultType对应于返回值类型,这里返回的是User,就需要写上User的全限定名。

parameterType:参数类型,这里我们通过id查询,所以参数填写的是int 另外还有一个面试题中会出现的问题,#{}和${}有什么区别:

1、#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值;

2、${ }是字符串替换, MyBatis在处理${ }时,它会将sql中的${ }替换为变量的值。

更多关于xml映射的内容可以参考官方中文文档对这部分的解释,十分详细。 https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

# (二)Mybatis基本增删改查

Mybatis实现增删改查很简单,在前面一篇博客中已经把mybatis的环境搭建完成,这里就直接进行增删改查:

首先在UserMapper下新建四个接口实现增删改查:

public interface UserMapper {
    //根据id查询用户
    User getUserById(int id);
    //插入一个用户
    int insertUser(User user);
    //更新用户名
    int updateUser(User user);
    //删除该用户
    int deleteUser(int id);
}
1
2
3
4
5
6
7
8
9
10

在对应的UserMapper.xml中编写sql

<mapper namespace="com.javayz.mapper.UserMapper">
    <select id="getUserById" resultType="com.javayz.pojo.User" parameterType="int">
        select * from user where id=#{id};
    </select>
    <insert id="insertUser" parameterType="com.javayz.pojo.User">
        insert into user(id,name) values(#{id},#{name});
    </insert>
    <update id="updateUser" parameterType="com.javayz.pojo.User">
        update user set name = #{name} where id = #{id};
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id};
    </delete>
</mapper>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

最后编写测试类

@Test
public void testAll(){
    //获取SqlSession
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    //执行Sql
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
    //测试查询
    User user=mapper.getUserById(1);
    System.out.println(user);
    //测试新增
    User user2=new User(3,"javayz2");
    mapper.insertUser(user2);
    //注意增删改之后需要调用commit方法
    sqlSession.commit();
    System.out.println(mapper.getUserById(3));

    //测试修改
    User user3 =new User(3,"javayz3");
    mapper.updateUser(user3);
    sqlSession.commit();
    System.out.println(mapper.getUserById(3));

    //测试删除
    mapper.deleteUser(3);
    sqlSession.commit();
    System.out.println(mapper.getUserById(3));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

最后结果如下:

9-1.png

需要注意的是,在增删改之后,需要执行sqlSession.commit();提交事务。

# (三)使用Map传入更多参数

在前面基本增删改查中,我们传入的parameterType都是一种类型,比如int,或者是User,但是更多时候我们传入sql中的参数不会这样简单,所以Map很完美的解决了这个问题。

新建一个传入map新建用户的接口方法:

//使用map插入一个用户
int insertUserByMap(Map<String,Object> map);
1
2

在对应的xml中编写sql语句,注意将parameterType替换为map

<insert id="insertUserByMap" parameterType="map">
    insert into user(id,name) values(#{id},#{name});
</insert>
1
2
3

这里传入的值就是map里定义的键值对,map传递数据,只需要取出对应的key就可以了,测试一下:

@Test
public void testInsertByMap(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String,Object> map=new HashMap<String, Object>();
    map.put("id",4);
    map.put("name","javayz4");
    mapper.insertUserByMap(map);
    sqlSession.commit();
}
1
2
3
4
5
6
7
8
9
10

# (四)基于注解的开发实现

基于注解的开发可以让代码逻辑变得很简单,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪,因此如何选择,需要考虑业务场景:

# 4.1 配置文件中引入接口类

<mappers>
    <mapper class="com.javayz.mapper.UserMapper"/>
</mappers>
1
2
3

# 4.2 使用注解实现sql语句

public interface UserMapper {
    //根据id查询用户
    @Select("select * from user where id=#{id}")
    User getUserById(int id);
}
1
2
3
4
5

# 4.3 测试

@Test
public void testSelect(){
    //获取SqlSession
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    //执行Sql
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user=mapper.getUserById(4);
    System.out.println(user);
    sqlSession.close();
}
1
2
3
4
5
6
7
8
9
10

增删改查示例:

//根据id查询用户
@Select("select * from user where id=#{id}")
User getUserById(int id);
//新增用户
@Insert("insert into user values(#{id},#{name})")
int insertUser(@Param("id")int id,@Param("name")String name);
//更新数据
@Update("update user set name='java6' where id=#{id}")
int updateUserById(int id);
//删除数据
@Delete("delete from user where id=#{id}")
int deleteUserById(int id);
1
2
3
4
5
6
7
8
9
10
11
12

在新增用户中,我们这里使用到了@Param注解:当有两个或两个以上参数的时候,必须要加上@Param注解

# (五)总结

到这里为止,你已经可以用Mybatis进行增删改查,如果只是做业务,这些就足够了,但是我们怎么只能满足于此,下面开始对Mybatis进行更深入的讲解。

上次更新: 2025/04/29, 17:22:06
Mybatis的原理介绍及超详细使用
Mybatis配置详细解析

← Mybatis的原理介绍及超详细使用 Mybatis配置详细解析→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式