一、对于批量操作(基于Springboot+mybatis批量查询,修改,删除)
1. 批量查询:(删除和查询一样,就写一个。)
首先,先找到我们要以哪个作为批量查询的属性,我这里是以term_sn(因为我的表字段太多,所以我没有使用驼峰命名,以后会规范)。然后把他弄成一个集合类,用来接受多个term_sn。
而且我们使用 sql中的<foreach>
来做批量的这件事;
1.1 controller:
@GetMapping("/selectHomePageByTermSnList")
public AjaxResult selectHomePageByTermSnList(@RequestParam List<String> term_sn_list) {
//一定要注意@RequestParam和@RequestBody后面这个请求体是Json形式的,前面的一个集合
List<Package> homePageInfoList = homePagePackageService.selectHomePageByTermSnList(term_sn_list);
return AjaxResult.success(homePageInfoList);
}
1.2 serviceImpl
@Override
public List<Package> selectHomePageByTermSnList(List<String> term_sn_list) {
return homePagePackageMapper.selectHomePageByTermSnList(term_sn_list);
}
1.3 mapper
List<Package> selectHomePageByTermSnList(@Param("term_sn_list") List<String> term_sn_list);
1.4 mapper.xml(重要!!)
<select id="selectHomePageByTermSnList" resultMap="HomePageMapperResultMap">
//id是你的mapper中的方法名,resultMap是在上面有过定义,没有的话是resultType(对应你的实体类)
SELECT
t1.term_sn,
t1.out_term_ship_bom_no,
t2.out_term_ship_bom_name,
t2.package_qi_cname,
t2.package_qi_time,
t1.packageqi_state
FROM om_term_info t1
JOIN term_production_info t2 ON t1.term_sn = t2.term_sn
WHERE t1.term_sn IN
<foreach item="term_sn" collection="term_sn_list" open="(" separator="," close=")">
//item代表你的单个属性,collection你传入的集合,open开始用什么拼接,separator每个元素之间,close结尾。
#{term_sn} //动态sql
</foreach>
</select>
2 批量修改(涉及到简单的redis)
这个就是一个简单的存储,但不过我的sql一直有问题,就在外面插入的时候就循环插入了,会进行修改。
2.1 controller:
@PostMapping("/updateInspectList")
public AjaxResult updateInspectList(@RequestBody List<Sub> subList) {
homePageCService.updateInspectList(subList);
return AjaxResult.success();
}
2.2 serviceImpl
@Override
@Transactional//加入事务,保证都成功或者都失败
public void updateInspectList(List<Sub> subList) {
for (Sub sub : subList) {
SubVo subVo = new SubVo();
SubDTO subDTO = new SubDTO();
BeanUtils.copyProperties(sub, subVo);
BeanUtils.copyProperties(sub, subDTO);
// 更新 term_production_info
homePageCMapper.updateInspectA(subVo);
// 更新 om_term_info
subDTO.setDevidqi_state(1);
subDTO.setTerm_qi_devid_qi_time(sub.getDevid_qi_time());
homePageCMapper.updateInspectB(subDTO);
// 将 inspect_list 存入 Redis
String term_sn = sub.getTerm_sn();
List<Inspect> configList = sub.getInspect_list();
stringRedisTemplate.opsForValue().set(term_sn, JSONUtil.toJsonStr(configList));
}
2.3 mapper:
未使用 <foreach>
<update id="updateInspectA">
UPDATE term_production_info
SET devid_qi_cname = #{devid_qi_cname},
devid_qi_time = #{devid_qi_time},
dq_info_file_ids = #{dq_info_file_ids}
WHERE term_sn = #{term_sn}
</update>
<update id="updateInspectB">
UPDATE om_term_info
SET term_qi_devid_qi_time = #{term_qi_devid_qi_time},
devidqi_state = #{devidqi_state}
WHERE term_sn = #{term_sn}
</update>
使用 <foreach>
<update id="updateInspectAList">
<foreach collection="list" item="item" separator=";">
UPDATE term_production_info
SET devid_qi_cname = #{item.devid_qi_cname},
devid_qi_time = #{item.devid_qi_time},
dq_info_file_ids = #{item.dq_info_file_ids}
WHERE term_sn = #{item.term_sn}
</foreach>
</update>
<update id="updateInspectBList">
<foreach collection="list" item="item" separator=";">
UPDATE om_term_info
SET term_qi_devid_qi_time = #{item.term_qi_devid_qi_time},
devidqi_state = #{item.devidqi_state}
WHERE term_sn = #{item.term_sn}
</foreach>
</update>
二、总结
1. 对于注解@RequestParam和@RequestBody
1.1 @RequestParam
用途: 用于提取 HTTP 请求中的查询参数、表单数据或路径变量。
适用场景:
查询参数: 适用于 GET 请求中 URL 查询字符串的参数。
表单数据: 适用于 POST 请求中提交的表单数据。
路径变量: 适用于 URL 中的路径变量。
示例:
java
@GetMapping("/search")
public String search(@RequestParam String keyword, @RequestParam int page) {
// 处理请求
}
请求 URL: /search?keyword=spring&page=1
优点:
简单直观。
适用于简单的键值对参数。
限制:
不适合处理复杂的嵌套数据结构或 JSON 对象。
1.2 @RequestBody
用途: 用于将 HTTP 请求体中的内容绑定到方法参数上,通常用于 POST 或 PUT 请求中的 JSON 或 XML 数据。
适用场景:
JSON/XML 数据: 适用于处理复杂的 JSON 或 XML 数据,通常用于 POST 和 PUT 请求。
示例:
@PostMapping("/create")
public ResponseEntity<?> create(@RequestBody User user) {
// 处理请求
}
请求体:
json
{
"name": "John Doe",
"age": 30
}
优点:
适合处理复杂的对象或嵌套数据。
可以直接将请求体的内容映射到对象中。
限制:
需要确保请求体的格式正确,例如 JSON 或 XML。
不适用于简单的键值对参数。
1.3 @PathVariable
用途: 用于从 URL 路径中提取变量。
适用场景:
动态 URL 路径参数。
示例:
@GetMapping("/user/{userId}")
public User getUser(@PathVariable String userId) {
// 处理请求
}
1.4 @RequestHeader
用途: 用于提取 HTTP 请求头中的值。
适用场景:
需要访问请求头中的信息,如认证令牌。
示例:
@GetMapping("/info")
public String getInfo(@RequestHeader("User-Agent") String userAgent) {
// 处理请求
}
1.5 @RequestParam vs @RequestBody
2. 总结
@RequestParam 适用于简单的查询参数、表单数据和路径变量。
@RequestBody 适用于复杂的数据结构,如 JSON 对象或 XML 数据。
@PathVariable 适用于从 URL 路径中提取变量。
@RequestHeader 适用于提取 HTTP 请求头信息。