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的列表
固然这个表非常的简朴,但是在复杂的项目里面可能会提取出很多个字段,然后根据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 - 博客园
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |