文章目录
- 1 MyBatis中Controller层List集合接收数据,泛型添加与否
- 1.1 案例场景
- 1.2 应该用什么接收
- 1.3 是否可以用其他方式接收?
- 1.4 LIst集合接收可否不指定泛型
- 1.5 mybatis中使用基本类型接收数据?resultType是集合中的元素的类型,并不是集合本身
- 2 在Service层实现类中,为何要build相关构建器(new对象进行Set方法)
- 2.1 build方法是干啥的?
- 2.2 在 Service实现类中,build相关构建器,为何还要与Mapper层建立连接?
- 2.3 在Mapper的XML映射文件中执行的语句
- 2.4 思路分析
- 3 添加套餐业务分析
- 3.1 业务场景
- 3.2 业务分析
1 MyBatis中Controller层List集合接收数据,泛型添加与否
1.1 案例场景
需要实现的接口:根据分类id查询菜品,会返回多个菜品
1.2 应该用什么接收
问题场景:那么返回的菜品,应该用什么接收?
回答:应用LIst集合接收
分析:返回的是多组菜品信息参数,因此应用数组或者集合接收,又因为集合相比较与数组,大小可变,因此选择集合。
1.3 是否可以用其他方式接收?
是否可以用实体类接收?
回答:不能,理由:因为实体类只能生成唯一的对象。
分析:返回的是多组菜品信息参数,因此应用数组或者集合接收,又因为集合相比较与数组,大小可变,因此选择集合。
1.4 LIst集合接收可否不指定泛型
回答:不可以,会出现如上错误,而且mybatis不支持直接用list来接收
总结:List集合不能直接从前端传到后台,需要借助实体类才能接收到集合。
1.5 mybatis中使用基本类型接收数据?resultType是集合中的元素的类型,并不是集合本身
分析:当返回多条一个结果时,并不是在resultType中写成List类型。如下图的错误xml中配置:
会发生如下错误:
resultType是集合中的元素的类型,并不是集合本身。,正确写法示例:
2 在Service层实现类中,为何要build相关构建器(new对象进行Set方法)
2.1 build方法是干啥的?
Dish build = Dish.builder().status(StatusConstant.ENABLE).categoryId(categoryId).build();
解释:实体类.build,相当于new对象,并进行set构造器方法,为实体类中的对象赋值,实体类本来是无值的。
2.2 在 Service实现类中,build相关构建器,为何还要与Mapper层建立连接?
联系场景解决:
场景:
2.3 在Mapper的XML映射文件中执行的语句
<select id="list" resultType="com.sky.entity.Dish" parameterType="com.sky.entity.Dish">
<!-- <select id="list" resultType="java.util.List">-->
select *
from dish
<where>
<if test="categoryId != null">
category_id = #{categoryId}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="name != null">
and name like ('%',#{name},'%');
</if>
</where>
</select>
相当于:
select * from dish where category_id=11 and status=1 and name like '%酒%';
2.4 思路分析
在前端获取到 category_id 和 status 的值,然后service业务层,做了处理,即限制查询状态为(StatusConstant.ENABLE,已经被定义成1)在售,同时前端每个类别已经对应了一个category_id,因此以这两属性为限制,在XML中作限制进行查询。
select * from dish where category_id=11 and status=1 and name like '%酒%';
3 添加套餐业务分析
3.1 业务场景
数据库中有,套餐表
和菜品关系表
3.2 业务分析
- 首先,前端往后端传入参数,包含
套餐信息
和菜品、套餐信息
(在添加菜品那个按钮上),后端定义的DTO层接收到数据。
- 其次,接收到service层进行业务处理,先是将setmealDTO接收到的数据,拷贝到setmeal实体类中
- 紧接着,再将实体类setmeal对象中数据根据SQL语句插入套餐表中
setmealMapper.insert(setmeal);
- 再然后,获取下数据库中套餐的主键ID
Long setmealId = setmeal.getId();
- 然后,获取后端接收到setmealDTO实体类中每一个SetmealDishes集合(前端可以传多个菜品,每个套餐可以包含多个菜品)
List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
- 紧接着遍历所获得的的SetmealDishes集合,得到每一个套餐菜品的信息
setmealDishes.forEach(setmealDish -> { setmealDish.setSetmealId(setmealId); });
- 最后,再将每一个SetmealDishes信息插入到数据库的SetmealDishes表中
setmealDishMapper.insertBatch(setmealDishes);