【Mybatis-1】MyBatis注釈版詳細
22292 ワード
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は主にクエリーで使用されます.具体的には以下のとおりです.
1.2@Insert注記
データベースの挿入時に使用:
1.3@Update注記
すべての更新操作SQLで@Updateを使用できます.
1.4@Delete注記
データ削除の処理:
2パラメータ転送
上記の例では、基本的な添削改査文を示していますが、実際のプロジェクトでは、パラメータを具体的な値に書くことはできません.これは、パラメータの伝達方法に関する問題です.パラメータが1つしかない場合は、メソッドで直接パラメータを使用し、SQLで#{sex}を使用して同名のパラメータを受信します.
複数のパラメータがある場合は、@Paramラベルでマッピングする必要があります.
2.1@Param注記パラメータ
2.2 Mapパラメータ
パラメータが多い場合は、Mapパラメータを使用することも考えられます.
このメソッドを呼び出すと、パラメータがmapに順次追加されます.
2.3対象伝達
実行すると、オブジェクトのプロパティが自動的に読み込まれ、同じ名前の#{xxx}に値が割り当てられます.
2.4#記号と$記号の違い
この例では、#がSQLを前処理し、$を使用するとSQLに直接値が接続されることがわかります.$を使用するとSQL注入のリスクがありますが、ライブラリテーブル名をパラメータ化する必要がある場合は$を使用します.
3フィールドマッピング
実際のプロジェクトでは、Mysqlネーミング仕様とJavaの相違によるデータベースフィールド名がJavaエンティティクラス変数名と一致しないことがよくあります.これは前文で,解決策について述べた.では、注釈版ではどのようにこの問題を解決しますか?Mybatisは2つの注釈を提供しています:@Resultsと@Result注釈、この2つの注釈は組み合わせて使用して、主な役割はデータベースの中でクエリーした数値を具体的なフィールドに変換して、戻ってきた結果セットを修飾して、関連するエンティティクラスの属性とデータベースのフィールドは1つ1つ対応して、エンティティクラスの属性とデータベースの属性名が一致している場合、この属性を修飾する必要はありません.例は次のとおりです.
4動的SQL
MyBatisはダイナミックSQLを柔軟にサポートすることができ、前述のxml構成版では詳細に説明されていますが、これに対応して、注釈版ではMybatisがサポートする2つの方法を提供しています.1つ目は注釈を使用して実現することであり、もう1つはSQLクラスをサポートすることです.
4.1注釈による実装
scriptタグで囲み、XML構文のように書きます.
この方式は注釈+XMLの混合使用方式であり、XMLが柔軟で注釈の便利さもあるが、JavaコードにXML文法をつづる必要があるという欠点もあるため、MyBatisは動的なSQL構築をサポートするためにより優雅な使用方式を提供している.
4.2 SQLを使用したクラスの構築
UserSqlには、StringBufferを使用してSQLを結合し、if判定によってSQLを動的に構築する方法getListがあり、最後に実行する必要があるSQL文を返す方法があることがわかります.
次に,このクラスとメソッドをMapperに導入するだけでよい.
2つのパラメータ:type:SQLのクラスを動的に生成 method:クラス内の具体的なメソッド名 4.3構造化SQLSELECTは検索するフィールドを表し、複数の行を書くことができ、複数の行のSELECTはスマートに統合され、重複しない. FROMとWHEREはSELECTと同様に、複数のパラメータを書くことも、複数行で繰り返し使用することもでき、最終的にはスマートに統合され、エラーを報告することはありません.このような文は、長いSQLを書くのに適しており、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つのパラメータ:
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;
}