MyBatis—增删查改操作

sql 复制代码
@Inset("insert into User(username,password,name,age) values(#{username},#{password},#{name},#{age})")
public void insert(User user);
// 注意:届时在括号内填的只是一个User类的对象,而不是上述的一个字段
|
|
|
User user = new User("...","...","...",...)
usermapper.insert(user);

sql 复制代码
					// 传统的写法:
@delete("delete from User where id = 5")
public void DeleteAll();

					// 占位符写法:
 1. #{}占位符
@delete("delete from User where id = #{id}")
public void DeleteAll(Integer id);
|
|
|
测试类中:
@Test
void Delete(){
	usermapper.DeleteAll(1);
}
// 区别:使用#{}来替代数字,在括号中定义好数据类型和变量,在测试类中赋入变量
 2. ${}占位符
@delete("delete from User where id = ${id}")
public void DeleteAll(Integer id);
|
|
|
测试类中:
@Test
void Delete(){
	usermapper.DeleteAll(1);
}

#{}${} 的区别:

在运行日志中,#{}会在id的位置上以一个?出现,也就是经历一个预编译的阶段。

而 ${}依旧会以原值出现

这就意味着,在字符串相关的sql语句中,使用#{}要比使用 {}来的安全, {}占位符若用在拼接字符串中,容易出现sql注入这种安全问题。

sql 复制代码
@Select("select * from User where id = #{id}, username = #{username}");
public void Select(String id,String username);
若是基于SpringBoot官方骨架创建出来的项目只需这样写就可以了

若不是,则需要这样写:
@Select("select * from User where id = #{id}, username = #{username}");
public void Select(@Param(id)String id,@Param(username)String username);
复制代码
原因:
1.@Param()是给参数起名字的,明确标注这个参数就是id/username,为什么要这么做,其实是因为在字节码文件中,参数id/username并不叫id/username,而是别的符号(arg0,arg1),这会使得MyBatis找不到参数,才需要设置@Param来让Mybatis知道这个值对应的就是这个参数
2.而基于SpringBoot骨架创建的项目,在pom.xml文件中有这样一个父类,如下图:

而进入这个父类的pom.xml文件中会发现:

< parameters > true < parameters >

的值是true,这就意味着不用再显式注明@Param()了,会自动按照括号内的参数名,来匹配实际括号中传进来的值,然后根据SQL语句中的参数名来返回。

复制代码
但是正因如此才要注意,括号内的参数名和SQL语句中的对应的参数名一定要一致,不然到时候通过括号内参数名匹配到值了,但是无法从SQL语句中找到和括号中一样的参数名,这样就返不回去了。

sql 复制代码
@Upadate("update User set username = #{username}, password = #{password}, name = #{name}, id = #{id} where id = #{id}")
public void Update(User user);
|
|
|
void test(){
	User user  = new User("...","...","...", ... , ...);
	username.Update(user);
}
相关推荐
goyeer12 小时前
Liunx日志管理与journalctl
java·linux·运维·服务器·运维开发·信息化·信息化企业管理
tianyu23414 小时前
Java 正则表达式终极指南:从 Pattern 到 Matcher,从双重转义到性能优化,一篇全搞定
java·开发语言·正则表达式·group·find·pattern·matcher
Emily1568535987016 小时前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧20 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡21 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管21 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅21 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒21 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰1 天前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
吠品1 天前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器