Mybatis学习笔记:使用注解开发(CRUD)

2023-10-26

学习内容:使用注解开发(CRUD)

1. 怎么使用注解

1.1、注解在接口上实现
在这里插入图片描述
1.2、需要再核心配置文件中绑定接口
在这里插入图片描述
1.3、编写测试程序
在这里插入图片描述
我们使用注解就可以不用编写UserMapper.xml(可以理解成接口实现类)文件了。

Mybatis详细的执行流程:
在这里插入图片描述

本质:反射机制实现
底层:动态代理
在这里插入图片描述

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

2. 用注解实现CRUD(增删改查)

数据库中的数据:
在这里插入图片描述

2.1、我们可以在工具类创建的时候实现自动提交事务

public static SqlSession getSqlSession() {
   //这里设置了true之后,执行事务自动提交
   //就不用再手动写代码了(sqlSession.commit();)
   return sqlSessionFactory.openSession(true);
}

2.2、查询(根据id查询用户)

  • 编写接口,增加注解
方法存在多个参数的时候,所有的参数前面必须加上@Param("参数名")注解
只有基本数据类型要加@Param(),引用数据类型不用加
sql语句中的#{属性名}中的属性名必须和@Param("属性名")中的属性名一致,否则将找不到
//通过id查询用户
//方法存在多个参数的时候,所有的参数前面必须加上@Param("参数名")注解
//只有基本数据类型要加@Param(),引用数据类型不用加
//sql语句中的#{属性名}中的属性名必须和@Param("属性名")中的属性名一致,否则将找不到
@Select("select * from user where id=#{id}")
User getUserById(@Param("id") int id);
  • 编写测试程序
//根据id查询用户
@Test
public void getUserById(){
   SqlSession sqlSession = MybatisUtils.getSqlSession();
   UserMapper mapper = sqlSession.getMapper(UserMapper.class);
   User userById = mapper.getUserById(1);
   System.out.println(userById);
   sqlSession.close();
}

结果:
在这里插入图片描述
之前说过,这里之所以password找不到是因为数据库中的属性名是pwd,而实体类中的属性名是password,两者不一致,所以查找不到(详情请见)。

但是这里没有无法使用结果映射集,只能将sql语句改为select id,name,pwd as password from mybatis.user where id = #{id},但是如果当实体类中的属性较多的时候,会很麻烦,所以还是尽量保持数据库和实体类中的属性名一致。

修改之后的结果:
在这里插入图片描述
2.3、添加

  • 编写接口,增加注解
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
  • 编写测试程序
@Test
public void addUser(){
  SqlSession sqlSession = MybatisUtils.getSqlSession();
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  int result = mapper.addUser(new User(4,"pc","123"));
  if (result>0){
       System.out.println("添加成功!");
   }
  sqlSession.close();
}

结果:在这里插入图片描述
在这里插入图片描述

2.4、修改

  • 编写接口,增加注解
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
  • 编写测试程序
@Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int result = mapper.updateUser(new User(4,"lb","123"));
        if (result>0){
            System.out.println("修改成功!");
        }
        sqlSession.close();
    }

结果:在这里插入图片描述
在这里插入图片描述
2.5、删除

  • 编写接口,增加注解
//删除
@Delete("delete from user where id=#{id}")
int deleteUser(@Param("id") int id);
  • 编写测试程序
@Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int result = mapper.deleteUser(4);
        if (result>0){
            System.out.println("删除成功!");
        }
        sqlSession.close();
    }

结果:在这里插入图片描述
在这里插入图片描述

3. 关于@Param() 注解

  • 基本类型的参数或者String类型,需要加上
  • 引用类型不需要加
  • 如果只有一个基本类型的话,可以忽略,但是建议大家都加上!
  • 我们在SQL中引用的就是我们这里的 @Param() 中设定的属性名!

4. #{}和${} 区别

