mybatis動的SQL実装ロジックコード詳細
2022-01-05 01:18:42
mybatisは、xmlファイル内のsqlを設定することにより、xmlのdynamicタグを解析して動的SQLを実装しています。
以下はサンプルのxmlファイルです。
<?xml version = "1.0" ? >
<!DOCTYPE script SYSTEM "script-1.0.dtd">
<script namespace="user">
<common id="commonOrder">
order by id desc
</common>
<sql id="queryUser">
select * from user
<where>
<if test='id ! = null '>
id = #{id}
</if>
<if test="names ! = null and names.size() >0">
and name in
<foreach collection="names" item="item" separator="," open="(" close=")">
${item}
</foreach>
</if>
</where>
<ref id="commonOrder"/>
</sql>
<sql id="updateUser">
update user set name = ${name}
<where>
<if test='id ! = null '>
id = #{id}
</if>
</where>
</sql>
</script>
1.xmlファイル読み込み
xmlタグの書き方ルール
<!ELEMENT script (#PCDATA | sql | common)*>
<!ATTLIST script
namespace CDATA #REQUIRED
>
<!ELEMENT sql (#PCDATA | trim | where | set | foreach | choose | if | ref)*>
<!ATTLIST sql
id CDATA #REQUIRED
>
<!ELEMENT common (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST common
id CDATA #REQUIRED
>
<!ELEMENT ref (#PCDATA)*>
<!ATTLIST ref
id CDATA #REQUIRED
>
<!ELEMENT trim (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST trim
prefixCDATA #IMPLIED
prefixOverrides CDATA #IMPLIED
suffix CDATA #IMPLIED
suffixOverrides CDATA #IMPLIED
>
<!ELEMENT where (#PCDATA | trim | where | set | foreach | choose | if | ref)*>
<!ELEMENT set (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ELEMENT foreach (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST foreach
collection CDATA #REQUIRED
item CDATA #IMPLIED
index CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
separator CDATA #IMPLIED
>
<!ELEMENT choose (when* , otherwise?)>
<!ELEMENT when (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST when
test CDATA #REQUIRED
>
<!ELEMENT otherwise (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ELEMENT if (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST if
test CDATA #REQUIRED
>
DocumentBuilderFactory は、javax.xml.parsers パッケージに含まれる、xml ファイルのパース処理を行う jdk のクラスで、抽象クラスであるためインスタンス化できません。
newInstanceでインスタンス化する必要があります。
オブジェクトをインスタンス化した後に setValidating(true) プロパティを指定する。
setNamespaceAware 無視する名前空間を設定する
xml ファイルの名前空間の定義については
https://www.jb51.net/article/219617.htm
private Document buildXml(InputStream scriptFile)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
// By default, the parser does not validate documents. Set this parameter to true to turn on validation.
factory.setValidating(true);
//whether to set namespace
factory.setNamespaceAware(false);
// Determine if comments in the file should be ignored. The default value is false.
factory.setIgnoringComments(true);
// Determines whether to ignore whitespace in element content (similar to the way browsers treat HTML). The default value is false.
factory.setIgnoringElementContentWhitespace(false);
// Determines whether the parser should convert CDATA nodes to text, and whether it should merge them with surrounding text nodes (if applicable). The default value is false.
factory.setCoalescing(false);
// Determine if external entity references should be expanded. If true, external data will be inserted into the document. Its default value is true
factory.setExpandEntityReferences(true);
DocumentBuilder builder = factory.newDocumentBuilder();
// set the validation rules file dtd file
builder.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId,
String systemId) throws SAXException, IOException {
return new InputSource(new ClassPathResource("script-1.0.dtd").getInputStream());
}
});
// Set the error parser
builder.setErrorHandler(new ErrorHandler() {
@Override
public void error(SAXParseException exception)
throws SAXException {
throw exception;
}
@Override
public void fatalError(SAXParseException exception)
throws SAXException {
throw exception;
}
@Override
public void warning(SAXParseException exception)
throws SAXException {
}
});
return builder.parse(scriptFile);
}
2.xmlファイルのパース
この記事mybatis動的SQL実装ロジックコードに導入され、より多くの関連mybatis動的SQLの内容は、スクリプトホーム以前の記事を検索してくださいまたは次の関連記事を閲覧し続けることは、将来的にスクリプトホームをよりサポートすることを願っています!.
関連
-
SQL Server 2017がサーバーに接続できない問題解決
-
リレーショナルデータベースと非リレーショナルデータベースの紹介
-
SQLスキルのデータベースは、ケースを整理する
-
SQL SERVERのコミット・トランザクションのロールバック機構
-
SQL Server のジョブが失敗しました。所有者がサーバーアクセス権を持っているかどうか判断できない
-
SQLServerのエラーです。15404, unable to get information about Windows NT group/user WIN-8IVSNAQS8T7Administrator
-
SQLにアイドルCPU条件が定義されていないため、OnIdleジョブプランが機能しない
-
SQL クエリ結果カラムのカンマ区切り文字列へのステッチング法
-
sql serverで最初の1000行のデータを削除する方法の例
-
データベース毎日練習問題、毎日少しづつ進歩(2)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQL Server テーブルパーティション削除の詳細
-
SQLインジェクションとその防止、マイベイトの基本的な役割について
-
SQL SERVERのストアドプロシージャを使用した履歴データの移行について
-
SQL Server2017では、IPをサーバー名としてサーバーに接続します。
-
SQLServerクリーンアップログファイルのメソッド事例詳細
-
SQL ServerのSELECT INTOとINSERT INTOのSELECTのケースを説明する
-
SQLの書き方--行ごとの比較
-
日付で年齢を判定するSQLサンプルコード 関数
-
SQL Serverでの判定文(IF ELSE/CASE WHEN)の使用例
-
データベース毎日練習問題、毎日少しづつ進歩(1)