SpringBootにMybatis-plusを統合【超詳細版】

目次

はじめに

1. Mybatis-plusとは何ですか?

2. 特徴

2. SpringBoot と Mybatis-plus の統合の紹介デモ

1.ポンを導入する

2.application.ymlの設定

3. メインスタートアップクラス

 4. テスト

エンティティレイヤー

マッパーレイヤー

サービス層とServiceImpl層

コントローラーのテスト

3. Mybatis プラスのコア アノテーション

@テーブル名

@テーブルID

@TableField

@KeySequence  

 4. Mybatis-Plus ページング プラグイン

1. 構成設定

2. ページングの使用

2.1. mybaits-plus に付属するページングクエリ

2.2. カスタマイズされたページング

2.2.1. カスタムマッパーインターフェイス

2.2.2. サービスはカスタムページングを実装します

5. Mybatis プラス リバース エンジニアリング


はじめに

1. Mybatis-plusとは何ですか?

Mybatis-Plus (略して MP) は、Mybatis の拡張ツールです。Mybatis を拡張するだけで、変更はしません。MyBatis-Plus は、すべての Mybatis ネイティブ機能をサポートしているため、Mybatis-Plus を導入しても、既存の Mybatis には影響しません。フレームには影響がありません。MyBatis は、CRUD 操作を簡素化するために強化されたツールキットです。XML 構成のロードを開始するときに単一テーブル SQL 操作を挿入します。これは、開発作業を簡素化し、生産性を向上させるように設計されています。

公式サイト: https: //baomidou.com

2. 特徴

  • 非侵入型: 機能強化のみで変更は行われません。導入は既存のプロジェクトに影響を与えず、シルクのようにスムーズです。
  • 低損失: 基本的な CURD は起動時に自動的に挿入され、基本的にパフォーマンスの損失はなく、直接オブジェクト指向の操作が行われます。
  • 強力な CRUD 操作: 組み込みの一般的なマッパーと一般的なサービス。単一テーブル上のほとんどの CRUD 操作は、わずかな構成だけで実現できます。また、さまざまな使用ニーズを満たすための強力な条件付きコンストラクターもあります。
  • Lambda フォーム呼び出しのサポート: Lambda 式を使用すると、フィールドの入力ミスを心配することなく、さまざまなクエリ条件を簡単に作成できます。
  • 主キーの自動生成をサポート: 最大 4 つの主キー戦略 (分散固有 ID ジェネレーター - シーケンスを含む) をサポートし、主キーの問題を完全に解決するために自由に構成できます。
  • ActiveRecord モードのサポート: ActiveRecord フォーム呼び出しをサポートします。エンティティ クラスは Model クラスを継承するだけで強力な CRUD 操作を実行できます。
  • カスタムのグローバル ユニバーサル オペレーションをサポート: グローバル ユニバーサル メソッド インジェクションをサポート (一度書いたらどこでも使用可能)
  • 組み込みのコード ジェネレーター: コードまたは Maven プラグインを使用して、マッパー、モデル、サービス、およびコントローラー層のコードを迅速に生成します。テンプレート エンジンをサポートしており、使用するのを待っている多くのカスタム構成が用意されています。
  • 組み込みのページング プラグイン: MyBatis の物理ページングに基づいており、開発者は特定の操作を気にする必要はありません。プラグインの設定後、ページングの記述は通常のリスト クエリと同等です。
  • ページング プラグインはさまざまなデータベースをサポートします。MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer およびその他のデータベースをサポートします。
  • 組み込みのパフォーマンス分析プラグイン: SQL ステートメントとその実行時間を出力できます。遅いクエリを迅速に特定するために、開発およびテスト中にこの機能を有効にすることをお勧めします。
  •  組み込みのグローバル インターセプト プラグイン: テーブル全体の削除および更新操作のインテリジェントな分析とブロックを提供し、誤操作を防ぐためにインターセプト ルールをカスタマイズすることもできます。

2. SpringBoot と Mybatis-plus の統合の紹介デモ

「依存関係」>「構成」>「コード」

1.ポンを導入する

<!--        引入mybatisPlus 包含了 jdbc -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
<!--        mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--        引入durid數據源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.18</version>
        </dependency>

 

2.application.ymlの設定

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #日志
    map-underscore-to-camel-case: true  #开启驼峰命名
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    username: 自己的用户名
    password: 自己的密码
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost/cardmanager

3. メインスタートアップクラス

