首页 > 其他分享 >mybatis的增删改查

mybatis的增删改查

时间:2024-12-05 09:00:46浏览次数:4  
标签:List ### 改查 增删 user mybatis import findAll store

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

就不会有问题。image-20241204105456745

@Data和@Builder一起用:我们发现没有了默认的构造方法。如果手动添加无参数构造方法或者用@NoArgsConstructor注解都会报错!

我们使用注解的方式,底层本质就是反射帮我们生成了一系列的setter、getter方法,但是今天发现@Builder注解会把对象的默认值清掉
Lombok 的 @Data 注解:

  • 自动添加了 getter、setter、toString、equals、hashCode 方法。
  • 如果没有其他构造函数声明,还会添加一个全参数构造函数(包含所有字段)。

Lombok 的 @Builder 注解:

  • 自动生成构建器模式所需的方法和类。
  • 默认情况下,@Builder 不会自动添加无参构造函数。

自定义实体类中缺失了无参构造方法(同时使用@Data和@Builder也会造成无参构造方法缺失),MyBstais框架在处理查询SQL的返回结果时,mybatis会调用无参构造方法来构造实例,然后使用setter方法设置成员变量值,因为没有无参构造没办法将查询出的字段映射到自定义实体类的成员变量上,由此产生该异常;
所以解决办法就是我们把注解都加上就行

image-20241204110115307

现在我们可以得到一个List<User>的列表image-20241204110442330

虽然这个表非常的简单,但是在复杂的项目里面可能会提取出很多个字段,然后根据DTO规范返回特定的一些数据,那么类型转换就显得非常关键,这里我们使用一个叫ModelMapper的依赖。

ModelMapper

项目中对象与对象赋值转换使用的频率非常的高,比如数据库表实体对象(Entity)与业务类对象(Model)之间的赋值传递,或者模型对象(Model)与视图对象(ViewModel)之间的赋值传递。如果我们一个一个字段的赋值,将是非常繁琐并且毫无价值的重复工作,此时虽然我们可以自己通过反射提取个公共的方法来处理,但是更高效的方式是查看是否有第三方已经提供了比较成熟稳定的工具包,避免重复造轮子的工作。
image-20241204141732338

首先弄好依赖,然后进行下面的操作

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();
}

image-20241204142348055

删除操作

学习一下post请求,把删除的语句设置成了根据用户名和密码去匹配信息来删除。

<!-- 删除用户 -->
    <delete id="delUser" parameterType="com.ivan.store.entity.model.User" >
        DELETE FROM t_user WHERE username = #{username} AND password = #{password}
    </delete>

所以传输的对象是一个User对象,最后调用findAll来查看结果。

image-20241204165734888

image-20241204165804263

image-20241204154139313

image-20241204160854032

把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);
}

image-20241205082732549

插入操作

可见用一个项目把控制层、业务层、持久层说明白了,每一句话都讲的很清楚 - ivanlee717 - 博客园

标签:List,###,改查,增删,user,mybatis,import,findAll,store
From: https://www.cnblogs.com/ivanlee717/p/18587696

相关文章

  • Asp.net Mvc在VSCore中如何将增删改查的增改添加数据传输到页面(需配合上一篇Mvc的增
    Linq集成查询(关联Lambda)FirstFirstOrDefault找到第一个符合条件的元素First(x=>x.Id==id)返回第一个Id等于id的元素,如果都没有符合的,报错FirstOrDefault(x=>x.Id==id)返回第一个Id等于id的元素,如果都没有符合的,返回NullSingleSingleOrDefaultSingle()返回第一......
  • 关于 mybatis mapper 的实现思路
    问题:在定义Mapper接口的时候往往通过创建一个自定义的接口来继承Mapper<T>接口,没有实际的实现类,那么mybatis是如何进行调用的呢?答案:mybatis在内部还是通过JDKProxy的形式进行了方法调用,但是不需要自己去实现接口。通常来说JDKProxy通过通过InvocationHandler实例......
  • 技术框架中MyBatis参数传递的学习
    MyBatis参数传递总结MyBatis参数传递#{}方式情况一:Mapper映射器接口方法参数只有一个且为基本类型接口方法:publicList<UserEntity>selectUserByAge(intage);映射结果:<selectid="selectUserByAge"resultMap="userResultMap">select*fromtb_userwhereag......
  • SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)
    SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)在实际的项目开发中,我们往往需要同时连接多个数据源对数据进行处理。本文将详细介绍在SpringBoot下配合MybatisPlus如何连接多数据源,实例将会使用连接MySQL、SqlServer进行测试,可自行根据思路供自行连接Oracle、Po......
  • 【MySQL】表的增删改查
    表的增删改查一、向表添加数据1.1单行数据,全列插入1.2多行数据,指定列插入1.3插入或则更新1.4替换二、Retrieve(查询)2.1select2.2where条件2.3对查询到的结果排序2.4筛选分页结果三、update(更新)四、delete(删除数据)五、聚合函数六、groupby的使用一、向表添加......
  • mybatis集成篇(二)--Springboot集成mybatis
    前言随着Spring框架越来越成熟,推出的Springboot使用也越来越广,Mybatis随其自然地适配Springboot。Springboot集成Mybatis使用application.yml配置mybatis:mapper-locations:classpath:./mapper/*Mapper.xmlconfiguration:map-underscore-to-camel-case:tru......
  • JDBC连接数据库实现增删改查
    这里为了方便展览,我直接写到了一个类里面,其中也涉及了一些前端交互要注意其中的sql语句的对象,可以根据自己的数据库内容名称进行修改这个是原本的表importjavax.servlet.;importjavax.servlet.http.;importjavax.servlet.annotation.;importjava.io.IOException;import......
  • 单表增删改查
    学习前,请先搞定数据库的驱动和连接,具体看黑马课程《javaweb》。idea先配置好Tomcat才可以进行,具体可以在CSDN上找教程差旅费的简单单表增删改查以下是数据库以下是控制台代码。其中部分代码看不懂的话,可以在B站中《JAVAJDBC》中搞定其中数据库的操作因人而异,根据自己的......
  • 一种轻量分表方案-MyBatis拦截器分表实践
    作者:京东零售张均杰背景部门内有一些亿级别核心业务表增速非常快,增量日均100W,但线上业务只依赖近一周的数据。随着数据量的迅速增长,慢SQL频发,数据库性能下降,系统稳定性受到严重影响。本篇文章,将分享如何使用MyBatis拦截器低成本的提升数据库稳定性。 业界常见方案针对冷数......
  • MyBatis属性,设置,类型别名
    1、属性(properties)设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如:<dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname=&q......