Mybatis注解的基础操作——02

ops/2025/3/31 7:05:30/

mybatis代码的方法有两种:

  1. 注解
  2. xml方式

本篇就介绍注解的方式

mybatis的操作主要有增删改查,下面进行一一讲解。

目录

 一、参数传递

二、增(Insert)

三、删(Delete)

四、改(Update)

五、查(Select)

1.起别名

2.结果映射

3.开启驼峰命名(推荐)


 一、参数传递

   需求:查找id=4的用户,对应的sql就是: select * from user_info where id=4

java">@Select("select username, `password`, age, gender, phone from user_info where 
id= 4 ")
UserInfo queryById();

结果集返回一条记录该记录与与UserInfo构成映射返回UserInfo类型的一个对象。

只能查找id=4的数据,这样代码写死了,需要变为动态的数值。

这时可以通过在queryById方法中添加一个参数{id},将方法中的参数,传给sql语句,使用#{}的方式获取方法中的参数。

java">@Select("select username, `password`, age, gender, phone from user_info where 
id= #{id} ")
UserInfo queryById(Integer id);

注意:如果mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如:#{id}、#{value},形参会与#{}里面的参数进行绑定,但是建议和参数名一致。

添加测试用例:

java">@Test
void queryById() {UserInfo userInfo = userInfoMapper.queryById(4);System.out.println(userInfo);
}

运行测试用例:

当然也可以通过@Param 设置参数别名,如果使用@Param设置别名 ,#{}里面参数的名字要和@Param设置的参数名一致。

java">@Select("select username, `password`, age, gender, phone from user_info where 
id= #{userid} ")
UserInfo queryById(@Param("userid") Integer id);

补充:@Param的作用域是Mapper层(Dao) 层,为Mapper参数命名,用于SQL的参数绑定;而@RequestParam作用域是在Controller层,是将HTTP请求超参数绑定到控制器方法的参数。


二、增(Insert)

SQL语句:

insert into user_info (username, `password`, age, gender, phone) values
("zhaoliu","zhaoliu",19,1,"18700001234");
  • 把sql中的常量替换成动态的参数

Mapper接口:

@Insert("insert into user_info (username, `password`, age, gender, phone) 
values (#{username},#{password},#{age},#{gender},#{phone})")
Integer insert(UserInfo userInfo);
  • 这里可以用UserInfo对象来获取参数

测试代码:

java">@Test
void insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhaoliu");userInfo.setPassword("zhaoliu");userInfo.setGender(2);userInfo.setAge(21);userInfo.setPhone("18612340005");userInfoMapper.insert(userInfo);
}

运行之后,观察数据库执行结果

  •  如果设置了@Param 属性 ,#{}需要使用 参数.属性 来获取。
java"> @Insert("insert into user_info (username,password,age,gender,phone)"+
"values (#{UI.username},#{UI.password},#{UI.age},#{UI.gender},#{UI.phone})")Integer insert(@Param("UI") UserInfo userInfo);

运行后观察结果:

  •  返回主键

Insert语句默认返回的是 受影响的行数。

但有些情况下,数据插入之后,还需要有后续的关联操作,需要获取到新插入数据的id。

比如订单系统。

当我们下完订单之后,需要通知物流系统,库存系统,结算系统,这时候就需要拿到订单的id。

如果想要拿到自增id,需要在Mapper接口的方法上添加一个Options的注解,。

java"> //获取自动生成的id,并设置返回的id@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("insert into user_info (username,password,age,gender,phone)"+"values (#{UI.username},#{UI.password},#{UI.age},#{UI.gender},#{UI.phone})")Integer insert(@Param("UI") UserInfo userInfo);

useGeneratedKeys:这会令Mybatis使用JDBC的getGenerateKeys方法来取出由数据库内部生成的主键(自增主键),默认值:false

keyProperty:指定能够唯一识别的对象的属性,Mybatis会使用getGenerateKeys的返回值或insert语句的selectKey 子元素设置 keyProperty的值,默认值:未设置。

测试代码:

java"> @Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhao77");userInfo.setPassword("zhao");userInfo.setGender(1);userInfo.setAge(100);userInfo.setPhone("18612344705");Integer result = userInfoMapper.insert(userInfo);log.info("测试结果"+result+"自增ID"+userInfo.getId());}

运行结果:

注意:如果没有Options注解,即使测试方法创建完对象之后,使用getId方法也是不能够获取到自增id的。


三、删(Delete)

sql语句:

delete from user_info where id=6
  • 把sql中的常量替换为动态的参数。

Mapper接口

java">@Delete("delete from user_info where id = #{id}")
void delete(Integer id);

四、改(Update)

sql语句:

update user_info set username="zhaoliu" where id=5
  • 把sql中的常量替换为动态的参数

Mapper接口

@Update("update user_info set username=#{username} where id=#{id}")
void update(UserInfo userInfo);

五、查(Select)

上面的参数传递中讲述了查询的例子,但是如果实体类的属性名和数据库字段名不一致时,可以采取下面的措施:

