MyBatisの抽出基本クラスBaseMapper

  準備:

  1:データベーステーブル

  (TABLE `t_permission`をCREATE

  `id`はint(11)NOT NULL AUTO_INCREMENTのCOMMENT '权限ID'、

  `type`がint型(11)NOT NULL COMMENTの許可タイプ '、

  `NAME`はVARCHAR(255)NOT NULL COMMENT '特権名'

  PRIMARY KEY( `id`)

  = '許可テーブル')ENGINE = InnoDBのAUTO_INCREMENT = 24デフォルトの文字セット= UTF8コメント。

  2:エンティティクラスを準備します

  パブリッククラスTPermissionEntity {

  ステップ2次@PrimaryKey //カスタム注釈

  プライベート整数ID; //許可ID

  プライベート整数型; //パーミッション・タイプ

  プライベート文字列名; //アクセス権の名前

  //省略取得、設定方法....

  }

  ステップ1:ツールツールの作成:役割:データベースフィールドとこぶを変換します

  こぶの名前のクラス名は、その変更する必要性が存在するので、私の

  輸入java.util.regex.Matcher;

  輸入java.util.regex.Patternの。

  / *

  *変換こぶ名と名前を強調

  * /

  パブリッククラスツール{

  プライベート静的パターンラインパターン= Pattern.compile( "_(\\ w)の");

  / ** *下線ターンハンプ/

  パブリック静的文字列lineToHump(文字列str){

  STR = str.toLowerCase()。

  マッチ= linePattern.matcher(STR)。

  StringBufferのSB =新しいStringBufferを();

  一方、(matcher.find()){

  matcher.appendReplacement(SB、matcher.group(1).toUpperCase())。

  }

  matcher.appendTail(SB)。

  sb.toStringを返します();

  }

  プライベート静的パターンhumpPattern = Pattern.compile( "[AZ]");

  / **ハンプターン効率が*上記より高いアンダー/

  公共の静的な文字列humpToLine(文字列str){

  マッチマッチ= humpPattern.matcher(STR)。

  StringBufferのSB =新しいStringBufferを();

  一方、(matcher.find()){

  matcher.appendReplacement(SB、 "_" + matcher.group(0).toLowerCase())。

  }

  matcher.appendTail(SB)。

  sb.toStringを返します();

  }

  }

  各クラスのフィールドステップ2のために、2つのカスタム注釈を意味する主キーと負:

  @Target({ElementType.FIELD})

  @Retention(RetentionPolicy.RUNTIME)

  公共@interface {除外する

  }

  @Target({ElementType.FIELD})

  @Retention(RetentionPolicy.RUNTIME)

  公共@interface主キー{

  文字列値()デフォルト「」;

  }

  ステップ3:SQL動的に生成されたカスタムクラスBaseSqlProvider

  役割:動的動的SQL文を生成するために、渡されたオブジェクトに基づいてテーブル名やフィールド名を取得し、その後、実行

  @挿入、選択、@更新@、@、直接配置されたSQL文を削除して、@ InsertProvider、@ UpdateProvider、@ SelectProvider、@ DeleteProvider SQL SQL文と対応するクラスファクトリメソッドによって生成されます

  インポートをjava.lang.reflect.Field;

  輸入はjava.util.ArrayList;

  輸入はjava.util.List;

  輸入org.apache.ibatis.annotations.Options。

  輸入org.apache.ibatis.jdbc.SQL;

  輸入com.example.demo.common.utils.Tool。

  パブリッククラスBaseSqlProvider {

  @options

  パブリック文字列の追加(T豆){

  SQLのSQL =新しいSQL();

  クラスclazz = bean.getClass()。

  ストリングtableNameの= clazz.getSimpleName()。

  ストリングrealTableName = Tool.humpToLine(tableNameの).replaceAll( "_エンティティ"、 "")(1).substring。

  sql.INSERT_INTO(realTableName)。

  リストフィールド=れるGetFields(clazz);

  {(フィールドフィールドフィールド)のために

  field.setAccessible(真の);

  ストリング列= field.getName()。

  System.out.println( "欄:" + Tool.humpToLine(列));

  sql.VALUES(Tool.humpToLine(カラム)、String.Formatの( "#{" +カラム+ "jdbcType = VARCHAR}"));

  }

  sql.toStringを返します();

  }

  パブリック文字列{(T豆)を削除

  SQLのSQL =新しいSQL();

  クラスclazz = bean.getClass()。

  ストリングtableNameの= clazz.getSimpleName()。

  ストリングrealTableName = Tool.humpToLine(tableNameの).replaceAll( "_エンティティ"、 "")(1).substring。

  sql.DELETE_FROM(realTableName)。

  一覧primaryKeyField = getPrimarkKeyFields(clazz);

  (もし!primaryKeyField.isEmpty()){

  {(primaryKeyFieldフィールドpkField)のために

  pkField.setAccessible(真の);

  sql.WHERE(pkField.getName()+ "=" + String.Formatの( "#{" + pkField.getName()+ "}"));

  }

  }他{

  sql.WHERE(」1 = 2" )。

  (「主キープロパティが含まれていないオブジェクト」)新しいのRuntimeExceptionを投げます。

  }

  sql.toStringを返します();

  }

  プライベートリストgetPrimarkKeyFields(クラスclazz){

  一覧primaryKeyField =新しいArrayListを<>();

  リストフィールド=れるGetFields(clazz);

  {(フィールドフィールドフィールド)のために

  field.setAccessible(真の);

  主キーのキー= field.getAnnotation(PrimaryKey.class)。

  もし(キー!= NULL){

  primaryKeyField.add(フィールド);

  }

  }

  primaryKeyFieldを返します。

  }

  プライベートリストれるGetFields(クラスclazz){

  リストフィールドリスト=新しいArrayListを<>();

  フィールド[]フィールド= clazz.getDeclaredFields()。

  {(フィールドフィールドフィールド)のために

  field.setAccessible(真の);

  除外キー= field.getAnnotation(Exclude.class)。

  IF(キー==ヌル){

  fieldList.add(フィールド);

  }

  }

  フィールドリストを返します。

  }

  パブリック文字列GET(T豆){

  SQLのSQL =新しいSQL();

  クラスclazz = bean.getClass()。

  ストリングtableNameの= clazz.getSimpleName()。

  ストリングrealTableName = Tool.humpToLine(tableNameの).replaceAll( "_エンティティ"、 "")(1).substring。

  sql.SELECT( "*")FROM(realTableName)。

  一覧primaryKeyField = getPrimarkKeyFields(clazz);

  (もし!primaryKeyField.isEmpty()){

  {(primaryKeyFieldフィールドpkField)のために

  pkField.setAccessible(真の);

  sql.WHERE(pkField.getName()+ "=" + String.Formatの( "#{" + pkField.getName()+ "}"));

  }

  }他{

  sql.WHERE(」1 = 2" )。

  (「主キープロパティが含まれていないオブジェクト」)新しいのRuntimeExceptionを投げます。

  }

  System.out.println( "getSql:" + sql.toString());

  sql.toStringを返します();

  }

  パブリック文字列更新(T豆){

  SQLのSQL =新しいSQL();

  クラスclazz = bean.getClass()。

  ストリングtableNameの= clazz.getSimpleName()。

  ストリングrealTableName = Tool.humpToLine(tableNameの).replaceAll( "_エンティティ"、 "")(1).substring。

  sql.UPDATE(realTableName)。

  リストフィールド=れるGetFields(clazz);

  {(フィールドフィールドフィールド)のために

  field.setAccessible(真の);

  ストリング列= field.getName()。

  IF(column.equals( "ID")){

  持続する;

  }

  System.out.println(Tool.humpToLine(カラム))。

  sql.SET(Tool.humpToLine(列)+ "=" + String.Formatの( "#{" +カラム+ "jdbcType = VARCHAR}"));

  }

  一覧primaryKeyField = getPrimarkKeyFields(clazz);

  (もし!primaryKeyField.isEmpty()){

  {(primaryKeyFieldフィールドpkField)のために

  pkField.setAccessible(真の);

  sql.WHERE(pkField.getName()+ "=" + String.Formatの( "#{" + pkField.getName()+ "}"));

  }

  }他{

  sql.WHERE(」1 = 2" )。

  (「主キープロパティが含まれていないオブジェクト」)新しいのRuntimeExceptionを投げます。

  }

  System.out.println( "updateSql:" + sql.toString());

  sql.toStringを返します();

  }

  }

  ステップ4:ベースインタフェースの調製BaseMapper

  パブリックインターフェースBaseMapper {

  //データを追加

  @InsertProvider(メソッド= "追加"、タイプ= BaseSqlProvider.class)

  @options(useGeneratedKeys =真)

  公共int型の追加(T豆);

  //主キーに基づいてデータを削除

  @DeleteProvider(メソッド= "削除"、タイプ= BaseSqlProvider.class)

  公共のint(T Beanを)削除します。

  //によると、主キーのデータを取得します

  @SelectProvider(メソッド= "GET"、タイプ= BaseSqlProvider.class)

  公共Tの取得(T豆);

  //データを変更

  @UpdateProvider(メソッド= "更新"、タイプ= BaseSqlProvider.class)

  公共INTの更新(Tビーン);

  }

  説明:指定されたカスタムタイプのSQLファクトリクラス@InsertProvider注釈、メソッドはメソッドに対応するファクトリクラスで、メソッドは、SQL文の反対側を返します

  ここでは基本クラス、およびその設定が完了し、その後、使用することができます

  例:無錫婦人科病院http://www.ytsg120.cn/

  TPermissionMapperはまた、独自のユニークな方法を記述することができますが、基本的な追加/削除/変更/チェック機能TPermissionMapperインタフェースを書く、BaseMapperクラスと一般的なパラメータを渡すと、このTPermissionMapperインタフェースはすでに、BaseMapperそして、機能を拡張するためのファイルをmapper.xml

  BaseMapperを{延びTPermissionMapperパブリックインターフェース

  //リストqueryByPage();

  }

  コントローラ内のアプリケーション:

  @コントローラ

  パブリッククラスLoginController {

  @Autowired

  プライベートTPermissionMapper tPermissionMapper。

  //追加

  @ResponseBody

  @RequestMapping(値= "追加/")

  パブリック整数追加(){

  TPermissionEntity permissionEntiry =新しいTPermissionEntity();

  permissionEntiry.setName( "試験")。

  permissionEntiry.setType(3)。

  整数NUM = tPermissionMapper.add(permissionEntiry)。

  確かに返します。

  }

  //変更

  @ResponseBody

  @RequestMapping(値= "/更新")

  公共の整数更新(){

  TPermissionEntity permissionEntiry =新しいTPermissionEntity();

  permissionEntiry.setId(23)。

  permissionEntiry.setName( "試験")。

  permissionEntiry.setType(3)。

  整数NUM = tPermissionMapper.update(permissionEntiry)。

  確かに返します。

  }

  //クエリ

  @ResponseBody

  @RequestMapping(値= "/クエリ")

  公共TPermissionEntityクエリ(){

  TPermissionEntity tPermissionEntity =新しいTPermissionEntity();

  tPermissionEntity.setId(23)。

  tPermissionEntity =(TPermissionEntity)tPermissionMapper.get(tPermissionEntity)。

  tPermissionEntityを返します。

  }

  //削除

  @ResponseBody

  @RequestMapping(値= "/削除")

  パブリック整数削除(){

  TPermissionEntity permissionEntiry =新しいTPermissionEntity();

  permissionEntiry.setId(22)。

  整数NUM = tPermissionMapper.delete(permissionEntiry)。

  確かに返します。

  }


おすすめ

転載: blog.51cto.com/14335413/2425545