Java 在service层遍历好还是mapper层遍历好?
时间: 2024-04-06 17:06:41 浏览: 59
一般情况下,在 Service 层进行数据的遍历和处理比在 Mapper 层更好,因为 Service 层更加适合做业务逻辑的处理,而 Mapper 层更加适合做数据的 CRUD 操作。
在 Service 层遍历数据可以让业务逻辑更加清晰,Mapper 层只需要负责数据的读取和写入,而具体的数据处理则交给 Service 层来完成。同时,如果需要对数据进行复杂的逻辑处理,Service 层更容易进行组合和封装,避免代码的冗余和重复。
另外,在 Service 层进行遍历数据还可以更好地实现分层思想,将数据的获取和处理分开,提高代码的可维护性和可扩展性。而在 Mapper 层进行遍历数据则容易导致 Mapper 层的代码过于复杂,难以维护和扩展。
综上,建议在 Service 层进行遍历和处理数据,让 Mapper 层专注于数据的操作。
相关问题
Java后端购物车Service层业务逻辑怎么写
购物车Service层的业务逻辑一般包括以下几个方面:
1. 添加商品到购物车:首先需要判断商品是否已经存在于购物车中,如果存在,则更新购物车中该商品的数量;如果不存在,则添加新的商品到购物车中。
2. 修改购物车中商品数量:可以通过商品id和购物车id来定位需要修改数量的商品,然后更新购物车中该商品的数量。
3. 移除购物车中的商品:可以通过商品id和购物车id来定位需要移除的商品,然后从购物车中移除该商品。
4. 清空购物车:将购物车中所有的商品全部移除。
5. 获取购物车中的商品列表:根据购物车id获取该购物车中的所有商品信息,包括商品id、名称、数量、价格等。
6. 计算购物车中商品的总价:遍历购物车中的所有商品,累加每个商品的价格乘以数量,得到购物车中商品的总价。
下面是一个简单的Java后端购物车Service层实现代码示例:
```java
@Service
public class CartService {
@Autowired
private CartMapper cartMapper;
public Cart addGoodsToCart(Integer userId, Integer goodsId, Integer quantity) {
Cart cart = cartMapper.selectByUserIdAndGoodsId(userId, goodsId);
if (cart == null) {
cart = new Cart();
cart.setUserId(userId);
cart.setGoodsId(goodsId);
cart.setQuantity(quantity);
cartMapper.insert(cart);
} else {
cart.setQuantity(cart.getQuantity() + quantity);
cartMapper.updateByPrimaryKeySelective(cart);
}
return cart;
}
public Cart updateCart(Integer userId, Integer goodsId, Integer quantity) {
Cart cart = cartMapper.selectByUserIdAndGoodsId(userId, goodsId);
cart.setQuantity(quantity);
cartMapper.updateByPrimaryKeySelective(cart);
return cart;
}
public void removeGoodsFromCart(Integer userId, Integer goodsId) {
cartMapper.deleteByUserIdAndGoodsId(userId, goodsId);
}
public void clearCart(Integer userId) {
cartMapper.deleteByUserId(userId);
}
public List<CartVo> getCartGoodsVoList(Integer userId) {
List<Cart> cartList = cartMapper.selectByUserId(userId);
List<CartVo> cartVoList = new ArrayList<>();
for (Cart cart : cartList) {
CartVo cartVo = new CartVo();
cartVo.setId(cart.getId());
cartVo.setUserId(userId);
cartVo.setGoodsId(cart.getGoodsId());
cartVo.setGoodsName(cart.getGoods().getName());
cartVo.setQuantity(cart.getQuantity());
cartVo.setPrice(cart.getGoods().getPrice());
cartVoList.add(cartVo);
}
return cartVoList;
}
public BigDecimal getCartTotalPrice(Integer userId) {
List<Cart> cartList = cartMapper.selectByUserId(userId);
BigDecimal totalPrice = new BigDecimal("0");
for (Cart cart : cartList) {
BigDecimal price = cart.getGoods().getPrice();
BigDecimal quantity = new BigDecimal(cart.getQuantity());
totalPrice = totalPrice.add(price.multiply(quantity));
}
return totalPrice;
}
}
```
这段代码中使用了Mybatis框架操作数据库,CartMapper是一个Mapper接口,用于操作购物车表,CartVo是一个VO类,用于封装购物车中商品的信息。需要注意的是,在上述代码中,Cart对象包含了与商品相关联的信息,因此在添加商品到购物车或者获取购物车中的商品列表时,需要使用Mapper接口的联表查询功能来获取商品的详细信息。
使用Java编程和springboot框架实现菜单权限表的树状结构接口,给出相应的controller层,service层,daoc层及mapper,
好的,下面是完整的代码实现。
先定义一个菜单权限的实体类`MenuPermission`,包含菜单ID、菜单名称、父级菜单ID等属性:
```java
public class MenuPermission {
private Long menuId;
private String menuName;
private Long parentId;
// 省略getter和setter方法
}
```
定义一个菜单权限的Mapper接口`MenuPermissionMapper`,使用MyBatis注解实现SQL语句的映射。其中,`selectAll()`方法用于查询全部菜单权限数据:
```java
@Mapper
public interface MenuPermissionMapper {
@Select("SELECT * FROM menu_permission")
List<MenuPermission> selectAll();
}
```
定义一个菜单权限的服务类`MenuPermissionService`,用于获取全部菜单权限数据:
```java
@Service
public class MenuPermissionService {
// 假设菜单权限数据存储在MySQL数据库中
@Autowired
private MenuPermissionMapper menuPermissionMapper;
/**
* 获取全部菜单权限数据
*/
public List<MenuPermission> getAllMenuPermissions() {
return menuPermissionMapper.selectAll();
}
}
```
定义一个菜单权限的控制器`MenuPermissionController`,用于提供树状结构的菜单权限数据接口`/menu/tree`。其中,`buildMenuPermissionTree()`方法用于构建树状结构,`getMenuPermissionTree()`方法用于返回树状结构的菜单权限数据:
```java
@RestController
@RequestMapping("/menu")
public class MenuPermissionController {
@Autowired
private MenuPermissionService menuPermissionService;
@GetMapping("/tree")
public List<MenuPermission> getMenuPermissionTree() {
// 获取全部菜单权限数据
List<MenuPermission> allMenuPermissions = menuPermissionService.getAllMenuPermissions();
// 构建树状结构
return buildMenuPermissionTree(allMenuPermissions);
}
/**
* 构建树状结构的菜单权限数据
*/
private List<MenuPermission> buildMenuPermissionTree(List<MenuPermission> menuPermissions) {
// 构建菜单ID到菜单权限的映射表
Map<Long, MenuPermission> menuIdMap = new HashMap<>();
for (MenuPermission menuPermission : menuPermissions) {
menuIdMap.put(menuPermission.getMenuId(), menuPermission);
}
// 构建父级菜单ID到子菜单列表的映射表
Map<Long, List<MenuPermission>> parentIdMap = new HashMap<>();
for (MenuPermission menuPermission : menuPermissions) {
Long parentId = menuPermission.getParentId();
if (parentId != null) {
List<MenuPermission> childMenuPermissions = parentIdMap.computeIfAbsent(parentId, k -> new ArrayList<>());
childMenuPermissions.add(menuPermission);
}
}
// 遍历菜单权限数据,构建树状结构
List<MenuPermission> rootMenuPermissions = new ArrayList<>();
for (MenuPermission menuPermission : menuPermissions) {
Long parentId = menuPermission.getParentId();
if (parentId == null) {
// 当前菜单是根菜单,直接添加到根菜单列表中
rootMenuPermissions.add(menuPermission);
} else {
// 当前菜单是子菜单,添加到父级菜单的子菜单列表中
MenuPermission parentMenuPermission = menuIdMap.get(parentId);
if (parentMenuPermission != null) {
List<MenuPermission> childMenuPermissions = parentIdMap.get(parentId);
if (childMenuPermissions == null) {
childMenuPermissions = new ArrayList<>();
parentIdMap.put(parentId, childMenuPermissions);
}
childMenuPermissions.add(menuPermission);
}
}
}
return rootMenuPermissions;
}
}
```
最后,我们需要在`application.properties`文件中配置数据库连接信息:
```properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
```
以上就是完整的代码实现。需要注意的是,我们需要在`pom.xml`文件中添加相关依赖,如下所示:
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
</dependencies>
```