mybatis-plus?查詢傳入?yún)?shù)Map,返回List<Map>方式
mybatis-plus 查詢傳入?yún)?shù)Map,返回List<Map>
原因有時(shí)實(shí)體類屬性不夠用,又不想寫自定義VO了,所以用map,這樣直接返回前臺(tái)用起來(lái)也很方便
1、mapper.xml
注意是resultType 不是resultMap 否則報(bào)錯(cuò)
<select id="getOrder" parameterType="hashMap" resultType="java.util.Map">
SELECT * FROM order
<where>
<if test="orderId != null and orderId != ''"> and order_id = #{orderId}</if>
</where>
</select>
2、mapper.java
List<Map<String, Object>> getOrder(Map<String,Object> map);
3、service 組裝查詢條件
public List<Map<String, Object>> getOrder(String storeId) {
Map<String,Object> map=new HashMap<String,Object>();
map.put("orderId",orderId);
return storeApiOrderMapper.getOrder(map);
}
mybatis-plus 基本使用
首先我們需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)表
用于演示MyBatis-Plus的基本用法。
CREATE TABLE `user` (
`id` varchar(32) NOT NULL,
`username` varchar(32) DEFAULT '',
`password` varchar(32) DEFAULT '',
PRIMARY KEY (`id`)
);
然后創(chuàng)建一個(gè)Spring Boot項(xiàng)目
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: 123456
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'
實(shí)體類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(exist = false) ,表示該字段在數(shù)據(jù)庫(kù)中不存在 ,所以不會(huì)插入到數(shù)據(jù)庫(kù)中
* 使用 transient 、 static 修飾的屬性也不會(huì)插入數(shù)據(jù)庫(kù)中
*/
@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> {
}
UserMapper需要繼承MyBatis-Plus的BaseMapper接口。
BaseMapper接口源碼如下,其實(shí)就是定義了一些數(shù)據(jù)庫(kù)表的CRUD方法。
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> wrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}
啟動(dòng)類:
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")這個(gè)一定要加上。
這樣就構(gòu)建好了項(xiàng)目,使用MyBatis-Plus可以不用寫Mapper.xml配置文件,是不是賊方便。
我們先在數(shù)據(jù)庫(kù)中添加幾行數(shù)據(jù),方便演示。

我們來(lái)演示幾個(gè)基本的查詢方法
package com.kaven.mybatisplus.dao;
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.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void selectList(){
// 條件設(shè)置為null , 就是沒(méi)有條件,即查詢所有數(shù)據(jù)
List<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println);
}
@Test
public void selectById(){
// 根據(jù)Id查詢
User user = userMapper.selectById("1");
System.out.println(user);
}
@Test
public void selectBatchIds(){
// 根據(jù)Id列表進(jìn)行批查詢
List<String> idList = Arrays.asList("1" , "2" , "3");
List<User> userList = userMapper.selectBatchIds(idList);
userList.forEach(System.out::println);
}
@Test
public void selectByMap(){
// 根據(jù)<屬性 , 值>來(lái)進(jìn)行匹配查詢 , 多個(gè)<屬性 , 值>會(huì)通過(guò)and方式來(lái)查詢
Map<String , Object> map = new HashMap<>();
// 這里是數(shù)據(jù)庫(kù)的列名 , 而不是實(shí)體類的屬性名
map.put("username" , "kaven");
map.put("password" , "kaven");
List<User> userList = userMapper.selectByMap(map);
userList.forEach(System.out::println);
}
}
運(yùn)行結(jié)果:

再演示更新方法。
package com.kaven.mybatisplus.dao;
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;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperUpdateTest {
@Autowired
private UserMapper userMapper;
@Test
public void updateById(){
// 根據(jù)Id進(jìn)行更新
User user = userMapper.selectById("1");
user.setPassword("itkaven");
int rows = userMapper.updateById(user);
System.out.println(userMapper.selectById(user.getId()));
}
}

