【Mybatis-1】MyBatis注釈版詳細


MyBatisの注釈版
  • 1注記版基本使用
  • 1.1@Select注記
  • 1.2@Insert注記
  • 1.3@Update注記
  • 1.4@Delete注記
  • 2パラメータ転送
  • 2.1@Param注記参照
  • 2.2 Map参照
  • 2.3対象参照
  • 2.4#記号と$記号の違い
  • 3フィールドマッピング
  • 4動的SQL
  • 4.1注記を使用して実現
  • 4.2 SQLを使用してクラスを構築
  • 4.3構造化SQL

  • Java 1.5から、注釈の流行に伴い、Mybatisも注釈ベースの新しいバージョンを時代とともに発売した.
    1注記版基本使用
    pom依存とymlプロファイルおよび関連データは、前述のSpringBootシリーズ(8):MyBatisのXMLプロファイルを参照してください.注釈版とxml構成版の違いは、注釈版はxmlファイルを構成する必要がなくなり、daoレイヤインタフェースで注釈でsql文を書くだけでよいことです.
    1.1@Select注記
    @Selectは主にクエリーで使用されます.具体的には以下のとおりです.
    @Select("SELECT * FROM users")
    List<User> getUserList();
    

    1.2@Insert注記
    データベースの挿入時に使用:
    @Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(‘xiaohong’, ‘123456‘, ‘male’)")
    void addUser();
    

    1.3@Update注記
    すべての更新操作SQLで@Updateを使用できます.
    @Update("UPDATE users SET userName='xiaohong2',password=#{passWord} WHERE id = 1")
    void updateUser();
    

    1.4@Delete注記
    データ削除の処理:
    @Delete("DELETE FROM users WHERE id =1")
    void deleteUser();
    

    2パラメータ転送
    上記の例では、基本的な添削改査文を示していますが、実際のプロジェクトでは、パラメータを具体的な値に書くことはできません.これは、パラメータの伝達方法に関する問題です.パラメータが1つしかない場合は、メソッドで直接パラメータを使用し、SQLで#{sex}を使用して同名のパラメータを受信します.
    @Select("SELECT * FROM users WHERE sex = #{sex}")
    List<User> getUserList(String sex);
    

    複数のパラメータがある場合は、@Paramラベルでマッピングする必要があります.
    2.1@Param注記パラメータ
    @Select("SELECT * FROM users WHERE sex = #{sex} AND age > #{age}")
    List<User> getUsersBySex(@Param("sex") String sex,@Param("age") int age);
    

    2.2 Mapパラメータ
    パラメータが多い場合は、Mapパラメータを使用することも考えられます.
    @Select("SELECT * FROM users WHERE user_name=#{userName} AND user_sex = #{sex}")
    List<User> getUsersByNameAndSex(Map<String, Object> map);
    

    このメソッドを呼び出すと、パラメータがmapに順次追加されます.
    Map param =  new HashMap();
    param.put("userName","xiaohong");
    param.put("sex","male");
    List<User> users = userMapper.getListByNameAndSex(param);
    

    2.3対象伝達
    Insert("INSERT INTO users(userName,passWord,sex) VALUES(#{userName}, #{passWord}, #{sex})")
    void addUser(User user);
    

    実行すると、オブジェクトのプロパティが自動的に読み込まれ、同じ名前の#{xxx}に値が割り当てられます.
    2.4#記号と$記号の違い
    @Select("SELECT * FROM user WHERE user_name = #{userName}")
    User getUserByName(@Param("userName") String userName);
    
    @Select("SELECT * FROM user WHERE user_name = '${userName}'")
    User getUserByName(@Param("userName") String userName);
    

    この例では、#がSQLを前処理し、$を使用するとSQLに直接値が接続されることがわかります.$を使用するとSQL注入のリスクがありますが、ライブラリテーブル名をパラメータ化する必要がある場合は$を使用します.
    3フィールドマッピング
    実際のプロジェクトでは、Mysqlネーミング仕様とJavaの相違によるデータベースフィールド名がJavaエンティティクラス変数名と一致しないことがよくあります.これは前文で,解決策について述べた.では、注釈版ではどのようにこの問題を解決しますか?Mybatisは2つの注釈を提供しています:@Resultsと@Result注釈、この2つの注釈は組み合わせて使用して、主な役割はデータベースの中でクエリーした数値を具体的なフィールドに変換して、戻ってきた結果セットを修飾して、関連するエンティティクラスの属性とデータベースのフィールドは1つ1つ対応して、エンティティクラスの属性とデータベースの属性名が一致している場合、この属性を修飾する必要はありません.例は次のとおりです.
    @Select("SELECT * FROM users")
    @Results({
         
        @Result(property = "sex",  column = "sex", javaType = UserSexEnum.class),
        @Result(property = "userName", column = "user_name")
    })
    List<User> getUserList();
    

    4動的SQL
    MyBatisはダイナミックSQLを柔軟にサポートすることができ、前述のxml構成版では詳細に説明されていますが、これに対応して、注釈版ではMybatisがサポートする2つの方法を提供しています.1つ目は注釈を使用して実現することであり、もう1つはSQLクラスをサポートすることです.
    4.1注釈による実装
    scriptタグで囲み、XML構文のように書きます.
    @Update("<script>
      update users
        <set>
          <if test="userName != null">user_name=#{
         userName},</if>
          <if test="sex!= null">sex=#{
         sex},</if>
        </set>
      where id=#{
         id}
    </script>")
    void update(User user);
    

    この方式は注釈+XMLの混合使用方式であり、XMLが柔軟で注釈の便利さもあるが、JavaコードにXML文法をつづる必要があるという欠点もあるため、MyBatisは動的なSQL構築をサポートするためにより優雅な使用方式を提供している.
    4.2 SQLを使用したクラスの構築
    UserSqlには、StringBufferを使用してSQLを結合し、if判定によってSQLを動的に構築する方法getListがあり、最後に実行する必要があるSQL文を返す方法があることがわかります.
    public class UserSql {
         
        public String getUserList(User user) {
         
            StringBuffer sql = new StringBuffer("select id, user_name, password, sex, nick_name as nickName");
            sql.append(" from users where 1=1 ");
            if (userParam != null) {
         
                if (StringUtils.isNotBlank(user.getUserName())) {
         
                    sql.append(" and user_name = #{userName}");
                }
                if (StringUtils.isNotBlank(user.getSex())) {
         
                    sql.append(" and sex = #{sex}");
                }
            }
            sql.append(" order by id desc");
            sql.append(" limit " + user.getBeginLine() + "," + user.getPageSize());
            log.info("getList sql is :" +sql.toString());
            return sql.toString();
        }
    }
    

    次に,このクラスとメソッドをMapperに導入するだけでよい.
    @SelectProvider(type = UserSql.class, method = "getUserList")
    List<UserEntity> getList(User user);
    

    2つのパラメータ:
  • type:SQLのクラスを動的に生成
  • method:クラス内の具体的なメソッド名
  • 4.3構造化SQL
    public String getCount(UserParam userParam) {
         
       String sql= new SQL(){
         {
         
            SELECT("count(1)");
            FROM("users");
            if (StringUtils.isNotBlank(userParam.getUserName())) {
         
                WHERE("userName = #{userName}");
            }
            if (StringUtils.isNotBlank(userParam.getUserSex())) {
         
                WHERE("user_sex = #{userSex}");
            }
            //    toString     ,         StringBuilder    SQL   
        }}.toString();
    
        log.info("getCount sql is :" +sql);
        return sql;
    }
    
  • SELECTは検索するフィールドを表し、複数の行を書くことができ、複数の行のSELECTはスマートに統合され、重複しない.
  • FROMとWHEREはSELECTと同様に、複数のパラメータを書くことも、複数行で繰り返し使用することもでき、最終的にはスマートに統合され、エラーを報告することはありません.このような文は、長いSQLを書くのに適しており、SQLの構造が明確で、メンテナンスが容易で、可読性が高いことを保証することができます.