MybatisPlusの使用

Mybatisplus

依存関係をインポートする

<dependencies>
    <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>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>

    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!--lombok用来简化实体类-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

**注:**導入MyBatis-Plusしなくても後で再導入してくださいMyBatisにもMyBatis-Springよるのバージョンの違いに起因する問題を回避するために、。

構成ファイルの変更

application.properties構成追加MySQLデータベース構成ファイル:

mysql5

#mysqlデータベース接続

spring.datasource.driver-class-name = com.mysql.jdbc.Driver

spring.datasource.url = jdbc:mysql:// localhost:3306 / mybatis_plus

mysql8以降(Spring Boot 2.1)

**注:**ドライバーとURLの変更

spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver

spring.datasource.url = jdbc:mysql:// localhost:3306 / mybatis_plus?serverTimezone = GMT%2B8

注意:

1.ここのURLはサフィックス?serverTimezone = GMT%2B8を使用します。SpringBoot2.1は8.0バージョンのjdbcドライバーを統合するため、このバージョンのjdbcドライバーはこのサフィックスを追加する必要があります。そうしないと、テストケースを実行すると次のエラーが報告されます。 :

java.sql.SQLException:サーバーのタイムゾーン値 'Öйú±ê׼ʱ¼ä'が認識されないか、より多くを表します

2.ここでのdriver-class-nameはcom.mysql.cj.jdbc.Driverを使用します。このドライバーはjdbc8で使用することをお勧めします。以前のcom.mysql.jdbc.Driverは非推奨になりました。それ以外の場合は、次の場合に使用されます。テストケースの実行警告情報があります

[外部リンクの画像転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-K5986CNT-1611036596455)(C:\ Users \王东梁\ AppData \ Roaming \ Typora \ typora-user-images \ image-20210118190725238.png)]

使用説明書

1.依存関係をインポートします

2.データベース接続構成を記述します

3. BaseMapperから継承するマッパーを作成し、@ Repositoryを追加してSpringコンテナに認識させます

4.メインのスタートアップクラスがスキャンされます@MapperScan( "com.atguigu.mpdemo1010.mapper")

主キー戦略

[外部リンクの画像転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-dUyIgHO6-1611036596458)(C:\ Users \王东梁\ AppData \ Roaming \ Typora \ typora-user-images \ image-20210118191602545.png)]

1.データベースの自己増加シーケンスまたはフィールド

2.UUID

3.UUIDのバリアント

ODX} _8Z)C

4.RedisはIDを生成します

データベースを使用してIDのパフォーマンスを生成するだけでは不十分な場合は、Redisを使用してIDを生成してみてください。これは主にRedisがシングルスレッドであることに依存しているため、グローバルに一意のIDを生成するためにも使用できます。これは、Redisのアトミック操作INCRおよびINCRBYで実現できます。

Redisクラスターを使用してスループットを高めることができます。クラスター内に5つのRedisがあるとします。各Redisの値を1、2、3、4、5に初期化すると、ステップサイズは5になります。各Redisによって生成されるIDは次のとおりです。

A:1,6,11,16,21

B:2,7,12,17,22

C:3,8,13,18,23

D:4,9,14,19,24

E:5、10、15、20、25

5. Twitterのスノーフレークアルゴリズム(スノーフレークアルゴリズム)

SnowflakeはTwitterのオープンソースの分散ID生成アルゴリズムであり、その結果、長いIDが生成されます。核となるアイデアは、ミリ秒数として41ビット、マシンIDとして10ビット(5ビットはデータセンター、マシンIDの5ビット)、ミリ秒以内のシリアル番号として12ビットを使用することです(つまり、各ノードはミリ秒4096ID)であり、最後に符号ビットがあり、常に0です。

6.飼育係を使用して一意のIDを生成します

主キーは数字と文字列です

@TableId(type = IdType.ID_WORKER) //mp自带策略,生成19位值,数字类型使用这种策略,比如long
//@TableId(type = IdType.ID_WORKER_STR) //mp自带策略,生成19位值,字符串类型使用这种策略

時間自動入力

最初の一歩

エンティティクラスに注釈を追加する

//create_time
@TableField(fill = FieldFill.INSERT)
private Date createTime;

//update_time
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

第二段階

[外部リンクの画像転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-KBk013TR-1611036596461)(C:\ Users \王东梁\ AppData \ Roaming \ Typora \ typora-user-images \ image-20210118200532206.png)]

クラスを作成し、インターフェイスMetaObjectHandlerを実装し、インターフェイスにメソッドを実装します

