mybatis的增删改查
spring boot增删改查
查部分字段
这个原理都比较简单,根据我前面的博客定义好service和mapper组件就行。
但是这里要强调一个用法@builder
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
### The error may exist in file [D:\store\target\classes\mapper\UserMapper.xml]
### The error may involve com.ivan.store.mapper.UserMapper.findAll
### The error occurred while handling results
### SQL: SELECT uid,username,password FROM t_user
### Cause: java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
我在运行SELECT uid,username,password FROM t_user
这个字段的时候会报上面的错误,但是如果运行 SELECT * FROM t_user
就不会有问题。
@Data和@Builder一起用:我们发现没有了默认的构造方法。如果手动添加无参数构造方法或者用@NoArgsConstructor
注解都会报错!
我们使用注解的方式,底层本质就是反射帮我们生成了一系列的setter、getter方法,但是今天发现@Builder注解会把对象的默认值清掉
Lombok 的 @Data 注解:
- 自动添加了 getter、setter、toString、equals、hashCode 方法。
- 如果没有其他构造函数声明,还会添加一个全参数构造函数(包含所有字段)。
Lombok 的 @Builder 注解:
- 自动生成构建器模式所需的方法和类。
- 默认情况下,@Builder 不会自动添加无参构造函数。
自定义实体类中缺失了无参构造方法(同时使用@Data和@Builder也会造成无参构造方法缺失),MyBstais框架在处理查询SQL的返回结果时,mybatis会调用无参构造方法来构造实例,然后使用setter方法设置成员变量值,因为没有无参构造没办法将查询出的字段映射到自定义实体类的成员变量上,由此产生该异常;
所以解决办法就是我们把注解都加上就行
现在我们可以得到一个List<User>
的列表
虽然这个表非常的简单,但是在复杂的项目里面可能会提取出很多个字段,然后根据DTO规范返回特定的一些数据,那么类型转换就显得非常关键,这里我们使用一个叫ModelMapper
的依赖。
ModelMapper
项目中对象与对象赋值转换使用的频率非常的高,比如数据库表实体对象(Entity)与业务类对象(Model)之间的赋值传递,或者模型对象(Model)与视图对象(ViewModel)之间的赋值传递。如果我们一个一个字段的赋值,将是非常繁琐并且毫无价值的重复工作,此时虽然我们可以自己通过反射提取个公共的方法来处理,但是更高效的方式是查看是否有第三方已经提供了比较成熟稳定的工具包,避免重复造轮子的工作。
首先弄好依赖,然后进行下面的操作
package com.ivan.store.service.impl;
import com.ivan.store.entity.dto.UserDto;
import com.ivan.store.entity.model.User;
import com.ivan.store.mapper.UserMapper;
import com.ivan.store.service.OperateService;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service//不添加这个会报错
public class OperateServiceImpl implements OperateService
{
@Autowired
private UserMapper userMapper;
@Autowired
private ModelMapper modelMapper;
public List<UserDto> findAll(){
List<User> users = userMapper.findAll();
List<UserDto> userDtos = new ArrayList<>();
for(User user: users){
UserDto userDto = modelMapper.map(user,UserDto.class);
userDtos.add(userDto);
}
return userDtos;
}
}
将user对象列表全部映射为userDto的列表。这样我们就可以将数据按照规定格式进行返回。
@GetMapping("/findAll")
public List<UserDto> findAll(){
return operateService.findAll();
}
删除操作
学习一下post请求,把删除的语句设置成了根据用户名和密码去匹配信息来删除。
<!-- 删除用户 -->
<delete id="delUser" parameterType="com.ivan.store.entity.model.User" >
DELETE FROM t_user WHERE username = #{username} AND password = #{password}
</delete>
所以传输的对象是一个User对象,最后调用findAll来查看结果。
把uid是7的这个用户删了
更新操作
只要记住,首先把xml文件里添加好对应的sql语句,字段要和实体定义或者resultmap写好的对应上,然后去service里面完成这个方法的实现,最后在controller里面完成路径设置就可以了。
<update id="update" parameterType="com.ivan.store.entity.model.User">
update t_user
<set>
username = #{username},
password = #{password}
</set>
WHERE uid = #{uid}
</update>
public List<UserDto> update(User user){
userMapper.update(user);
return findAll();
}
@PostMapping("/UPDATE")
public List<UserDto> UPDATE(User user){
return operateService.update(user);
}
插入操作
本文来自博客园,作者:ivanlee717,转载请注明原文链接:https://www.cnblogs.com/ivanlee717/p/18587696