mybatisplus 联表查询_工作中不推荐mybatisplus

mybatisplus 联表查询_工作中不推荐mybatisplus工作中能用到Mybatis-plus吗?各位大佬,最近在学习java,我想问知道,目前工作中能用到Mybatis-plus吗,和jpa相比,那个使用会多些一. MP简介我们知道Mybatis属于一个半自动的O

工作中能用到Mybatis-plus吗?

各位大佬,最近在学习java,我想问知道,目前工作中能用到Mybatis-plus吗,和jpa相比,那个使用会多些

一. MP简介

我们知道Mybatis属于一个半自动的ORM框架,之所以说Mybatis是一个半自动的ORM框架,原因是它还需要我们自己在注解或是映射文件中编写SQL语句,并没有实现完全的自动化。SQL语句的编写虽然增加了项目和业务需求实现的灵活性,但对一些基本表的操作而言,无疑增加了数据库操作的复杂度,显得没有那么方便。而Mybatis-Plus则是属于全自动的ORM框架,按照开闭原则,在不影响Mybatis现有功能的情况下,实现了对Mybatis的增强。

今天我要带大家来学习一下Mybatis-Plus框架。

二. Mybatis-Plus特点

MP具有如下特点:

  1. 通过在实体类中与数据库表进行映射;
  2. 无需编写SQL语句,简化了CRUD操作;
  3. 通常适用于单表。

三. MP使用

接下来我会在SpringBoot项目环境中,带着大家一起使用Mybatis-Plus。

1.新建SpringBoot项目

这个过程在这里就给大家省略了,如果有不熟悉的同学,请参照之前有关SpringBoot的文章自行实现哦。

2.添加核心依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.1.tmp</version>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
        <version>1.18.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
    </dependency>
</dependencies>

在这里面比较重要的依赖包,就是今天我们要使用的mybatis-plus-boot-starter这个依赖了。

3.创建SpringBoot启动程序

和其他SpringBoot项目的启动程序一样,此处也略过。

4.配置文件

在配置文件中,我们主要编写的是数据库的连接信息,我在这里使用的是properties格式的配置文件,也就是application.properties。

spring.datasource.password=数据库账号的登录密码
spring.datasource.username=数据库登录账号
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
server.port=8096
spring.application.name=MYBATISPLUSSERVER

5.编写实体类

由于mybatis-plus,可以不编写SQL语句。那么Java中的对象,到底该如何与数据库中的表进行映射呢?答案其实就在实体类中!我们可以通过不同的注解来完成实体类和具体表,以及实体类的属性和表中的列进行映射。这也是mybatis-plus中非常关键的一步,具体实现如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("emp")  //告知mybatis-plus和数据库中的哪个表关联
public class User extends Model<User> implements Serializable {
    //主键id
    private int id;  //当实体类的属性名和和表中的列名相同,无需做任何设置

    @TableField("name") 
    private String userName; //属性名和列名不一致时设置映射,用userName属性和表中的name列进行关联

    private int age;
    private String email;
}

6.编写dao接口

我们这里的接口中,不必编写任何CRUD方法,只需要继承BaseMapper接口即可。通过阅读源码我们可以发现,在这个接口中其实已经封装了常见的CURD方法,源码如下:


mybatisplus 联表查询_工作中不推荐mybatisplus

所以,实体类中就可以省去CRUD方法的代码实现。

package com.qf.pro.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.pro.pojo.User;

public interface UserDao extends BaseMapper<User> {
    //BaseMapper<User> 默认封装了CRUD方法,通过泛型制定了所操作的实体类及表
}

7.编写配置类

这样当SpringBoot启动时,就可以扫描到dao层代码所在的包。

package com.qf.mp2103.dao;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.qf.mp2103.dao")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor(){

        return new PaginationInterceptor();
    }
}

8.业务实现

我们要在业务逻辑层里调用各种CRUD方法,这也是Mybatis-Plus比较核心、重要的点,MybatisPlus会根据之前的配置自动生成SQL语句。

package com.qf.mp2103.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qf.mp2103.dao.UsersDao;
import com.qf.mp2103.pojo.Users;
import com.qf.mp2103.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UsersService {
    @Autowired
    private UsersDao usersDao;
    
    @Override
    public List<Users> findUsers() {
        //mybatisplus 自动生成/提供的查询方法
        //由于是无条件查询,参数null
        return usersDao.selectList(null);
    }

    @Override
    public List<Users> findUsersByCondition(String name) {
        //创建QueryWrapper对象
        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
        //通过wrapper对象来设置查询条件
        //参数1:字段表名
        //参数2:所赋值
        //eq  等于
        wrapper.eq("name",name);

        return usersDao.selectList(wrapper);
    }

    @Override
    public List<Users> findUsersByCondition2(int startAge, int endAge) {
        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
        //年龄的范围
        wrapper.between("age",startAge,endAge);
        return usersDao.selectList(wrapper);
    }

    @Override
    public List<Users> findUsersByCondition3(Users users) {
        //多条件查询
        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
        //where name='' and age <=
//        wrapper.eq(true,"name",users.getUserName());
////        wrapper.le(true,"age",users.getAge());
        //where name='' or age >=
        wrapper.eq(true,"name",users.getUserName());
        wrapper.ge(false,"age",users.getAge());
        return usersDao.selectList(wrapper);
    }

    @Override
    public List<Users> findUsersByCondition4(Users users) {
        //模糊查询
        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
        //%关键字%
        wrapper.like("name",users.getUserName());
        //%明
        //wrapper.likeLeft()
        //李%
        //wrapper.likeRight();
        return usersDao.selectList(wrapper);
    }

    //排序查询
    @Override
    public List<Users> findUsers2() {
        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
        //设置排序条件
        wrapper.orderByDesc("id");

        return usersDao.selectList(wrapper);
    }

    @Override
    public List<Users> findUsersByPage(int page, int size) {
        //用于分页查询
        //select * from users  limit X,X
        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
        int start=(page-1)*size;
        //拼接
        wrapper.last("limit "+start+","+size);
        return usersDao.selectList(wrapper);
    }

    @Override
    public List<Users> findUsers3() {
        //查询指定列
        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
        //设置查询的列
        wrapper.select("id","email");

        return usersDao.selectList(wrapper);
    }

    @Override
    public boolean addUser(Users users) {
        //添加用户
        int result=usersDao.insert(users);
        return result==1;
    }

    @Override
    public boolean deleteUser(int id) {
        //删除用户--单个删除
        int result=usersDao.deleteById(id);
        //批量删除
        //usersDao.deleteBatchIds(List<Integer> list);
        return result==1;
    }

    @Override
    public boolean updateUser(Users users) {
        //要求表中的主键列是id的名字,使用id列作为条件
        int result=usersDao.updateById(users);
        //如果主键列的名字不是id,或者条件不是主键id
//        QueryWrapper<Users> wrapper=new QueryWrapper<Users>();
//        wrapper.eq("email",users.getEmail());
//        int result2=usersDao.update(users,wrapper);
        return result==1;
    }

    @Override
    public Users findUersById(int id) {
        //根据主键id查询单个对象
        return usersDao.selectById(id);
    }

    @Override
    public List<Users> findUsersByIds(List<Integer> list) {
        //根据id批量查询
        return usersDao.selectBatchIds(list);
    }

    @Override
    public Map<String,Object> findUsersByPage2(int page, int size) {
        //如果还有其他条件查询,声明条件构造器进行

        //创建分页插件对象
        //参数1:显示第几页数据
        //参数2:每页显示几条数据
        Page<Users> page1=new Page<Users>(page,size);
        //根据分页插件对象里的分页条件查询数据
        IPage<Users> iPage=usersDao.selectPage(page1,null);

        Map<String,Object> map=new HashMap<String, Object>();
        //总记录数  iPage.getTotal()
        map.put("totalCount",iPage.getTotal());
        //总页数 iPage.getPages()
        map.put("totalPage",iPage.getPages());
        //分页数据
        map.put("data",iPage.getRecords());
        return map;
    }

    @Override
    public List<Users> findUsers4(int age1, int age2, String email) {
        QueryWrapper<Users> queryWrapper=new QueryWrapper<Users>();
        queryWrapper.ge("age",age1).le("age",age2).or().likeRight("email",email);

        return usersDao.selectList(queryWrapper);
    }

    @Override
    public Users findUsers5(int id) {
        //创建实体类对象
        Users user=new Users();
        user.setId(id);
        //声明对象接收查询返回的结果
        Users getUser=user.selectById(id);
        return getUser;
    }

    @Override
    public void addUsers2(Users users) {
        //添加方法
        users.insert();
    }

    @Override
    public void updateUsers2(Users users) {
        //根据主键更新
        users.updateById();
    }

    @Override
    public void deleteUsers2(Users users) {
        //根据主键删除
        users.deleteById();
    }

    public Users findOne(String name){
        //根据其他条件查询单个数据,如果多于1条数据,则报异常
        //条件构造器
        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.eq("name",name);
        return usersDao.selectOne(queryWrapper);
    }
    //查询总记录数
    public int getUserCount(){
        //可以声明条件构造器
        return usersDao.selectCount(null);
    }

}

这样通过以上几个步骤,我们就学会了Mybatis-Plus的基本使用,希望今天的文章可以教会大家如何使用Mybatis-Plus。如果你还有疑惑,可以留言哦。

激活谷谷主为您准备了激活教程,为节约您的时间请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/13504.html

(0)
上一篇 2024年 5月 15日 下午11:06
下一篇 2024年 5月 15日 下午11:16

相关推荐

  • remove函数头文件

    remove函数头文件数据处理过程中出现的一项常见要求是需要从数字或文本中删除最后三位数字。无论您处理的是大型数据集还是少量单元格,Excel 都提供了多种方法来有效地完成此任务。在本文中,我将探索 7 种不同的方法来删除

    激活谷笔记 2024年 5月 18日
  • plaging怎么读英语_placing英语怎么读

    plaging怎么读英语_placing英语怎么读2014年12月大学英语六级听力真题(第1套)原文和答案【听力真题-试题部分】(原文和答案在试题后面,请往下面拉)建议先边听边作答,然后再对照原文和答案听Part II Listening Comprehension (30 minutes)Section A1. A) Th

    激活谷笔记 2024年 5月 31日
  • 医学上ddd是什么简称英文_医学上ddd是什么简称英文翻译

    医学上ddd是什么简称英文_医学上ddd是什么简称英文翻译ddd是什么意思_ddd用英语怎么说_ddd的翻译_ddd翻译成_ddd的中文意思_ddd怎么读,ddd的读音,ddd的用法,ddd的例句全部Physiological pacemaker was impl

    激活谷笔记 2024年 5月 26日
  • 多线程同步执行的命令_多线程同步执行的命令有哪些

    多线程同步执行的命令_多线程同步执行的命令有哪些2021互联网公司java开发工程师面试题汇总!(附答案)2021年互联网大厂,校园招聘java开发工程师面试题大全!(附答案),本篇文章包含java基础+JVM+JMM面试题。Java 基础 40语言特性 12Q1:Java 语言的优点?Q2:Java 如何实现平台无关?Q3:J

    2024年 5月 21日
  • s2045参数

    s2045参数预告:不论聚丙烯专用料新品研发,熔喷料及驻极母粒最新研发进展,我们将都有最详细的讨论尽在“2020中国聚烯烃大会”。上海赛科S2040早已黄袍加身,家喻户晓。5月,上海赛科新推S2045,S2045 是具有低气味、低灰分、高等规度和较窄分子量分布的均聚聚丙烯树脂。流动性更高,纤

    激活谷笔记 2024年 5月 19日
  • 二叉排序树查找和折半查找_二叉排序树查找和折半查找的时间性能

    二叉排序树查找和折半查找_二叉排序树查找和折半查找的时间性能【音频带背】数据结构考前必背简答题系列(四):查找与排序抓码计算机考研将陆续推出数据结构、计网、计组、操作系统的必背文本及音频,文本由抓码专业团队的学长姐精心梳理,单篇推送后会推出PDF合集,帮助正在冲刺备考的你提高学习效率。此外,抓码运营小组将根据你

    2024年 5月 29日
  • 哈夫曼树带权路径长度算法_哈夫曼树带权路径长度怎么算

    哈夫曼树带权路径长度算法_哈夫曼树带权路径长度怎么算哈夫曼树带权路径长度(WPL)计算概念路径:在一棵树中,从一个结点到另一个结点所经过的所有结点,被我们称为两个结点之间的路径路径长度:在一棵树中,从一个结点到另一个结点所经过的“边”的数量,被我们称为两个结点之间的路径长

    2024年 5月 22日
  • 单片机c语言是什么语言_单片机c语言是什么语言类型

    单片机c语言是什么语言_单片机c语言是什么语言类型什 么 是 C 语 言什 么 是 C 语 言C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔实验室的Dennis M. Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写

    激活谷笔记 2024年 5月 24日
  • 7zip压缩后在哪_7zip压缩并邮寄会到哪里去

    7zip压缩后在哪_7zip压缩并邮寄会到哪里去有哪些关于外国铁路、火车的冷知识?有一个类似的问题,大家答的都很精彩,但大部分都是中国的。这里再开一个楼,专说外国的冷知识。前言感谢大家的热烈支持,截至本文Chapter 2首次发表时,Chapter 1已经获得了111赞

    2024年 5月 9日
  • printf在哪个头文件里_printf在什么头文件里

    printf在哪个头文件里_printf在什么头文件里C语言printf()详细描述目录 函数描述参数format返回值函数printf //头文件intclude “stdio.h”描述将格式化数据打印到标准输出,按格式指向的 C 字符串写入标准输出 (

    激活谷笔记 2024年 5月 28日
  • 存储器有哪些分类方式和特点和功能_存储器有哪些分类方式和特点和功能

    存储器有哪些分类方式和特点和功能_存储器有哪些分类方式和特点和功能计算机组成原理:储存系统和结构储存系统的组成:1.按作用分类1>高速缓冲存储器:位于主存和CPU之间,用来存放正在执行的程序段和数据,以便CPU能高速的访问它们。其速度可以和CPU速度相匹配。2>主存储器:存放计算机运行期间所需要的程序和数据,CPU可直接随机

    2024年 5月 28日
  • jrebel debug_jrebel debug失效

    jrebel debug_jrebel debug失效整合maven,jetty,jrebel进行debug调试2014-03-17 20:28:55 JRebel:2014-03-17 20:28:55 JRebel: ###################################

    激活谷笔记 2024年 5月 25日
关注微信