mybatis批量修改for中放if
时间: 2023-08-11 22:27:38 浏览: 167
在 Mybatis 中,我们可以通过 foreach 标签实现批量修改,同时也可以在 foreach 标签中嵌套 if 标签,实现动态修改。
示例代码如下:
```xml
<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" separator=";">
UPDATE table_name
SET
<if test="item.column1 != null">
column1 = #{item.column1},
</if>
<if test="item.column2 != null">
column2 = #{item.column2},
</if>
<if test="item.column3 != null">
column3 = #{item.column3},
</if>
...
WHERE id = #{item.id}
</foreach>
</update>
```
在此示例中,我们使用 foreach 标签遍历 List 对象,生成多个修改语句。同时,我们使用 if 标签实现动态 SQL,根据不同的条件生成不同的 SQL 片段。需要注意的是,if 标签是可选的,只有当条件成立时才会生成对应的 SQL 片段。
相关问题
mybatis-plus 修改百万级数据
修改百万级数据可以使用 MyBatis-Plus 的批量更新功能,使用以下步骤:
1.先查询需要修改的数据,使用分页查询方式,每页查询一定数量的数据。
2.使用 MyBatis-Plus 的批量更新功能,将查询出来的数据分批更新。
3.在更新过程中注意控制一次更新的数据量,避免一次更新过多数据导致系统崩溃。
示例代码如下:
```java
// 分页查询需要修改的数据
int pageSize = 10000; // 每页查询的数量
int currentPage = 1; // 当前页数
List<User> userList = new ArrayList<>();
while (true) {
Page<User> page = new Page<>(currentPage, pageSize);
IPage<User> userPage = userMapper.selectPage(page, null);
List<User> records = userPage.getRecords();
if (records.isEmpty()) {
break;
}
userList.addAll(records);
currentPage++;
}
// 批量更新数据
int batchCount = 1000; // 每批更新的数量
for (int i = 0; i < userList.size(); i += batchCount) {
int endIndex = Math.min(i + batchCount, userList.size());
List<User> subList = userList.subList(i, endIndex);
userMapper.updateBatchById(subList);
}
```
### 环境说明 本案例已经完成了基础环境的搭建,只需要大家导入day09-springboot-mybatis-dish模块,执行tb_dish.sql文件中的SQL创建数据库和表,打开application.properties配置文件,修改连接数据库的相关参数(==密码==)即可 ### 需求说明 #### 1、完成查询所有的功能 > 步骤一:在resources中定义和DishMapper接口对应的映射配置文件,注意映射配置文件和mapper接口的对应关系。 > > 步骤二:在映射配置文件中给selectAll方法配置SQL语句 > > 步骤三:在Day09SpringbootMybatisDishApplicationTests的testSelectAll方法中调用dishMapper的selectAll方法测试 #### 2、完成根据id查询,新增,根据id修改,根据id删除这四个需求 > 参考上面的步骤二和步骤三 #### 3、完成根据菜品名称(name)、菜品码(code)动态查询菜品信息 > 参考上面的步骤二和步骤三 > > 提示:动态SQL需要使用<where>和<if>标签,搜索需要使用模糊查询。 #### 4、完成根据id批量删除菜品 > 参考上面的步骤二和步骤三 > > 提示:动态SQL需要使用foreach标签遍历,遍历数组注意占位符的名称。
好的,对于这个需求我会逐一进行讲解和操作演示。
1. 查询所有菜品
首先,我们需要在 resources 目录下创建一个名为 `DishMapper.xml` 的文件,用于编写对应的 SQL 语句。
在 `DishMapper.xml` 文件中,我们需要定义一个 `<select>` 标签,用于查询所有的菜品信息。具体代码如下:
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.DishMapper">
<select id="selectAll" resultType="com.example.demo.entity.Dish">
select * from tb_dish
</select>
</mapper>
```
其中,`namespace` 属性应该填写对应的 `DishMapper` 接口的全限定名,`resultType` 属性应该填写对应实体类的全限定名。
接着,我们需要在 `DishMapper` 接口中添加一个方法,用于调用上面定义的 SQL 语句。具体代码如下:
```java
public interface DishMapper {
// 查询所有菜品
List<Dish> selectAll();
}
```
最后,在 `Day09SpringbootMybatisDishApplicationTests` 类中,我们需要编写一个测试方法,用于测试查询所有菜品的功能。具体代码如下:
```java
@SpringBootTest
class Day09SpringbootMybatisDishApplicationTests {
@Autowired
private DishMapper dishMapper;
@Test
void testSelectAll() {
List<Dish> dishes = dishMapper.selectAll();
for (Dish dish : dishes) {
System.out.println(dish);
}
}
}
```
2. 根据 id 查询、新增、修改和删除菜品
对于这些操作,我们只需要在 `DishMapper.xml` 文件中分别定义对应的 SQL 语句,然后在 `DishMapper` 接口中分别添加对应的方法即可,具体代码如下:
```xml
<!-- 根据 id 查询菜品 -->
<select id="selectById" parameterType="int" resultType="com.example.demo.entity.Dish">
select * from tb_dish where id = #{id}
</select>
<!-- 新增菜品 -->
<insert id="insert" parameterType="com.example.demo.entity.Dish">
insert into tb_dish(name, code, price) values(#{name}, #{code}, #{price})
</insert>
<!-- 根据 id 修改菜品 -->
<update id="updateById" parameterType="com.example.demo.entity.Dish">
update tb_dish set name = #{name}, code = #{code}, price = #{price} where id = #{id}
</update>
<!-- 根据 id 删除菜品 -->
<delete id="deleteById" parameterType="int">
delete from tb_dish where id = #{id}
</delete>
```
```java
public interface DishMapper {
// 查询所有菜品
List<Dish> selectAll();
// 根据 id 查询菜品
Dish selectById(int id);
// 新增菜品
int insert(Dish dish);
// 根据 id 修改菜品
int updateById(Dish dish);
// 根据 id 删除菜品
int deleteById(int id);
}
```
3. 根据菜品名称和菜品码动态查询菜品信息
对于这个需求,我们需要在 `DishMapper.xml` 文件中定义一个包含 `<where>` 和 `<if>` 标签的动态 SQL 语句。具体代码如下:
```xml
<select id="selectByCondition" resultType="com.example.demo.entity.Dish">
select * from tb_dish
<where>
<if test="name != null and name != ''">
and name like concat('%', #{name}, '%')
</if>
<if test="code != null and code != ''">
and code like concat('%', #{code}, '%')
</if>
</where>
</select>
```
其中,`<where>` 标签用于将所有的条件组合成一个完整的查询条件,并自动去掉其中的无效条件;`<if>` 标签用于判断当前条件是否有效,如果有效就拼接到查询条件中。
接着,我们需要在 `DishMapper` 接口中添加一个方法,用于调用上面定义的 SQL 语句。具体代码如下:
```java
public interface DishMapper {
// 查询所有菜品
List<Dish> selectAll();
// 根据 id 查询菜品
Dish selectById(int id);
// 新增菜品
int insert(Dish dish);
// 根据 id 修改菜品
int updateById(Dish dish);
// 根据 id 删除菜品
int deleteById(int id);
// 根据菜品名称和菜品码动态查询菜品信息
List<Dish> selectByCondition(String name, String code);
}
```
最后,在 `Day09SpringbootMybatisDishApplicationTests` 类中,我们需要编写一个测试方法,用于测试根据菜品名称和菜品码动态查询菜品信息的功能。具体代码如下:
```java
@Test
void testSelectByCondition() {
List<Dish> dishes = dishMapper.selectByCondition("宫保鸡丁", null);
for (Dish dish : dishes) {
System.out.println(dish);
}
}
```
4. 根据 id 批量删除菜品
对于这个需求,我们需要在 `DishMapper.xml` 文件中定义一个包含 `<foreach>` 标签的动态 SQL 语句。具体代码如下:
```xml
<delete id="batchDeleteByIds">
delete from tb_dish where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
```
其中,`<foreach>` 标签用于遍历指定的数组,并将其转换为逗号分隔的字符串,并在 SQL 语句中使用。
接着,我们需要在 `DishMapper` 接口中添加一个方法,用于调用上面定义的 SQL 语句。具体代码如下:
```java
public interface DishMapper {
// 查询所有菜品
List<Dish> selectAll();
// 根据 id 查询菜品
Dish selectById(int id);
// 新增菜品
int insert(Dish dish);
// 根据 id 修改菜品
int updateById(Dish dish);
// 根据 id 删除菜品
int deleteById(int id);
// 根据菜品名称和菜品码动态查询菜品信息
List<Dish> selectByCondition(String name, String code);
// 根据 id 批量删除菜品
int batchDeleteByIds(int[] ids);
}
```
最后,在 `Day09SpringbootMybatisDishApplicationTests` 类中,我们需要编写一个测试方法,用于测试根据 id 批量删除菜品的功能。具体代码如下:
```java
@Test
void testBatchDeleteByIds() {
int[] ids = new int[]{1, 2, 3};
int rows = dishMapper.batchDeleteByIds(ids);
System.out.println("删除了 " + rows + " 条记录");
}
```
好了,以上就是对于这个需求的详细讲解和操作演示。希望对你有所帮助!
阅读全文