其實(shí)還有一個(gè)update方法,但它需要一個(gè)條件,條件也可以設(shè)置為null,但這樣會(huì)更新所有的數(shù)據(jù),這里先不演示,之后的博客再進(jìn)行演示說(shuō)明,兩個(gè)更新方法的定義如下。
/**
* 根據(jù) ID 修改
*
* @param entity 實(shí)體對(duì)象
*/
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根據(jù) whereEntity 條件,更新記錄
*
* @param entity 實(shí)體對(duì)象 (set 條件值,可以為 null)
* @param updateWrapper 實(shí)體對(duì)象封裝操作類(可以為 null,里面的 entity 用于生成 where 語(yǔ)句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
再演示幾個(gè)刪除方法
package com.kaven.mybatisplus.dao;
import org.junit.Assert;
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 org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperDeleteTest {
@Autowired
private UserMapper userMapper;
@Test
@Transactional
public void deleteById(){
// 根據(jù)Id進(jìn)行刪除
int rows = userMapper.deleteById("1");
Assert.assertEquals(rows , 1);
}
@Test
@Transactional
public void deleteByMap(){
// 根據(jù)<屬性 , 值>進(jìn)行匹配刪除
Map<String , Object> map = new HashMap<>();
map.put("username" , "607");
map.put("password" , "607");
int rows = userMapper.deleteByMap(map);
Assert.assertEquals(rows , 1);
}
@Test
@Transactional
public void deleteBatchIds(){
// 根據(jù)Id列表進(jìn)行批刪除
List<String> idList = Arrays.asList("1" , "2" , "3");
int rows = userMapper.deleteBatchIds(idList);
Assert.assertEquals(rows , 3);
}
}
結(jié)果如下:

這里也還有一個(gè)delete方法,也需要一個(gè)條件,所以也不進(jìn)行演示了。
再演示插入方法
package com.kaven.mybatisplus.dao;
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;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperInsertTest {
@Autowired
private UserMapper userMapper;
@Test
public void insert(){
// 直接實(shí)體插入
User user = new User();
user.setId("4");
user.setUsername("hn");
user.setPassword("hn");
userMapper.insert(user);
}
}
結(jié)果如下:

這就是MyBatis-Plus的基本使用了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換
這篇文章主要介紹了Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Java優(yōu)先隊(duì)列?priority?queue
本文主要介紹了Java優(yōu)先隊(duì)列?priority?queue,優(yōu)先隊(duì)列是一種特殊的數(shù)據(jù)結(jié)構(gòu)隊(duì)列中每一個(gè)元素都被分配到一個(gè)優(yōu)先權(quán)值,出隊(duì)順序按照優(yōu)先權(quán)值來(lái)劃分。一般有兩種出隊(duì)順序高優(yōu)先權(quán)出隊(duì)或低優(yōu)先權(quán)出隊(duì),想了解具體內(nèi)容的小伙伴可以參考下文內(nèi)容,希望對(duì)你有所幫助2021-12-12
Spring實(shí)現(xiàn)動(dòng)態(tài)修改時(shí)間參數(shù)并手動(dòng)開啟關(guān)停操作
spring實(shí)現(xiàn)定時(shí)任務(wù)的方式有三種,分別是java自帶的timer類、spring task和quartz三種。本文只介紹spring自帶的task和第三方quartz,感興趣的朋友參考下吧2017-09-09
SpringBoot隨機(jī)端口啟動(dòng)的實(shí)現(xiàn)
本文主要介紹了SpringBoot隨機(jī)端口啟動(dòng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
將應(yīng)用程序進(jìn)行Spring6遷移的最佳使用方式
這篇文章主要介紹了將應(yīng)用程序進(jìn)行Spring6遷移的最佳方式,以及如何充分利用此升級(jí),需要的朋友可以參考下,如有錯(cuò)誤的地方還請(qǐng)指正2023-03-03
java靈活使用mysql中json類型字段存儲(chǔ)數(shù)據(jù)詳解
在數(shù)據(jù)庫(kù)設(shè)計(jì)中,面對(duì)一對(duì)多的關(guān)系,如訂單和商品,可以考慮使用單表存儲(chǔ)而非傳統(tǒng)的分表方式,這篇文章主要介紹了java靈活使用mysql中json類型字段存儲(chǔ)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2024-09-09