1.起别名

2.结果映射

3.利用驼峰命名,配置驼峰命名配置

1.起别名

在sql语句中,给列名起别名,保持别名和 实体类属性名一样。

java">@Select("select id, username, `password`, age, gender, phone, delete_flag as 
deleteFlag, " +"create_time as createTime, update_time as updateTime from user_info")
public List<UserInfo> queryAllUser();

sql语句太长时,可以使用加号 +进行字符串拼接。

2.结果映射

使用@Result注解‘

java">  //这里的映射要与对象的属性一致,不然会报错,找不到@Results(id = "BaseMap",value = {@Result(column = "delete_flag",property = "deleteFlag"),@Result(column = "create_time",property = "createTime"),@Result(column = "update_time",property = "updateTime")})@Select("select * from user_info")List<UserInfo> selectAll2();

如果有其他sql复用这种映射关系,我们可以给Result定义一个id,然后再搭配@ResultMap注解使用。

java">@Results(id = "BaseMap",value = {@Result(column = "delete_flag",property = "deleteFlag"),@Result(column = "create_time",property = "createTime"),@Result(column = "update_time",property = "updateTime")})@Select("select * from user_info")List<UserInfo> selectAll2();//复用映射关系@ResultMap(value = "BaseMap")@Select("select *from user_info where id=4")UserInfo selectById();

3.开启驼峰命名(推荐)

这种方式要满足下面的条件:

  • 配置驼峰命名规则

.properties

java">#配置驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true

.yml 

java">mybatis:configuration:map-underscore-to-camel-case: true  #配置驼峰自动转换
  • 类中属性名为驼峰格式(createTime);表中字段名为蛇形格式(create_time)

其中Java代码中不做任何处理:

java">@Select("select id, username, `password`, age, gender, phone, delete_flag, " +"create_time, update_time from user_info")
public List<UserInfo> queryAllUser();


http://www.ppmy.cn/ops/170397.html

相关文章

如何使用Python爬虫按关键字搜索1688商品?

在电商领域&#xff0c;获取1688商品信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品数据。通过Python爬虫技术&#xff0c;我们可以高效地获取1688商品的详细信息&#xff0c;包括商品名称、价…

MySQL 创建数据库

MySQL 创建数据库 数据库是现代信息系统中不可或缺的组成部分,它能够帮助我们高效地存储、检索和管理数据。MySQL 作为一款流行的开源关系型数据库管理系统,被广泛应用于各种规模的应用程序中。本文将详细介绍如何在 MySQL 中创建数据库,包括基本概念、操作步骤以及注意事项…

C#从入门到精通(2)

目录 第六章 逻辑结构 &#xff08;1&#xff09;if语句 &#xff08;2&#xff09;switch语句 &#xff08;3&#xff09;while语句 &#xff08;4&#xff09;for语句 &#xff08;5&#xff09;跳转语句 第七章 数组 &#xff08;1&#xff09;一维数组 &#xff0…

架构思维:如何设计一个支持海量数据存储的高扩展性架构_数据分片、存储、复制与一致性的原理性问题

文章目录 PRE引言1. 数据分片策略Hash取模分片一致性Hash分片Range分片分片设计原理核心设计模块分片规则定义动态分片调整路由与负载均衡 应对热点的关键技术多级分片&#xff08;Hierarchical Sharding&#xff09;副本分散策略缓存层配合 典型应用场景优缺点分析 2. 应对热点…

关于JESD204B 接口的调试

高速ADC和DAC常常用到JESD204B、JESD20C接口&#xff0c;网上相关的资料众多。此处我们主要介绍如何让JESD204B锁定&#xff0c;调试时的几个要点&#xff1a; 以AD9689 ADC为例&#xff0c;要想让JESD204B接口锁定&#xff0c;需要注意&#xff1a; 1、提供给AD9689的工作时…

Linux生产者消费者模型

Linux生产者消费者模型 Linux生产者消费者模型详解生产者消费者模型生产者消费者模型的概念生产者消费者模型的特点生产者消费者模型优点 基于BlockingQueue的生产者消费者模型基于阻塞队列的生产者消费者模型模拟实现基于阻塞队列的生产消费模型基础实现生产者消费者步调调整条…

【论文阅读】基于思维链提示的大语言模型软件漏洞发现与修复方法研究

这篇文章来自于 Chain-of-Thought Prompting of Large Language Models for Discovering and Fixing Software Vulnerabilities 摘要 软件安全漏洞在现代系统中呈现泛在化趋势&#xff0c;其引发的社会影响日益显著。尽管已有多种防御技术被提出&#xff0c;基于深度学习&…

图解AI对话系统架构:一次讲透核心技术

图解AI对话系统架构&#xff1a;一次讲透核心技术 在当今AI快速发展的时代&#xff0c;智能对话系统已成为企业数字化转型的标配。本文将通过一个完整的架构图&#xff0c;为您深入解析AI对话系统的核心技术和工作原理。 一、VPC&#xff1a;安全的私有网络空间 什么是VPC&…