Spring Boot MyBatis Plus 其它主題

1、自定義SQL

自定義SQL可經過註解或XML兩種方式實現,這裏只介紹註解方式。

UserMaper.javajava

public interface UserMapper extends BaseMapper<User> {
/**
 * 自定義SQL查詢
 */
@Select("select * from user ${ew.customSqlSegment}")
List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);

/**
 * 自定義分頁查詢
 */
@Select("select * from user ${ew.customSqlSegment}")
IPage<User> selectUserPage(Page<User> page,@Param(Constants.WRAPPER)Wrapper<User> wrapper);

PageTest.java算法

@Test
public void customSQL() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age").ge("age", 20);
    List<User> userList = userMapper.selectAll(queryWrapper);
    userList.forEach(System.out::println);
}

@Test
public void customPage() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age").ge("age", 20);

    Page<User> page = new Page<>(1,2);
    IPage<User> iPage = userMapper.selectUserPage(page, queryWrapper);

    List<User> userList = iPage.getRecords();
    userList.forEach(System.out::println);
}

2、分頁查詢

添加分頁插件:configuration/MybatisPlusConfig.java數據庫

@Configuration
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

PageTest.javasegmentfault

@RunWith(SpringRunner.class)
@SpringBootTest
public class PageTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void selectPage() {
        // 限定查詢條件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("name", "age").ge("age", 20);

        // 指定起始頁和每頁顯示條數
        Page<User> page = new Page<User>(1, 2);
        IPage<User> ipage = userMapper.selectPage(page, queryWrapper);
        
        // selectMapsPage 用法
        // IPage<Map<String,Object>> ipage = userMapper.selectMapsPage(ipage, queryWrapper);
        // List<Map<String,Object>> userList = ipage.getRecords();

        // 輸出分頁查詢結果
        System.out.println("總分頁數:"+ipage.getPages());
        System.out.println("總記錄數:"+ipage.getTotal());

        // 輸出當前頁全部記錄結果
        List<User> userList = ipage.getRecords();
        userList.forEach(System.out::println);
    }
}

運行結果mybatis

總分頁數:3
總記錄數:5
User(id=null, name=大boss, age=40, email=null, managerId=null, createTime=null)
User(id=null, name=王天風, age=25, email=null, managerId=null, createTime=null)

其它技巧app

// 頁面滾動即刷新新紀錄(上例執行實際兩次查詢,此方式無需獲取總記錄數)
Page<User> page = new Page<User>(1, 2, false);

3、AR 模式

3.1 AR 模式簡介

AR(ActiveRecord)即活動記錄,是一種領域模型模式。
特色是一個模型類對應關係數據庫中的一個表,而模型類的一個實例對應表中的一行記錄。
簡單來講就是經過實體類對象直接進行增刪改查操做,方便開發人員開發。分佈式

3.2 AR 模式實現

User.java測試

/**
 * 1. 實體類繼承Model類
 * 2. 若是有警告添加 @EqualsAndHashCode(callSuper = false)
 * 3. 若是有警告添加 serialVersionUID字段
 */
@Data
public class User extends Model<User> {
    private Long id;                    // 主鍵
    private String name;                // 姓名
    private Integer age;                // 年齡
    private String email;               // 郵箱
    private Long managerId;             // 直屬上級
    private LocalDateTime createTime;   // 建立時間
}

ARTest.javaurl