延伸:

  • 用${传入数据直接显示在生成的sqI中,如上面的语句,用role. id = ${roleld,jdbcType=INT&ER},那么sq|在解析的时候值为role_ id= roleid,执行时会报错;

  • ${方式无法防止sq|注入;

  • $-般用入传入数据库对象,比如数据库表名;

  • 能用#}时尽量用#0};

注意:
Mybaties排序时使用order by动态参数时需要注意,使用${}而不用#{}。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis学习笔记:使用注解开发(CRUD) 的相关文章

  • “不能从静态上下文引用非静态方法”JPA Java

    我从这一行收到 无法从静态上下文引用非静态方法 错误 createStudent stu00001 new Date 631152000000 m WB new Type Name Bob Smith 如何正确组成 日期 我查看了 API
  • java中数字字符串间隔排序

    我正在与一些人一起上一个人课 其中有姓名 年龄范围等详细信息 年龄区间为 0 5 6 10 11 30 31 45 46 50 50 100 100 110 我正在上 Person 课name ageBand字符串间隔及其参数化构造函数 g
  • Java 8 列表到带有总和的 EnumMap

    我有以下课程 public class Mark private Long id private Student student private Integer value 0 private Subject subject public
  • 当服务器仅从请求中读取标头时,Http 客户端未收到响应

    我在 Java 中搞乱了 HTTP 和套接字 希望你能对此有所了解 当我用 Java SE 11 编写的 HTTP 服务器没有读取整个请求然后响应时 客户端不会收到它或收到错误 这是为什么 在服务器读取整个请求之前 客户端是否无法读取响应
  • 如何使用jsp上传服务器文件夹上的文件[重复]

    这个问题在这里已经有答案了 我正在尝试使用 servlet jsp 将一些图像上传到位于我的服务器上的文件夹中 下面是我的代码 它在我的本地计算机上运行 import java io import java util import java
  • 从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)

    我正在尝试将 clojure 源代码编译成类文件 并仅使用命令行运行它 没有 lein 也没有 可能 回复 我有 core cljsrc hello目录 src hello core clj 这是源代码 ns hello core defn
  • Spring:当我的类已经用@RestController注释时,为什么我仍然应该使用@RequestBody?

    我目前正在将 Java 和 Spring 用于我的 Web 服务应用程序 我正在使用 RestController希望消除使用注释的需要 ResponseBody and RequestBody注释 不幸的是 删除 RequestBody注
  • 将 LinkedHashset 内容复制到新的 ArrayList?

    我有一个最初包含一些内容的 listView 如果它得到相同的内容 我通过删除重复linkedhashset 现在 我想复制linkedhashset内容 即没有重复的内容到新的ArrayList 我尝试复制通过 p addAll 0 lh
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • 从文件执行db语句

    我在我的应用程序中使用嵌入式 Apache derby 我有一个名为的 SQL 脚本创建的数据库 sql创建数据库中的所有表并用初始数据填充它 例如 SET SCHEMA APP CREATE TABLE study study id bi
  • Java如何处理IF语句和效率

    我只是好奇 Java 实际是如何工作的if声明 注意 当我在下面说 组件 时 我指的是语句检查的各个部分 例如a b c 哪个在计算方面更有效 if a b c do stuff or if a if b if c do stuff 我之所
  • 如何反序列化数组 google-gson 内的数组

    我有这样的 JSON Answers Locale Ru Name Name1 Locale En Name Name2 Locale Ru Name Name3 Locale En Name Name4 正如你所看到的 我的数组里面有数组
  • 什么触发了java垃圾收集器

    我对 Java 中垃圾收集的工作原理有点困惑 我知道当不再有对某个对象的实时引用时 该对象就有资格进行垃圾回收 但是如果它有对实时对象的引用怎么办 可以说我有一个节点集合 它们再次引用更多节点 List 1 gt Node a gt Nod
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问
  • 返回数据集的 kSoap 和 .Net Web 服务

    我知道使用数据集是一个很大的罪恶 但由于该服务不在我的控制之下 并且创建代理服务的前景是不可能的 我想看看是否有人创建了可以使用 kSoap 序列化器反序列化的类结构 或者我是否吸错了东西 同时要启动它 看看是否可行 以下是预期的结果数据
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • 使用 Java 8 时间将时间从一个时区转换为另一时区

    我正在尝试将日期转换为GMT 5 30 to EST与java 8ZonedDateTime String inputDate 2015 04 30 13 00 DateTimeFormatter sourceFormatter DateT
  • 使用java读取行并映射过滤数据[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions publi
  • 如何使用 GWT 2.4 在服务器端动态创建 UI

    我正在尝试使用 Google Web Toolkit v2 4 创建用户界面 由于多种原因 我需要在运行时指定服务器上接口的内容 我的意思不仅仅是按钮需要动态标签等 而是整个 UI 需要在运行时创建 我的大部分 UI 都可以指定为直接的 H
  • Oracle 的商业 Hotspot JVM 相对于 OpenJDK 有哪些性能优势?

    正如这个问题中所描述的 OpenJDK 与 Java HotspotVM https stackoverflow com q 44335605 1593077 Oracle 的商业 Hotspot JVM 本质上是 OpenJDK 加上一些

随机推荐

  • 安装mingw出现download failed和unable to continue

    利用mingw get setup安装mingw总是出现download failed和unable to continue错误 截图如下 错误原因 因为服务器在外网 可能是对方服务器不稳定 连接出错等问题导致 解决办法 下载对应等离线安装
  • 11信号学习之sigaction函数及使用其实现信号捕捉案例(信号最重要的一节)

    概述 注意 在我关于信号的文章中 我所说的系统的mask的意思实际上是进程的mask 每个进程的mask都是唯一的 所以我就将其称为系统的 但不能理解为每个进程的mask都是共用的 1 sigaction函数 1 上一篇我们说的signal
  • 基于STM32的DMX512开发

    首先基本了解一下DMX512的基本协议 一 DMX512协议 DMX 是Digital MultipleX 的缩写 意为多路数字传输 DMX512控制协议是美国舞台灯光协会 usITT 于1990年发布的灯光控制器与灯具设备进行数据传输的工
  • 复习使用git(二)

    删除远程分支 git push origin delete 分支名 撤销修改 撤销工作区的修改 已修改 但尚未添加 add 使用 git restore 文件名 撤销工作区的修改 Note git checkout 文件名 checkout
  • 基于STM32F407的SDCard读写操作及USB挂载(HAL库)

    基于STM32F407的SDCard读写操作及USB挂载 HAL库 本来在上一篇SD卡读写也都OK了 后来想着挂载SD卡做U盘 就去查了下资料 结果基本全是HAL库的 原来没用过HAL库 于是本着好奇的心态去下了 说实话 确实看起来简单多了
  • 【Spring Boot】——集成JSON工具

    前言 json是现在非常流程的数据交换格式 所以对于被开发人员来说如何更好了解java对象和json格式之间的转换是至关重要的 接下来我们来好好说一说 一 什么是JSON 摘自百度百科 JSON JavaScript Object Nota
  • android 涨潮动画加载_潮汐apk客户端-潮汐android最新版APP下载v2.0.1.1 免费版-腾牛安卓网...

    潮汐一个非常有特色的静心平台 它可以让你在工作困乏时聆听几分钟就可以更加高效的工作 让你的工作效率达到更好的专注 它可以让你的心情更加温和 让你的每一天不再那么浮躁和枯燥无味 让你的心情越来越舒畅 喜欢的朋友快来腾牛网下载吧 软件特色 保持
  • Linux实验报告【全集】

    若对你有帮助 记得点赞 关注我哦 实验目录 Linux常用命令 linux下的shell编程 Linux下的c编程 Linux下的API编程 每个实验的图片都比较多 一开始实验基本都是书上的例题 后面会变难 做实验时往往会想 为什么每届都做
  • 开发环境配置:服务器训练模型工具tmux基础使用

    开发环境配置 服务器训练模型工具tmux基础使用 1 tumx可以做什么 2 Ubuntu安装tmux 3 常用命令 3 1 新建会话并进入 3 2 退出会话 3 3 查看存在的会话 3 4 重新进入会话 3 5 销毁会话 1 tumx可以
  • C#检测是否在单元测试环境

    true则为单元测试环境下 false不是 bool unitTest System Environment StackTrace IndexOf NUnit Framework StringComparison CurrentCultur
  • ShareSDK集成第三方登录和分享的步骤

    转自 http my oschina net u 1024921 blog 170588 之前用过这个几次了 而每次都没有记录一下具体的步骤 这次就写一下吧 1 去ShareSDK下载官方的SDK 2 现在他们的服务特别人性化 解压SDK之
  • SiamFC:利用全卷积孪生网络进行视频跟踪

    目录 论文下载地址 代码下载地址 论文作者 模型讲解 模型结构 模型输入 损失函数 训练过程 结果分析 传送门 论文下载地址 SiamFC论文地址 SiamFC论文百度网盘下载地址 提取码 7309 SiamFC论文翻译 水印 百度网盘下载
  • Python-logging详解(彩色日志扩展,多进程安全等)

    目录 简介 日志级别 记录器 处理器 格式器 多线程与多进程安全 代码 导入及全局变量 函数 实验及结果 参考 简介 日志是工程中不可缺少的一部分 国家等保2 0也规定 至少保留日志180天 对于程序员来说 日志也方便进行记录及排错 log
  • 算法10——c++实现中缀表达式计算

    题目描述 读入一个只包含 x 的非负整数计算表达式 计算该表达式的值 输入格式 测试输入包含若干测试用例 每个测试用例占一行 每行不超过200个字符 整数和运算符之间用一个空格分隔 没有非法表达式 当一行中只有0时输入结束 相应的结果不用输
  • c 语言 成员变量模板,C++类模板与模板类深入详解

    1 在c 的Template中很多地方都用到了typename与class这两个关键字 而且有时候二者可以替换 那么是不是这两个关键字完全一样呢 事实上class用于定义类 在模板引入c 后 最初定义模板的方法为 template 这里cl
  • 通过字节码深入了解创建对象的过程

    package shixun test public class Test2643 public static void main String args Person person new Person class Tag int i p
  • redis数据库与python交互

    redis交互 import redis redis数据库链接 import pickle class Conn db def init self 创建对本机数据库的连接对象 self conn redis StrictRedis host
  • matlab图加上箭头和标注实例

    在图上加箭头的函数有annotation quiver annotation 函数 1 annotation annotation type 以指定的对象类型 使用默认属性值建立注释对象 2 annotation line x y 建立从
  • python副业介绍以及渠道推荐,接单注意事项

    这是本文的目录 前言 Python为什么会大受欢迎 python副业有哪些 1 兼职处理数据 2 兼职查询资料 3 兼职P图 4 爬虫类 5 平台接单 Python赚外快的一些其它方式 1 自媒体也是个风口 2 知识付费分享 3 招聘网站
  • Mybatis学习笔记:使用注解开发(CRUD)

    学习内容 使用注解开发 CRUD 文章目录 学习内容 使用注解开发 CRUD 1 怎么使用注解 2 用注解实现CRUD 增删改查 3 关于 Param 注解 4 和 区别 1 怎么使用注解 1 1 注解在接口上实现 1 2 需要再核心配置文