软件编程
位置:首页>> 软件编程>> java编程>> MybatisPlus,无XML分分钟实现CRUD操作

MybatisPlus,无XML分分钟实现CRUD操作

作者:cjx不吃包子  发布时间:2022-06-26 18:18:46 

标签:MybatisPlus,XML,CRUD

不讲太多理论知识,官网都有,直接上手。

1.测试表


DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) UNSIGNED NOT NULL,
`name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码',
`age` int(4) DEFAULT NULL COMMENT '年龄',
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

引入依赖


<!--mybatis-plus核心包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

配置文件,这里我用的是boot项目


spring:
datasource:
username: cjx
password: cjx19950616
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:/mapper/*.xml
#configuration:
#map-underscore-to-camel-case: true

其实简单的crud甚至不需要mybatis-plus的配置,我这里没删除,本文也并没有用到配置文件。

实体类


public class User{
 private Long id;
 private String name;
 private String password;
 private int age;
 private Date createTime;
 private Date updateTime;

...
 getter && setter
 ...
 toString()
}

分页插件


@Configuration
public class MyBtaisPlusConfig {
/**
 * 分页插件
 * @return
 */
@Bean
public PaginationInterceptor paginationInterceptor() {
 System.out.println("加载分页插件");

return new PaginationInterceptor();
}
}

编写一个我们的接口


@Component
public interface UserDao extends BaseMapper<User> {
Integer deleteById(Long id);
}

接下来就可以愉快的测试了,在我们的测试类里先注入dao

@Autowired

private UserDao userMapper;

新增测试


/**
* 新增
*/
@Test
void save(){

User u = new User();
u.setAge(100);
u.setName("测试数据3");
u.setPassword("cjx1111");
u.setAge(25);
int row = userMapper.insert(u);
System.out.println(row);
}

是不是很简单?只需要这样就可以完成新增了,既然有单个插入,那少不了也有批量插入

批量新增测试


/**
* 批量插入
*/
@Test
void save(){
List<User> us = new LinkedList<User>();
 for (int i = 0;i < 50;i++){
  User u = new User();
  u.setName("测试数据"+i);
  u.setAge((int)(Math.random()*90+10));
  u.setPassword("mima"+i);
  us.add(u);
 }
 userService.saveBatch(us);
}

其中用到了userService,我这里贴一下代码,需要我们接口继承Iservice,实现类继承ServiceImple<M,T>,这样就可以直接调用mybatis-plus为我们提供的现成方法了。

public interface IUserService extends IService<User> {

}

实现类

@Service public class UserServiceImpl extends ServiceImpl<UserDao, User>implements IUserService {

}

修改


/**
* 修改
*/
@Test
void updateById(){

User u = new User();
//修改name
u.setId(1L);
u.setName("修改下数据--");
u.setPassword("123");
u.setAge(99);
int row = userMapper.updateById(u);
System.out.println(row);
}

/**
* 通过id查询
*/
@Test
void selectById(){
//1.通过id来查询
User u = userMapper.selectById(1l);
System.out.println(u);

}

mybatis-plus有个特别好用的就是它的条件构造器,可以帮助我们构造常用的sql,具体用法我会贴在文章最后面。


/**
* 通过条件构造器查询
*/
@Test
void selectByWrapper(){

//3.通过条件构造器wrapper
QueryWrapper qw = new QueryWrapper();
qw.like("name","测试");
qw.lt("age",50);//小于
qw.gt("age",15);//大于

List<User> us = userMapper.selectList(qw);
us.stream().forEach(System.out::println);

}

既然有查询,自然少不了我们最关心的分页


/**
* 通过条件构造器和page分页查询
*/
@Test
void selectByWrapperAndPage(){

//4.通过条件构造器wrapper和Page分页查询
QueryWrapper qw = new QueryWrapper();
qw.like("name","测试");
qw.lt("age",50);//小于
qw.gt("age",15);//大于
qw.orderByDesc("age");

IPage<User> result = userMapper.selectPage(new Page<>(2,10),qw);

/**
* 查询总记录数
*/
@Test
void selectCount(){

//5.通过条件查询总条数
QueryWrapper qw = new QueryWrapper();
qw.like("name","测试");
qw.lt("age",50);//小于
qw.gt("age",15);//大于
qw.orderByDesc("age");

int count = userMapper.selectCount(qw);
System.out.println(count);

}

删除


/**
* 通过id删除
*/
@Test
void delete(){

int row = userMapper.deleteById(27l);
System.out.println(row);
}


/**
* 通过id批量删除
*/
@Test
void deleteBatch(){

int row = userMapper.deleteBatchIds(Arrays.asList(67l,44l,37l,220l));
System.out.println(row);
}

/**
* 通过条件删除
*/
@Test
void deleteByWrapper(){

QueryWrapper<User> qw = new QueryWrapper<>();
qw.gt("age",70);
//先来看看有多少数据
int row = userMapper.selectCount(qw);
System.out.println(row);
//删除
int deleteRow = userMapper.delete(qw);
System.out.println(deleteRow);
}

今天就到这,后续会给大家分享下mybatis-plus提供的sql性能执行分析插件、乐观锁插件以及字段的自动填充。

MybatisPlus,无XML分分钟实现CRUD操作

补充知识:Mybatis-plus 自动生成代码后xml文件和mapper映射不到的原因

报了如下错误

找了很久都没找到原因


2020-06-08 18:48:12 |ERROR |http-nio-8130-exec-3 |GlobalExceptionHandler.java:25 |service.base.handler.GlobalExceptionHandler |org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): service.used.mapper.ClassifyMapper.selectNestedListByParentId
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.<init>(MybatisMapperMethod.java:50)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.lambda$cachedMapperMethod$0(MybatisMapperProxy.java:101)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.cachedMapperMethod(MybatisMapperProxy.java:100)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:95)
at com.sun.proxy.$Proxy98.selectNestedListByParentId(Unknown Source)
at xyz.oneadd.platform.service.used.service.impl.ClassifyServiceImpl.nestedList(ClassifyServiceImpl.java:25)
at xyz.oneadd.platform.service.used.service.impl.ClassifyServiceImpl$$FastClassBySpringCGLIB$$85da3417.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)
at xyz.oneadd.platform.service.used.service.impl.ClassifyServiceImpl$$EnhancerBySpringCGLIB$$3b7bb86f.nestedList(<generated>)
at xyz.oneadd.platform.service.used.controller.api.ApiClassifyController.classifyList(ApiClassifyController.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

原因是pom中没有添加bulid依赖

添加依赖后解决问题


<build>
 <resources>
  <resource>
   <directory>src/main/java</directory>
   <includes>
    <include>**/*.xml</include>
   </includes>
   <filtering>false</filtering>
  </resource>
 </resources>
</build>

来源:https://blog.csdn.net/qq_39240442/article/details/107108627

0
投稿

猜你喜欢

  • springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean首先第一种:applicatio
  • 引言这一篇文章我们就通过介绍滑动冲突的规则和一个实例来更加深入的学习View的事件分发机制。1、外部滑动方向和内部滑动方向不一致考虑这样一种
  • 一个很常用的功能,一个ViewPager会自动滚动,并且有一排小圆点黑和白来指示当前的滚动进度首先写一个ViewPager的适配器,这里这个
  • Android6.0蓝牙出现无法扫描设备或闪退问题解决办法前言:目前待的这家公司是做智能家居的,最近客户那边有反馈说为什么我的手机蓝牙也打开
  • 定义栈又名堆栈,是一种操作受限的线性表,仅能在表尾进行插入和删除操作。它的特点是先进后出,就好比我们往桶里面放盘子,放的时候都是从下往上一个
  • 三种方式 下面为大家一一对应过滤器的方式 * 的方式过滤器的方式这种方式简单点 但是可配置性不高注意:一定得扫描到spring容器中创建一个
  • 开门见山,添加水印的方法非常简单,其实就只有3个步骤:1、载入原始图片2、载入水印图片3、保存带有水印的图片实现的原理就是:获取原始图片的宽
  • 前言本文准确来讲是探讨如何用 Jackson 来序列化 Apache avro 对象,因为简单用 Jackson 来序列化 Apache a
  • 本文实例讲述了C#从DataTable获取数据的方法。分享给大家供大家参考。具体如下:通过通用类,返回一个DataTable,要想显示每个单
  • 1. 引言 * (Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter。我们可以让普通的B
  • java转换字符串编码格式 (解码错误,重新解码)字符集概念:规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(
  • 本文实例讲述了C#编程读取文档Doc、Docx及Pdf内容的方法。分享给大家供大家参考。具体分析如下:Doc文档:Microsoft Wor
  • android 实现拨打电话的app,代码非常简单,功能也很实用,分享给大家。MainActivity.javapackage com.bb
  • 首先,来看一下,快速排序的实现的动态图:快速排序介绍:快速排序,根据教科书说法来看,是冒泡排序的一种改进。快速排序,由一个待排序的数组(ar
  • 本文实例讲述了java使用归并删除法删除二叉树中节点的方法。分享给大家供大家参考。具体分析如下:实现的思想很简单:first:找到要删除的节
  • 前言开发中常用到主从数据库来提高系统的性能。怎么样才能方便的实现主从读写分离呢?近日工作任务较轻,有空学习学习技术,遂来研究如果实现读写分离
  • 今天实现一个很多app中使用到的加载进度条的效果,可能我们平时数据加载都使用到的是系统自带的,但是也有很多app加载进度条的效果实现挺好看,
  • 自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流。今天来实践一下微信的语音对讲的录音实现,这个也比较容易实现。在此,
  • PowerPoint幻灯片中可插入公式,用于在幻灯片放映时演示相关内容的论证、推算的依据,能有效地为演讲者提供论述的数据支撑。通过后端程序代
  • 最近我在考虑如何远程控制tomcat的启动和关机,最后是有友好的界面,能够实现一键式操作的,这样会肯定是会很方便的,网上找了半天,没找到,有
手机版 软件编程 asp之家 www.aspxhome.com