/**
 * 1.此處無需UserMapper
 * 2.支持常規用法的各類相似接口
 * 3.只演示基本少部分接口
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class ARTest {

    @Test
    public void insertTest() {
        User user = new User();
        user.setId(1033535409867691072L);
        user.setName("劉德華");
        user.setAge(20);
        user.setEmail("ldh@baomidou.com");
        user.setManagerId(1087982257332887553L);
        user.setCreateTime(LocalDateTime.now());

        // 插入數據
        boolean result1 = user.insert();
        System.out.println("執行結果:"+result1);

        // 記錄存在則更新,不存在則插入
        boolean result2 = user.insertOrUpdate();
        System.out.println("執行結果:"+result2);
    }

    @Test
    public void updateTest() {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name", "劉德華");

        User user = new User();
        user.setName("張學友");
        user.setAge(18);
        user.update(updateWrapper);
    }

    @Test
    public void deleteTest() {
        User user = new User();
        user.deleteById(1033535409867691072L);
    }
}

4、主鍵策略

4.1 MP支持的主鍵策略

主鍵策略要點.net

  • 默認的全局主鍵策略是基於雪花(SnowFlake)算法的自增ID
  • 局部主鍵策略優先級大於全局主鍵策略
  • MP更改主鍵類型時數據庫表主鍵類型也應作相應修改
  • 主鍵策略定義com.baomidou.mybatisplus.annotation.IdType
  • NONE、UUID、ID_WORKER、ID_WORKER_STR 對象ID爲空時才自動填充

MP主鍵策略與表主鍵對應關係

MP主鍵 表主鍵 描述
AUTO bigint(20) auto_increment 數據庫ID自增
NONE bigint(20) not null 該類型爲未設置主鍵類型
INPUT bigint(20) not null 用戶輸入ID
UUID varchar(32) 全局惟一ID
ID_WORKER bigint(20) not null 全局惟一ID
ID_WORKER_STR varchar(32) 字符串全局惟一ID (idWorker 的字符串表示)

4.2 局部主鍵策略實現

經過註解指定局部主鍵

@Data
public class User {
    @TableId(type=IdType.AUTO)
    private Long id;
}

一、AUTO類型

SQL
alter table user change column id id bigint(20) auto_increment;

@TableId(type = IdType.AUTO)
private Long id;

@Test
public void autoTest() {
    User user = new User();
    user.setName("AutoTest");
    user.insert();
    System.out.println("插入ID:"+user.getId());
}

輸出
插入ID:1094592041087729667

二、NONE

SQL
alter table user change column id id bigint(20) null;

@TableId(type = IdType.NONE)
private Long id;

@Test
public void noneTest() {
    User user = new User();
    user.setName("NoneTest");
    user.insert();
    System.out.println("插入ID:"+user.getId());
}

輸出
插入ID:1253866625226452994

三、INPUT

SQL
alter table user change column id id bigint(20) null;

@TableId(type = IdType.NONE)
private Long id;

@Test
public void noneTest() {
    User user = new User();
    user.setName("NoneTest");
    user.insert();
    System.out.println("插入ID:"+user.getId());
}

輸出
插入ID:1253866625226452994

四、UUID

SQL
alter table user change column id id varchar(32);

@TableId(type = IdType.UUID)
private String id;

@Test
public void noneTest() {
    User user = new User();
    user.setName("NoneTest");
    user.insert();
    System.out.println("插入ID:"+user.getId());
}

輸出
插入ID:1efa9f0bcf766bed90b127a13bbfc0df

五、ID_WORKER

SQL
alter table user change column id id bigint(20) null;

@TableId(type = IdType.ID_WORKER)
private Long id;

@Test
public void noneTest() {
    User user = new User();
    user.setName("WorkerTest");
    user.insert();
    System.out.println("插入ID:"+user.getId());
}

輸出
插入ID:1253871421761204226

六、ID_WORKER_STR

SQL
alter table user change column id id varchar(32);

@TableId(type = IdType.ID_WORKER_STR)
private String id;

@Test
public void noneTest() {
    User user = new User();
    user.setName("WorkerStrTest");
    user.insert();
    System.out.println("插入ID:"+user.getId());
}

輸出
插入ID:1253869944153976834

4.3 全局逐漸策略實現

application.properties

mybatis-plus.global-config.db-config.id-type=auto

5、通用Service

添加UserService接口

package com.mp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.mp.entity.User;

public interface UserService extends IService<User> {
}

添加UserServiceImpl實現

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

測試UserServiceImpl

/**
 * 1. 無需本身定義每一個服務接口
 * 2. 無需本身實現每一個服務接口
 * 3. 服務接口有不少,參考UserService方法,這裏僅舉一例演示
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void getOne() {
        User one = userService.getOne(Wrappers.<User>lambdaQuery().gt(User::getAge,25), false);
        System.out.println(one);
    }
}

6、MP配置

內容有點多,參考官方文檔吧。

參考資料

一、分佈式數據庫主鍵:雪花算法

相關文章
相關標籤/搜索