準備:
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)。
確かに返します。
}