做搜狗手机网站优网站如何备份
news/
2025/9/24 3:52:46/
文章来源:
做搜狗手机网站优,网站如何备份,网站建设市场调研报告,做微商如何网站推广目录 前言1. 基本知识2. 注意事项3. 拓展 前言
以往的Java基本知识推荐阅读#xff1a;
java框架 零基础从入门到精通的学习路线 附开源项目面经等#xff08;超全#xff09;【Java项目】实战CRUD的功能整理#xff08;持续更新#xff09;Mybatis从入门到精通#xf… 目录 前言1. 基本知识2. 注意事项3. 拓展 前言
以往的Java基本知识推荐阅读
java框架 零基础从入门到精通的学习路线 附开源项目面经等超全【Java项目】实战CRUD的功能整理持续更新Mybatis从入门到精通全MyBatis-plus从入门到精通全
1. 基本知识
在MyBatis中动态SQL是一种强大的功能允许在select, insert, update, delete 等标签中根据条件动态构建SQL语句
这种动态性可以简化数据库查询的复杂度避免硬编码查询逻辑
MyBatis 提供了几种常用的动态 SQL 标签用来处理条件判断、循环和字符串拼接等操作
if标签根据给定的条件动态拼接SQL
select idfindUsers resultTypeUserSELECT * FROM userswhereif testname ! nullAND name #{name}/ifif testage ! nullAND age #{age}/if/where
/selectchoose, when, otherwise标签类似于Java中的switch语句允许你在多个条件中选择一个来执行
select idfindUsersByStatus resultTypeUserSELECT * FROM userswherechoosewhen teststatus ! nullAND status #{status}/whenotherwiseAND status active/otherwise/choose/where
/selectforeach标签用于处理循环一般用来遍历集合构建IN查询等
select idfindUsersByIds resultTypeUserSELECT * FROM usersWHERE id INforeach itemid collectionlist open( separator, close)#{id}/foreach
/selecttrim, where, set标签
trim去掉拼接后多余的前后缀where自动在拼接后的条件前加WHERE并去除多余的ANDset主要用于UPDATE语句自动去掉多余的逗号
update idupdateUserUPDATE userssetif testname ! nullname #{name},/ifif testage ! nullage #{age},/if/setWHERE id #{id}
/update2. 注意事项
使用此种方式需要注意动态SQL带来的OOM风险
在复杂动态SQL的构建中特别是当涉及大批量数据或复杂拼接时容易导致内存溢出OOM问题 尤其是在foreach中处理大量数据时如果不加以控制可能会占用大量内存
假设有一个非常大的List例如数百万条数据 如果在MyBatis中直接使用foreach将整个列表插入或作为查询条件这会导致内存问题
select idfindLargeUsersByIds resultTypeUserSELECT * FROM usersWHERE id INforeach itemid collectionlist open( separator, close)#{id}/foreach
/select在这种情况下MyBatis会尝试将数百万个id拼接到一个SQL语句中导致内存占用过高最终导致OOM
规避OOM的方法
分页处理可以将大批量数据分段处理例如在代码中将list切分为较小的块
ListListInteger partitionedIds Lists.partition(largeIdsList, 1000);
for (ListInteger idsBatch : partitionedIds) {userMapper.findLargeUsersByIds(idsBatch);
}避免过大的IN查询IN查询是常见的OOM来源可以通过数据库表连接等方式优化查询。 懒加载通过懒加载策略避免一次性加载过多数据到内存中
3. 拓展
在Java代码中进行参数校验是一种很好的实践尤其是在使用动态SQL时如果不校验传入的参数可能会导致意外的SQL拼接从而带来性能问题或安全隐患
基本的注解校验
public class User {NotNull(message Name cannot be null)private String name;Min(value 18, message Age should not be less than 18)private Integer age;
}在使用这些注解后如果传入的参数不符合条件就会抛出ConstraintViolationException
结合Spring的Valid注解可以自动在控制层或服务层进行参数校验
PostMapping(/createUser)
public ResponseEntity? createUser(Valid RequestBody User user, BindingResult result) {if (result.hasErrors()) {return new ResponseEntity(result.getAllErrors(), HttpStatus.BAD_REQUEST);}userService.createUser(user);return ResponseEntity.ok(User created successfully);
}自定义校验逻辑有时内置的注解不够可以自定义校验注解 例如限制用户名长度或格式
Target({ElementType.FIELD})
Retention(RetentionPolicy.RUNTIME)
Constraint(validatedBy UsernameValidator.class)
public interface ValidUsername {String message() default Invalid username;Class?[] groups() default {};Class? extends Payload[] payload() default {};
}public class UsernameValidator implements ConstraintValidatorValidUsername, String {public void initialize(ValidUsername constraint) {}public boolean isValid(String username, ConstraintValidatorContext context) {return username ! null username.matches(^[a-zA-Z0-9]$);}
}总的来说
MyBatis中的动态SQL功能非常灵活但也存在潜在的性能和内存问题 在复杂查询中务必小心处理大量数据操作合理运用分页、懒加载等技术 在Java代码层面通过参数校验来确保数据的安全和正确性是防止问题发生的关键步骤
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914769.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!