package com.atguigu.mpdemo1010.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    
    

    //使用mp实现添加操作,这个方法执行
    @Override
    public void insertFill(MetaObject metaObject) {
    
    
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);

        this.setFieldValByName("version",1,metaObject);
    }

    //使用mp实现修改操作,这个方法执行
    @Override
    public void updateFill(MetaObject metaObject) {
    
    
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

データベースVSエンティティクラスのフィールド

データベース内:create_time

エンティティクラス:creanteTime

楽観的ロック

バージョンは、時間と同じ時間で自動的に入力されるか、データベースにデフォルト値が設定されます

最初の一歩

@Version
private Integer version;//版本号

第二段階

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-crGLmfQE-1611036596466)(C:\ Users \王东梁\ AppData \ Roaming \ Typora \ typora-user-images \ image-20210118212859965.png)]

構成クラスをカスタマイズして、楽観的ロックプラグインを追加します

//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    
    
    return new OptimisticLockerInterceptor();
}

そして、mapperscanをスタートアップクラスから構成クラスに取得します

注:楽観的ロックを最初にチェックしてから変更する必要があります。そうしないと、楽観的ロックは無効になります

ページネーション

最初の一歩

ページングプラグインを構成する

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-N0ZReWsf-1611036596469)(C:\ Users \王东梁\ AppData \ Roaming \ Typora \ typora-user-images \ image-20210118214406225.png)]

/**
 * 分页插件
 */
@Bean
public PaginationInterceptor paginationInterceptor() {
    
    
    return new PaginationInterceptor();
}

コードを書く

@Test
public void testPage() {
    
    
    //1 创建page对象
    //传入两个参数:当前页 和 每页显示记录数
    Page<User> page = new Page<>(1,3);
    //调用mp分页查询的方法
    //调用mp分页查询过程中,底层封装
    //把分页所有数据封装到page对象里面
    userMapper.selectPage(page,null);

    //通过page对象获取分页数据
    System.out.println(page.getCurrent());//当前页
    System.out.println(page.getRecords());//每页数据list集合
    System.out.println(page.getSize());//每页显示记录数
    System.out.println(page.getTotal()); //总记录数
    System.out.println(page.getPages()); //总页数

    System.out.println(page.hasNext()); //下一页
    System.out.println(page.hasPrevious()); //上一页

}

トゥームストーン

最初の一歩

@TableLogic
private Integer deleted;

第二段階

application.propertiesで構成します(1は削除された状態、0は削除されていない状態です)(デフォルトの構成を変更する必要はありません)

上記のように構成クラスでプラグインを構成します

//逻辑删除插件
@Bean
public ISqlInjector sqlInjector() {
    
    
    return new LogicSqlInjector();
}

注意:

論理的削除を追加した後、クエリおよびその他の操作は自動的にスプライシングされますdeleted = 0スプライシングのために

[外部リンクの画像転送に失敗しました。ソースサイトにアンチホットリンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-3oO2CCa​​4-1611036596470)(C:\ Users \王东梁\ AppData \ Roaming \ Typora \ typora-user-images \ image-20210118215717249.png)]

パフォーマンス分析プラグイン

遅いSQLを見つける

最初の一歩

上記と同じ構成の構成クラス

/**
 * SQL 执行性能分析插件
 * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
 *
 * 三种环境
 *      * dev:开发环境
 *      * test:测试环境
 *      * prod:生产环境
 */
@Bean
@Profile({
    
    "dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
    
    
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(500);//ms,超过此处设置的ms则sql不执行
    performanceInterceptor.setFormat(true);
    return performanceInterceptor;
}

第二段階

application.propertiesでの構成

#环境设置:dev、test、prod
spring.profiles.active=dev

条件付きクエリラッパー

通常、querywrapperを使用します(より強力です)

[外部リンクの画像転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-6CmwEtTX-1611036596471)(C:\ Users \王东梁\ AppData \ Roaming \ Typora \ typora-user-images \ image-20210118220450433.png)]

    public void testSelectQuery() {
    
    
        //创建QueryWrapper对象
        QueryWrapper<User> wrapper = new QueryWrapper<>();

        //通过QueryWrapper设置条件
        //ge、gt、le、lt
        //查询age>=30记录
        //第一个参数字段名称,第二个参数设置值
//        wrapper.ge("age",30);

        //eq、ne
        //wrapper.eq("name","lilei");
        //wrapper.ne("name","lilei");

        //between
        //查询年龄 20-30
        // wrapper.between("age",20,30);

        //like
        //wrapper.like("name","岳");

        //orderByDesc
        // wrapper.orderByDesc("id");

        //last,在最后拼上
        //wrapper.last("limit 1");

        //指定要查询的列
        wrapper.select("id","name");

        List<User> users = userMapper.selectList(wrapper);
        System.out.println(users);

    }

おすすめ

転載: blog.csdn.net/qq_45783660/article/details/112825766