1. 程式人生 > 其它 >Python面向物件程式設計小結

Python面向物件程式設計小結

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;
    @Test
    
void 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;
    }