mybatis-plus 查詢傳入參數Map,返回List<Map>方式
mybatis-plus 查詢傳入參數Map,返回List<Map>
原因有時實體類屬性不夠用,又不想寫自定義VO瞭,所以用map,這樣直接返回前臺用起來也很方便
1、mapper.xml
註意是resultType 不是resultMap 否則報錯
<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 基本使用
首先我們需要創建一個數據庫表
用於演示MyBatis-Plus的基本用法。
CREATE TABLE `user` ( `id` varchar(32) NOT NULL, `username` varchar(32) DEFAULT '', `password` varchar(32) DEFAULT '', PRIMARY KEY (`id`) );
然後創建一個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: 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'
實體類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) ,表示該字段在數據庫中不存在 ,所以不會插入到數據庫中 * 使用 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> { }
UserMapper需要繼承MyBatis-Plus的BaseMapper接口。
BaseMapper接口源碼如下,其實就是定義瞭一些數據庫表的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); }
啟動類:
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”)這個一定要加上。
這樣就構建好瞭項目,使用MyBatis-Plus可以不用寫Mapper.xml配置文件,是不是賊方便。
我們先在數據庫中添加幾行數據,方便演示。
我們來演示幾個基本的查詢方法
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(){ // 條件設置為null , 就是沒有條件,即查詢所有數據 List<User> userList = userMapper.selectList(null); userList.forEach(System.out::println); } @Test public void selectById(){ // 根據Id查詢 User user = userMapper.selectById("1"); System.out.println(user); } @Test public void selectBatchIds(){ // 根據Id列表進行批查詢 List<String> idList = Arrays.asList("1" , "2" , "3"); List<User> userList = userMapper.selectBatchIds(idList); userList.forEach(System.out::println); } @Test public void selectByMap(){ // 根據<屬性 , 值>來進行匹配查詢 , 多個<屬性 , 值>會通過and方式來查詢 Map<String , Object> map = new HashMap<>(); // 這裡是數據庫的列名 , 而不是實體類的屬性名 map.put("username" , "kaven"); map.put("password" , "kaven"); List<User> userList = userMapper.selectByMap(map); userList.forEach(System.out::println); } }
運行結果:
再演示更新方法。
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(){ // 根據Id進行更新 User user = userMapper.selectById("1"); user.setPassword("itkaven"); int rows = userMapper.updateById(user); System.out.println(userMapper.selectById(user.getId())); } }
其實還有一個update方法,但它需要一個條件,條件也可以設置為null,但這樣會更新所有的數據,這裡先不演示,之後的博客再進行演示說明,兩個更新方法的定義如下。
/** * 根據 ID 修改 * * @param entity 實體對象 */ int updateById(@Param(Constants.ENTITY) T entity); /** * 根據 whereEntity 條件,更新記錄 * * @param entity 實體對象 (set 條件值,可以為 null) * @param updateWrapper 實體對象封裝操作類(可以為 null,裡面的 entity 用於生成 where 語句) */ int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
再演示幾個刪除方法
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(){ // 根據Id進行刪除 int rows = userMapper.deleteById("1"); Assert.assertEquals(rows , 1); } @Test @Transactional public void deleteByMap(){ // 根據<屬性 , 值>進行匹配刪除 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(){ // 根據Id列表進行批刪除 List<String> idList = Arrays.asList("1" , "2" , "3"); int rows = userMapper.deleteBatchIds(idList); Assert.assertEquals(rows , 3); } }
結果如下:
這裡也還有一個delete方法,也需要一個條件,所以也不進行演示瞭。
再演示插入方法
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(){ // 直接實體插入 User user = new User(); user.setId("4"); user.setUsername("hn"); user.setPassword("hn"); userMapper.insert(user); } }
結果如下:
這就是MyBatis-Plus的基本使用瞭。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用
- mybaties plus selectMaps和selectList的區別說明
- MyBatis-Plus 查詢指定字段的實現
- MyBatis-Plus條件構造器之condition參數的使用
- MyBatis-Plus allEq()的用法詳解