mybatis-plus 使用心得

俠骨柔情冷郎君發表於2020-12-19

mybatis-plus

官方文件

plus提供了許多對資料庫的操作api,本文以mysql為例簡單說明 對資料庫操作的框架有 spring提供的jpa,tk-mapper,mybatis-plus最為歡迎,其中我是用最多的用的最順手的為plus, 主要說一些使用心得和簡單的操作語法

不開喜歡上來知直接貼上一大堆程式碼,沒什麼用,直接說核心 ,後面在開法中使用心得會慢慢補上來,因為crud過於簡單就沒有寫什麼程式碼,後面如果遇到複雜的需求 會慢慢補上來

先囉嗦幾句

在java8中有很多新特性,其中能提高開發效能的就是lambda表示式和stream流,一般lambda表示式在開發中可能不經常看到,如果有興趣看原始碼的話,不難發現很多原始碼是有lambda的身影的,其中Stream中很多方法的形參就是lambda介面,兩者結合能對資料結構做出非常靈活的操作,Stream本身就是流式程式設計的思想, 在開發中如果對於集合操作,使用Stream+lambda能寫出絕對簡潔 可讀性非常高 效能不錯的程式碼,而在plus中我們對條件的構造,一般都會使用條件構造,而在plus中也有支援lambda的條件構造器,這是我最喜歡的,因為可讀性非常強,程式碼閱讀性好,簡單的展示段程式碼體驗一下

// 我想得到沒有刪除的賬號,開通時間在一定範圍內,並且賬號含有 admin 字元的賬號集合
		LambdaQueryWrapper<User> lambdaQuery = Wrappers.lambdaQuery();
		lambdaQuery.like(User::getAccount,"admin")
				.eq(User::getDeleteFlag,0)
				.between(User::getCreatetime,"2020-01-01","2020-02-02");
		List<User> users = userMapper.selectList(lambdaQuery);
		//得到使用者集合後我通過使用者狀態分組,然後的到使用者名稱字的集合
				Map<Integer, List<String>> collect = users.stream()
				.collect(Collectors.groupingBy(
						User::getState, 
						Collectors.mapping(User::getName, Collectors.toList()
						))
				);

很簡單需求,如果手寫sql不寫程式碼也能實現,結合plus的條件構造,java8的新特性寫出來的程式碼同上,簡潔性 可讀性非常高,這就是我對plus吸引我的地方,完成了簡單的條件構造 也支援鏈式程式設計

在搭建工程

  <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
  </dependency>

yaml

server:
  port: 9004 # 服務訪問埠號
spring:
  application:
    name: tensquare-article #服務名稱
  datasource: # 資料庫連線四大屬性
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.200.128:3306/tensquare_article?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
logging:
  level:
    root: debug
mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml

啟動類

@SpringBootApplication
@MapperScan("你mapper存放的包名全路徑")
public class ArticleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ArticleApplication.class, args);
    }
	/**
	 * 分散式自增id -plus提供
	 * @return
	 */
	@Bean
	public Sequence sequence(){
		return  new Sequence();
	}
// plus 分頁外掛
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    	}
	}
}
@Data
@TableName("sys_user") //資料庫表名
public class User  implements Serializable {
	//資料庫id是自增的 所以這裡自增,insert資料不需要執行id 當然你也可以配置其他屬性
    @TableId(type = IdType.AUTO) 
    private Integer id;
    private String username;
    private String password;
    @TableField("status") //執行資料庫中欄位名 一致的話可以不加此註解
    private Integer status;

    @TableField(exist = false)//不是資料庫表中欄位 就要打上 falsh標記
    private List<Role> roles;
}


plus中id配置列舉類

public enum IdType {
    /**
     * 資料庫ID自增
     */
    AUTO(0),
    /**
     * 該型別為未設定主鍵型別(註解裡等於跟隨全域性,全域性裡約等於 INPUT)
     */
    NONE(1),
    /**
     * 使用者輸入ID
     * <p>該型別可以通過自己註冊自動填充外掛進行填充</p>
     */
    INPUT(2),

    /* 以下3種型別、只有當插入物件ID 為空,才自動填充。 */
    /**
     * 分配ID (主鍵型別為number或string),
     * 預設實現類 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花演算法)
     *
     * @since 3.3.0
     */
    ASSIGN_ID(3),
    /**
     * 分配UUID (主鍵型別為 string)
     * 預設實現類 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
     */
    ASSIGN_UUID(4),
    /**
     * @deprecated 3.3.0 please use {@link #ASSIGN_ID}
     */
    @Deprecated
    ID_WORKER(3),
    /**
     * @deprecated 3.3.0 please use {@link #ASSIGN_ID}
     */
    @Deprecated
    ID_WORKER_STR(3),
    /**
     * @deprecated 3.3.0 please use {@link #ASSIGN_UUID}
     */
    @Deprecated
    UUID(4);

    private final int key;

    IdType(int key) {
        this.key = key;
    }
}

//mapper
public interface UserMapper extends BaseMapper<User> {
}

 public interface UserService extends IService<User> {
}
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

這樣的話我們就可以再實現類中用到框架給我們提供的方法,很多方法原始碼會有中文註釋,這樣的話 入門就輕鬆很多,只要你繼承了他的類,就可以使用所有方法,日常的資料庫操作 直接秒殺

先看框架為我們提供的方法

頂級 Service

public interface IService {}
在這裡插入圖片描述

mapper介面方法

public interface BaseMapper extends Mapper {}
在這裡插入圖片描述

可以看到mapper中和service中有很多相似的方法,但是也有不同的.他們沒什麼區別,至少從使用中感覺不到區別,注意看每個方法, 很多方法的引數都是 Wrapper 實際是就是條件構造器. 掌握了這個玩意,plus基本就能得心應手

條件構造器結構類圖

LambdaQueryWrapper

在這裡插入圖片描述

QueryWrapper

在這裡插入圖片描述

在開發中我使用最多的就是這個兩個構造器, 一個是LambdaUpdateWrapper 另一個 QueryWrapper
有了這兩個物件,就可以構造條件 開發中不推薦直接 new 而是使用plus提供的工具類去得到他們,使用起來真的很簡單,能滿足多數需求

在這裡插入圖片描述

使用起來真的很簡單,很靈活,能滿足多數需求,在使用過成中過於簡單,我主要記錄一些平時我工作中常用的,有些不常用的我也不懂,請大家多多指教,官網裡對於構造器的用法也有很多說明,這裡不做贅述,如有時間後期會更新一些追原始碼的過程來分享,首次寫部落格,寫的不好萬望海涵!!!

相關文章