自定義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); }
添加分頁插件: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);
AR(ActiveRecord)即活動記錄,是一種領域模型模式。
特色是一個模型類對應關係數據庫中的一個表,而模型類的一個實例對應表中的一行記錄。
簡單來講就是經過實體類對象直接進行增刪改查操做,方便開發人員開發。分佈式
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); } }
主鍵策略要點.net
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 的字符串表示) |
經過註解指定局部主鍵
@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
application.properties
mybatis-plus.global-config.db-config.id-type=auto
添加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); } }
內容有點多,參考官方文檔吧。