欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mybaties plus selectMaps和selectList的区别说明

程序员文章站 2022-06-15 14:09:49
目录selectmaps和selectlist的区别mybaties plus之selectmaps、selectobjs、selectcount、selectone的用法selectmapssele...

selectmaps和selectlist的区别

selectlist查询部分字段,会返回所有的,没查询的值为null

mybaties plus selectMaps和selectList的区别说明

selectmaps 只会返回你查询的。

mybaties plus selectMaps和selectList的区别说明

mybaties plus之selectmaps、selectobjs、selectcount、selectone的用法

首先创建一个数据库表,如下图所示:

mybaties plus selectMaps和selectList的区别说明

然后创建一个spring boot项目,pom.xml和配置如下:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
         xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelversion>4.0.0</modelversion>
    <groupid>org.kaven</groupid>
    <artifactid>mybatis-plus</artifactid>
    <version>1.0-snapshot</version>
    <parent>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-parent</artifactid>
        <version>2.3.4.release</version>
        <relativepath/>
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter</artifactid>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-webflux</artifactid>
        </dependency>
        <dependency>
            <groupid>com.baomidou</groupid>
            <artifactid>mybatis-plus-boot-starter</artifactid>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupid>mysql</groupid>
            <artifactid>mysql-connector-java</artifactid>
            <version>5.1.49</version>
        </dependency>
        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
            </plugin>
        </plugins>
    </build>
</project>
spring:
  application:
    name: mybatis-plus
  datasource:
    driver-class-name: com.mysql.jdbc.driver
    username: root
    password: itkaven@123
    url: jdbc:mysql://127.0.0.1:3306/test?characterencoding=utf-8&usessl=false
server:
  port: 8085
logging:
  level:
    root: warn
    com.kaven.mybatisplus.dao: trace
  pattern:
    console: '%p%m%n'
mybatis-plus:
  mapper-locations: classpath:mappers/*.xml

实体类user:

package com.kaven.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.tablefield;
import com.baomidou.mybatisplus.annotation.tableid;
import com.baomidou.mybatisplus.annotation.tablename;
import lombok.data;
@tablename("user")
@data
public class user {
    @tableid
    private string id;
    @tablefield("username")
    private string username;
    @tablefield("password")
    private string password;
    @tablefield("age")
    private integer age;
    /**
     * 使用 @tablefield(exist = false) ,表示该字段在数据库中不存在 ,所以不会插入数据库中
     * 使用 transient 、 static 修饰属性也不会插入数据库中
     */
    @tablefield(exist = false)
    private string phone;
}

mapper接口usermapper:

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.mapper.basemapper;
import com.kaven.mybatisplus.entity.user;
import org.springframework.stereotype.component;
@component
public interface usermapper extends basemapper<user> {}

启动类:

package com.kaven.mybatisplus;
import org.mybatis.spring.annotation.mapperscan;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
@springbootapplication
@mapperscan(basepackages = "com.kaven.mybatisplus.dao")
public class apprun {
    public static void main(string[] args) {
        springapplication.run(apprun.class , args);
    }
}

@mapperscan(basepackages = "com.kaven.mybatisplus.dao")这个一定要加上。

我们先在数据库中添加几行数据,方便演示。

mybaties plus selectMaps和selectList的区别说明

selectmaps

来看一下源码:

    /**
     * 根据 wrapper 条件,查询全部记录
     *
     * @param querywrapper 实体对象封装操作类(可以为 null)
     */
    list<map<string, object>> selectmaps(@param(constants.wrapper) wrapper<t> querywrapper);

方法返回list<map<string, object>>类型的值,它的应用场景就是当我们只需要对象的一小部分属性或者对象没有的属性时,这种方法就显得很有用了。

我们先不使用selectmaps来实现一下只需要对象的一部分属性。

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermappermapstest {
    @autowired
    private usermapper usermapper;
    @test
    public void selectlist(){
        querywrapper<user> userquerywrapper = wrappers.query();
        userquerywrapper.select(user.class , e -> !e.getcolumn().equals("password")).lt("age" , 50);
        list<user> userlist = usermapper.selectlist(userquerywrapper);
        userlist.foreach(system.out::println);
    }
}

结果如下:

mybaties plus selectMaps和selectList的区别说明

结果虽然是正确的,但输出的user数据中有为null的属性,当不需要的属性比较多时,这种方法就不太好。

使用selectmaps来实现一下只需要对象的一部分属性。

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermappermapstest {
    @autowired
    private usermapper usermapper;
    @test
    public void selectmaps(){
        querywrapper<user> userquerywrapper = wrappers.query();
        userquerywrapper.select(user.class , e -> !e.getcolumn().equals("password")).lt("age" , 50);
        list<map<string , object>> maplist = usermapper.selectmaps(userquerywrapper);
        maplist.foreach(system.out::println);
    }
}

结果如下:

mybaties plus selectMaps和selectList的区别说明

结果也是正确的,并且没有那些为null的属性值。

再来演示一下selectmaps怎么返回给我们实体类中不存在的属性。

以age进行分组,并且每组age和要小于60,输出平均age、最大age、最小age。

这个例子可能不太好,但能体现出selectmaps的方便之处,因为平均age、最大age、最小age是user实体类中没有的属性。

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermappermapstest {
    @autowired
    private usermapper usermapper;
    @test
    public void selectmaps2(){
        querywrapper<user> userquerywrapper = wrappers.query();
        userquerywrapper.select("avg(age) avg_age" , "min(age) min_age" , "max(age) max_age")
                        .groupby("age")
                        .having("sum(age) < {0}" , 60);
        list<map<string , object>> maplist = usermapper.selectmaps(userquerywrapper);
        maplist.foreach(system.out::println);
    }
}

结果如下:

mybaties plus selectMaps和selectList的区别说明

结果是正确的,可以看一下输出的sql语句。

selectobjs

看一下源码:

    /**
     * 根据 wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param querywrapper 实体对象封装操作类(可以为 null)
     */
    list<object> selectobjs(@param(constants.wrapper) wrapper<t> querywrapper);

从源码的注释中可以看到注意: 只返回第一个字段的值这句话,我们来演示一下该方法就能明白这句话了。

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermapperothertest {
    @autowired
    private usermapper usermapper;
    @test
    public void selectobjs(){
        querywrapper<user> userquerywrapper = wrappers.query();
        userquerywrapper.select("username" , "age").likeright("username","k").le("age" , 30);
        list<object> objectlist = usermapper.selectobjs(userquerywrapper);
        objectlist.foreach(system.out::println);
    }
}

结果如下:

mybaties plus selectMaps和selectList的区别说明

很显然,结果是正确的,并且只返回了username。

selectcount

看一下源码:

    /**
     * 根据 wrapper 条件,查询总记录数
     *
     * @param querywrapper 实体对象封装操作类(可以为 null)
     */
    integer selectcount(@param(constants.wrapper) wrapper<t> querywrapper);

该方法其实就是返回符合条件的记录数。

我们来演示一下。

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermapperothertest {
    @autowired
    private usermapper usermapper;
    @test
    public void selectcount(){
        querywrapper<user> userquerywrapper = wrappers.query();
        userquerywrapper.likeright("username","k").le("age" , 30);
        integer count = usermapper.selectcount(userquerywrapper);
        system.out.println(count);
    }
}

结果如下:

mybaties plus selectMaps和selectList的区别说明

结果也是正确的。

selectone

也来看一下源码:

    /**
     * 根据 entity 条件,查询一条记录
     *
     * @param querywrapper 实体对象封装操作类(可以为 null)
     */
    t selectone(@param(constants.wrapper) wrapper<t> querywrapper);

这个方法会返回一个实体,所以,如果有多条数据匹配的话,就会报错。

我们来演示一下报错的情况。

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermapperothertest {
    @autowired
    private usermapper usermapper;
    @test
    public void selectoneerror(){
        querywrapper<user> userquerywrapper = wrappers.query();
        userquerywrapper.like("username","k");
        user user = usermapper.selectone(userquerywrapper);
        system.out.println(user);
    }
}

报错如下:

mybaties plus selectMaps和selectList的区别说明

再来演示一下正确的情况。

package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.core.toolkit.wrappers;
import com.kaven.mybatisplus.entity.user;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@runwith(springrunner.class)
@springboottest
public class usermapperothertest {
    @autowired
    private usermapper usermapper;
    @test
    public void selectone(){
        querywrapper<user> userquerywrapper = wrappers.query();
        userquerywrapper.like("username","kaven");
        user user = usermapper.selectone(userquerywrapper);
        system.out.println(user);
    }
}

结果如下:

mybaties plus selectMaps和selectList的区别说明

结果是正确的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。