@SpringBootApplication
//注意:扫描包路径必须要精确到Mapper包,否则报异常
@MapperScan(basePackages = "扫描自己的mapper路径")
public class SpringBootThree {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootThree.class,args);
    }
}

 4. テスト

エンティティレイヤー


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

    private String name;

    private String password;

    private String username;

    public User() {
    }

    public User(Long id, String name, String password, String username) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.username = username;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", username='" + username + '\'' +
                '}';
    }
}

マッパーレイヤー

BaseMapper<T> は mybatis-plus によって設計されたインターフェイスで、単一テーブルの CRUD が含まれており、非常に使いやすいです。

<T> はエンティティ クラスを表します

@Repository
public interface UserMapper  extends BaseMapper<User>{

}

サービス層とServiceImpl層

IService<T> と ServiceIMpl<M は BaseMapper<T>,T> を拡張したもので、BaseMapper をさらにカプセル化したもので、一般に使用されることはほとんどありません。でもとても便利です。

public interface UserService extends IService<User>{

}

 


//impl层
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    UserMapper userMapper;

}

コントローラーのテスト


@Controller

public class UserController {

 @Autowired
    UserService userService;

@RequestMapping("/test")
    public String TestUser(@RequestParam("id") Long id){

     
        User user = userService.getById(id);
           System.out.print(user)

    }
}

良い!上記は、Myabtisplus を統合する SpringBoot の小さな導入ケースです。次はメイン部分です

3. Mybatis プラスのコア アノテーション

@テーブル名

  • 説明: テーブル名のアノテーション。エンティティ クラスに対応するテーブルを識別します。
  • 使用する場所: エンティティクラス
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    private String password;

    private String username;
}
属性 説明する
価値 テーブル名
グローバルプレフィックスを保持する グローバル tablePrefix 値を使用し続けるかどうか (グローバル tablePrefix が有効な場合)
結果マップ XML 内の resultMap の ID (特定の種類のエンティティ クラス オブジェクト バインディングを満たすために使用されます)

上記の属性のうち、一般的に使用されるのはvalueだけです。他の属性も見てください。

@テーブルID

  • 説明: 主キーのアノテーション
  • 使用する場所: エンティティクラスの主キーフィールド
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    private String password;

    private String username;
}
属性 デフォルト値 説明する
価値 「」 主キーフィールド名
タイプ IdType.NONE 主キーのタイプを設定する

IDタイプ    

  通常、データベースは自動的にインクリメントされるか、主キー ID が自分で設定されます。

価値 説明する
オート データベースIDの自動インクリメント
なし ステートレス。この型には主キー セットがありません (注釈はグローバルに続くことに相当し、グローバル Rio は INPUT にほぼ等しい)。
ASSIGN_ID ID を割り当てます (主キーのタイプは数値 (長整数および整数) または文字列です) (3.3.0 以降)、インターフェイス メソッドを使用しますIdentifierGenerator(nextIdデフォルトの実装クラスはDefaultIdentifierGeneratorSnowflake アルゴリズムです)
ASSIGN_UUID UUID を割り当て、主キーのタイプは String (3.3.0 以降)、インターフェイスIdentifierGeneratorメソッドを使用しますnextUUID(デフォルトのデフォルト メソッド)。

@TableField

  • 説明: フィールドの注釈 (非主キー)
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    @TableField("t_name")
    private String name;

    @TableField("t_pwd")
    private String password;

     @TableField("t_username")
    private String username;
        
//表示是否为数据库字段,在进行mybatis-plus封装的CRUD时,不会携带这个字段进行数据库的查询
    @TableField(exist=false)
       //自定义类型
        private Dept dept;
}
属性 デフォルト値 説明する
価値 「」 データベースフィールド名
存在する 真実 データベーステーブルのフィールドかどうか
状態 「」 フィールド where エンティティ クエリの比較条件。値が設定されている場合は、設定された値が優先されます。設定されていない場合は、デフォルトでグローバルになります。 %s=#{%s}
アップデート 「」 フィールド update set 部分インジェクションの例:update="%s+1" 更新を示す ためにバージョン フィールドに注釈を付ける場合 (この属性は 属性set version=version+1 よりも優先されます )el

上記の表のうち、最も一般的に使用されるのは最初の 2 つだけであり、その他は参照するだけで、通常は使用しません。

@KeySequence  

  • 説明: シーケンス主キー戦略 oracle
  • 属性:value、dbType
