バックグラウンド
少し前に、私は要求に遭遇しました。要求は非常に一般的です。つまり、oracleテーブルのCRUDです。
ワークロードは少し重いです。いくつかのSQLスクリプトを指定しました。60を超えるテーブルがあり、各テーブルには通常20または30フィールド、または40または50フィールドがあります。
Mybatisが使用されます。この場合、対応するJava Beanクラスと対応するマッパーファイルをテーブルごとに作成し、関連するクエリと挿入ステートメントを提供する必要があります。
考えてみたら、強くノックすると夢中になる。
Mybatisにはリバースツールがあり、聞いたことはありますが、使用したことはありません。しかし、これらのテーブル作成ステートメントがすべて同じであることがわかったらすぐに、対応するBeanまたはマッパーに変換するための簡単なスクリプトをいくつか作成しました。
私が最近学んだことは少し深く、ブログには適していません。私が書いたスクリプトを共有するだけです。これらのSQLスクリプトをpl / sqlでエクスポートすると、基本的に次のようになります。
脚本
たとえば、これはテーブル作成ステートメントです。実際のテーブルフィールドはたくさんあります。例としていくつかのフィールドを記述しただけです。フィールド名はこのように名前が付けられ、大文字と小文字はアンダースコアで接続されています。
create table example_table (
user_name VARCHAR2(200) not null,
str1 VARCHAR2(200) not null,
str2 VARCHAR2(200) not null,
str3 VARCHAR2(200),
ONE_FLAG VARCHAR2(1) default 'N' not null,
time5 TIMESTAMP,
str6 VARCHAR2(1) default 'N' not null,
reserved1 VARCHAR2(200),
reserved2 VARCHAR2(200)
);
comment on table example_table is
'样例表';
comment on column example_table.user_name is
'名';
comment on column example_table.str1 is
'这是一个字符串1';
comment on column example_table.str2 is
'这是一个字符串2';
comment on column example_table.str3 is
'这是一个字符串3';
comment on column example_table.ONE_FLAG is
'这是一个标记字符串';
comment on column example_table.time5 is
'时间';
comment on column example_table.str6 is
'又来一个字符串';
comment on column example_table.reserved1 is
'预留字段1';
comment on column example_table.reserved2 is
'预留字段2';
以下に記述するスクリプトが配置されているディレクトリにtxtという名前のファイルを作成し、上記のテーブル作成ステートメントをそのファイルにコピーします。
JavaBeanを生成する
1. awkスクリプト(generate_bean.awk)を記述します。テーブルフィールドを変数定義構文に変換し、コメントを追加します
#! /usr/bin/awk -f
BEGIN {
i = 1;
}
{
comment="";
if ( NR != 1 && i > 0 && $1 != "(" ) {
if ( $1 == ");" ) {
i = -1;
} else {
if ( NF == 1 ) {
print "// "$1;
}
else {
"grep -A 1 comment "FILENAME" | grep -i -A 1 "$1" | grep -i -v "$1 | getline comment;
print "// "comment;
". to_lower_word.sh " $1 | getline lower_word;
print "private String "lower_word";";
}
}
i++;
}
}
実行して効果を確認できます:./ generate_bean.awk txt
その中で、to_lower_word.shはstr1_str2という名前の変数であり、次のような小さなキャメルケースに変換されます。
#! /bin/bash
echo $1 | tr [:upper:] [:lower:] | sed 's/_[a-z]\{1\}/\U&/g' | sed 's/_//g'
2.別のスクリプト(gen_ben.sh)を記述して、generate_bean.awkを呼び出し、コメント内の不純物を削除します
#! /bin/bash
sed -i 's/^$//g' txt;
if [ ! -e tmp_txt ]; then
touch tmp_txt;
fi
generate_bean.awk txt > tmp_txt;
sed "s/';//g" tmp_txt | sed "s/'//g"
rm tmp_txt
実装効果を見てみましょう。
3. IDEAを開き、新しいクラスを作成して、にコピーします。
Alt + Insertで、get、set、toStringメソッドをすばやく生成します。
ここに問題があります。急いでスクリプトを書くためには、書き込みが比較的少なく、場所によっては調整が必要です。たとえば、ここではすべてデフォルトで文字列タイプに変換され、他のタイプは変更する必要があります。手動で。
mytatisResultMapを生成する
1. awkスクリプト(generate_result.awk)を記述します。フィールドを小さなこぶに変換してから、スプライシング処理を行います。
#! /usr/bin/awk -f
BEGIN {
i = 1;
print "<resultMap type=\"\" id=\"\">";
}
{
file = FILENAME;
if ( NR != 1 && i > 0 && $1 != "(" ) {
if ( $1 == ");" ) {
i = -1;
} else {
if ( NF > 1 ) {
". to_lower_word.sh " $1 | getline lower_word;
print "\t<result column=\""$1"\"\tproperty=\""lower_word"\"/>";
}
}
i++;
}
}
END {
print "</resultMap>"
}
2.このスクリプトを呼び出す別のスクリプト(gen_result.sh)を記述します。
#! /bin/bash
generate_result.awk txt
3.効果を確認するために実行します
マッパーのxmlファイルにコピーします
selectSQLを生成します
1. awkスクリプト(generate_fields.awk)を記述して、データベーステーブルフィールドを小さなキャメルケース形式の2列のデータに変換します。最初の行はテーブル名です。
#! /usr/bin/awk -f
BEGIN {
i = 1;
}
{
if ( NR == 1 ) {
print $3;
}
if ( NR != 1 && i > 0 && $1 != "(" ) {
if ( $1 == ");" ) {
i = -1;
} else {
". to_lower_word.sh " $1 | getline lower_word;
print $1,lower_word;
}
i++;
}
}
効果を見てみましょう:
2.別のスクリプト(gen_select.sh)を記述して、これをselectsqlに接続します
#! /bin/bash
generate_fields.awk txt > fields_tmp.txt
table_name=`head -1 fields_tmp.txt`
lines=`wc -l fields_tmp.txt | awk '{print $1}'`
awk -v total=$lines 'BEGIN {print "select";}{ if (NR > 1 && NR < total && NF > 1) {print "\t"$1",";}} END {print "\t"$1;}' fields_tmp.txt;
echo "from $table_name"
echo "<where>"
awk '{if ( NR > 1 ) { print "\t""<if test=\""$2" != null and "$2" != ""\x27\x27""\">" "\n\t\t AND " $1" = #{" $2 "}" "\n\t</if>" }}' fields_tmp.txt;
echo "</where>"
rm fields_tmp.txt
3.実行中に、mapper.xmlにコピーして、効果を確認します。
その中にいくつかのフィールドがあり、必要に応じて削除する必要があり、調整を行う必要があります
挿入を生成する
1.スクリプト(gen_insert.sh)
#! /bin/bash
generate_fields.awk txt > fields_tmp.txt
table_name=`head -1 fields_tmp.txt`
lines=`wc -l fields_tmp.txt | awk '{print $1}'`
awk -v total=$lines -v table_name=$table_name 'BEGIN {print "insert into "table_name"(";}{ if (NR > 1 && NR < total && NF > 1) {print "\t"$1",";}} END {print "\t"$1")";}' fields_tmp.txt;
echo "values("
awk -v total=$lines '{if ( NR > 1 && NR < total ) { print "\t#{" $2 ", jdbcType=VARCHAR}," }} END {print "\t#{"$1 ", jdbcType=VARCHAR}"}' fields_tmp.txt;
echo ")"
rm fields_tmp.txt
2.実行し、mapper.xmlにコピーします。効果は次のとおりです。
追記
その日を今でも覚えています。正午には眠らず、このスクリプトをいじくり回す前に2時間過ごしました。
翌朝、私のクレイジーな手のスピードで、数万行のコードを送信するのに2時間半日もかかりませんでした。