Python面向物件程式設計小結
阿新 • • 發佈:2021-01-11
SpringBoot整合Mybatis-Plus
Mybatis-plus是Mybatis的增強工具,在Mybatis的基礎上只做增強不做改變
入門
匯入依賴,lombok依賴還需要下載外掛,可以簡化實體類,無需寫get,set等方法
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
日誌配置:在終端顯示資料庫執行的詳細資訊
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
編寫實體類與其mapper介面,mapper介面只需繼承BaseMapper介面
@Repository public interface UserMapper extends BaseMapper<User>{ }
測試增刪查改
@Autowired private UserMapper userMapper; @Testvoid selecttest(){ //查詢列表 List<User> user = userMapper.selectList(null); System.out.println("user:" + user); //根據ID查詢 User user1 = userMapper.selectById(1L); System.out.println("user1:" + user1); //通過多個ID批量查詢 List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); users.forEach(System.out::println);//簡單的條件查詢 HashMap<String, Object> map = new HashMap<>(); map.put("name", "dengwenxiong1"); map.put("age",13); List<User> users2 = userMapper.selectByMap(map); users2.forEach(System.out::println); } //插入 @Test void insertUser(){ User user=new User(); user.setName("dengwenxiong4"); user.setAge(18); user.setEmail("[email protected]"); int insert=userMapper.insert(user); System.out.println(insert); } //修改 @Test void updateTest(){ User user=new User(); user.setId(1L); user.setName("dengwenxiong5"); int result=userMapper.updateById(user); System.out.println(result); } //刪除 @Test void deleteTest(){ int result=userMapper.deleteById(2L); System.out.println(result); }
提升
Mp幾個常用的知識點:分頁查詢,自動填充,樂觀鎖,邏輯刪除和效能分析
分頁查詢
建立配置類,新增分頁外掛即可
新增外掛
@Configuration public class MpConfig { @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } }
分頁測試
//分頁測試 @Test void selectPage(){ //建立page物件,指定當前頁和每頁記錄數 Page<User> page=new Page<>(1,3); //呼叫分頁查詢方法,將資料封裝到page物件裡 userMapper.selectPage(page,null); //通過page物件獲取資料 System.out.println(page.getCurrent());//當前頁 System.out.println(page.getRecords());//每頁資料的list集合 System.out.println(page.getPages());//總頁數 System.out.println(page.getSize());//每頁顯示的記錄數 System.out.println(page.getTotal());//總記錄數 System.out.println(page.hasNext());//是否有下一頁 System.out.println(page.hasPrevious());//是否有上一頁 }
自動填充
自動填充建立時間和更新時間,新增欄位和註解
@TableField(fill= FieldFill.INSERT) private Date createTime; @TableField(fill=FieldFill.INSERT_UPDATE) private Date updateTime;
實現元物件處理器介面
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject); } }
樂觀鎖
樂觀鎖:拿資料不會上鎖,提交時會驗證版本號,如版本號與拿到時的不匹配,則提交失敗
Mp的樂觀鎖實現原理:新增version欄位,如果資料修改,version會加一
新增欄位
@Version @TableField(fill = FieldFill.INSERT_UPDATE) private Integer version;
自動填充值
@Override public void insertFill(MetaObject metaObject) { ...... this.setFieldValByName("version", 1, metaObject); }
配置樂觀鎖外掛
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); }
測試
//樂觀鎖測試 @Test void locktest(){ User user=userMapper.selectById(7L); user.setAge(100); userMapper.updateById(user); }
邏輯刪除
邏輯刪除:通過標誌位欄位實現,刪除後資料庫還是有此條資料
新增欄位
@TableLogic @TableField(fill = FieldFill.INSERT) private Integer deleted;
自動新增初始化值
@Override public void insertFill(MetaObject metaObject) { ...... this.setFieldValByName("deleted", 0, metaObject); }
配置邏輯刪除外掛
@Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); }
測試邏輯刪除
//邏輯刪除 @Test void logicDelTest(){ userMapper.deleteById(8L); }
效能分析
效能分析是記錄每條SQL語句執行的時間,配置外掛即可完成
@Bean @Profile({"dev","test"})//設定dev,test環境開啟 public PerformanceInterceptor performanceInterceptor(){ PerformanceInterceptor performanceInterceptor=new PerformanceInterceptor(); performanceInterceptor.setMaxTime(100);//ms,超過此最大值則sql不執行 performanceInterceptor.setFormat(true); return performanceInterceptor; }