属性 デフォルト値 説明する
価値 「」 シーケンス名
データベースタイプ データベースタイプ データベース タイプ。構成されていない場合、デフォルトの実装は IKeyGenerator を挿入します。複数の実装を指定する必要があります。

上記は最も一般的に使用される注釈です。さらに詳しく知りたい場合は、公式 Web サイトのアドレスにアクセスしてください: Annotations | MyBatis-Plus (baomidou.com)

 4. Mybatis-Plus ページング プラグイン

1. 構成設定

mybatis-plus ページングを使用する場合は、config を構成する必要があります。構成しない場合、ページング プラグインは有効になりません。

@Configuration
public class MyBaitsPlusConfig {

        //配置分页插件
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            //数据库类型是MySql,因此参数填写DbType.MYSQL
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
            return interceptor;
        }
}

2. ページングの使用

2.1. mybaits-plus に付属するページングクエリ

@Service
public class UserServiceImpl extends UserImpl<UserMapper,User> implements UserService {
    @Autowired
    UserMapper userMapper;

    @Override
    public Page<User> memberList(Integer pageNum, User user) {
        /**
            在查询之前实例化Page<T>(当前页,每页显示的个数) 
            page实体类创建完成之后,会将你查询出来的结果封装到里边的records属性中
                使用getRecords()方法调用
           */
        Page<User> page = new Page<>(pageNum,5);

            //mybatis-plus自带的单表分页查询
            /**

            selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)
                参数1:一个分页对象
                参数2:表示分页查询的条件,如果没有可以为null
        */
         userMapper.selectPage(page, null);

        /**-------带条件的分页查询-----
         QueryWrapper<User> queryWrapper =   new QueryWrapper<User>();
                queryWrapper.eq("数据库字段名称",对应传过来的实体类字段名称) //精准查询
                                //模糊查询
                            .like("数据库字段名称",对应传过来的实体类字段名称);
          userMapper.selectPage(page, queryWrapper);

            */
        return page;
    }
}

2.2. カスタマイズされたページング

ページングをカスタマイズするときは、接続されたテーブルのクエリを実行する必要があるため、現時点ではページングを自分でカスタマイズする必要があります。

2.2.1. カスタムマッパーインターフェイス

@Repository
public interface UserMapper extends BaseMapper<User> {
    //注意分页参数的分页,一定要在第一个参数
    Page<User> userList(IPage<User> page, @Param("user")User user);
}

//对应的xml文件自己写

2.2.2. サービスはカスタムページングを実装します

@Service
public class UserServiceImpl extends UserImpl<UserMapper,User> implements UserService {
    @Autowired
    UserMapper userMapper;

    @Override
    public Page<User> memberList(Integer pageNum, User user) {
        /**
            在查询之前实例化Page<T>(当前页,每页显示的个数) 
            page实体类创建完成之后,会将你查询出来的结果封装到里边的records属性中
                使用getRecords()方法调用
           */
        Page<User> page = new Page<>(pageNum,5);

         memberBrMapper.memberList(page, user);
        return page;
    }
}

5. Mybatis プラス リバース エンジニアリング

#联合mybatisplus使用
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>
public class FastAutoGeneratorTest {
public static void main(String[] args){

    FastAutoGenerator.create("jdbc:mysql://localhost:3306/自己的表名", 用户名, 密码)
            .globalConfig(builder -> {
                builder.author("wdc") // 设置作者
//                        .enableSwagger() // 开启 swagger 模式
                        .fileOverride() // 覆盖已生成文件
                        
                        .outputDir("D://springbootcards"); // 指定输出目录
            })

            .packageConfig(builder -> {
                builder.parent("com.atdession") // 设置父包名
                        .moduleName("springbootcards") // 设置父包模块名
                            .entity("entity") //都是设置名称的
                            .service("service")
                            .serviceImpl("service.impl")
                            .controller("controller")
                            .mapper("mapper")
                            .xml("mapper")
                        .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://springbootcards")); // 设置mapperXml生成路径
            })
            .strategyConfig(builder -> {
                builder.addInclude("user","dept"); // 设置需要生成的表名
                     .serviceBuilder().formatServiceFileName("%sService");//设置去掉Service的前缀I
//                        .addTablePrefix("t_", "c_"); // 设置过滤表前缀
            })
            .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
            .execute();
}
}

 

おすすめ

転載: blog.csdn.net/wang20000102/article/details/132615071