lastInfdexOf 関数の MySQL 実装例

lastInfdexOf 関数の MySQL 実装例

MySQL では lastIndexOf に似た関数を使用する必要がある場合もありますが、すぐに使用できる既製の関数は用意されていないため、自分で見つけ出す必要があります。

まず、MySQL は次の 3 つの機能を提供します。

instr(str:varchar, substr:varchar): str# 内の subsrtr の最初の出現を返します。例: 文字列 ab/cd/abc.html 内の b の最初の出現を検索します。select instr('ab/cd/abc.html', 'b');
# プログラマーが考えているのとは異なり、上記の結果は 2 です (添え字は 1 から始まりますので注意してください)

逆(str:varchar): 文字列を先頭から末尾まで反転し、abcを入力してcbaを出力します。

length(str:varcha): 文字列の長さを返します

上記の情報を知った後、ほとんどの人は lastInfdexOf 関数の実装方法を知っていると思います。

直接与える:

select length('入力文字列') - instr(reverse('入力文字列'), '検索する文字列');
# 例: 文字列 'ab/cd/abc.html' 内の '/' の最後の位置を検索します。結果は次のとおりです: 5
length('ab/cd/abc.html') - instr(reverse('ab/cd/abc.html'), '/') を選択します。

最後に、最近私が遭遇した小さな要件を以下に示します。

データベース フィールドの値 (値は ab/cd/abc.html などのファイルのパス名) を取得し、ファイル名 (abc.html) を解析する SQL スクリプトを記述します。

右から選択(CONTENT_NAME, instr(reverse(CONTENT_NAME), '/') - 1) FILE_NAME
config_template_contentから
where lower(CONTENT_NAME) like '%/%.html';
# データに / が含まれている場合はこれで十分です。フィールド値が abcde.html の場合は判断が必要です〜

上記は正しい機能の使い方です。その有用性はご自身で探して(体験して)みてください。

補足: mysql の SELECT LAST_INSERT_ID() ステートメントの使用時に発生する問題

序文:

主キーが自動増分であるデータベース テーブル (ユーザー テーブルなど) にレコードを挿入する場合、書き込まれたばかりのレコードの ID を取得することが期待されます (シナリオによっては、他の操作を実行するためにこの ID を取得する必要があるため)。この時点で、SELECT LAST_INSERT_ID() ステートメントを使用して、レコードが挿入された後に返される自動増分 ID の値を取得する必要があります。

例:

 /**
 * 苦情情報を挿入 * @param complaintInfoModel
 * @戻る
 */
 @InsertProvider(タイプ = ComplaintInfoDao.ComplaintProviderSql.class、メソッド = "insertComplaintInfo")
 @SelectKey(ステートメント="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=Integer.class)
 Integer insertComplaintInfo(ComplaintInfoModel complaintInfoModel); // データを挿入し、変更されたデータベースエントリの数を返します

Mybatis の SelectKey は、データ挿入時に主キーが自動的に生成されない問題を解決するためのものです。主キーの生成方法を任意に設定できます。しかし、SelectKey がどれだけ優れていても、このような状況に遭遇しないようにしてください。結局のところ、非常に面倒です。

selectKey 属性

財産説明する
キープロパティselectKey ステートメントの結果を設定するターゲット プロパティ。
結果タイプ

結果のタイプ。

MyBatis は通常それを理解できますが、書くことも問題ありません。 MyBatis では、文字列を含む任意の単純な型を主キー型として使用できます。

注文

これは BEFORE または AFTER に設定できます。

BEFORE に設定すると、最初に主キーを選択し、keyProperty を設定してから、挿入ステートメントを実行します。

AFTER に設定すると、挿入ステートメントが最初に実行され、その後に selectKey 要素が実行されます。これは、シーケンス呼び出しを挿入ステートメントに埋め込むことができる Oracle などのデータベースに似ています。

ステートメントタイプ

これまでと同様に、MyBatis は STATEMENT、PREPARED、CALLABLE ステートメントのマッピング タイプをサポートしています。

それぞれ PreparedStatement および CallableStatement タイプを表します。

----1. SelectKeyは順序属性に注意する必要があります。

MySQL などの自動拡張をサポートするデータベースでは、正しい値を取得するために order を after に設定する必要があります。

Oracle のようなシーケンスを取得する場合は、before に設定する必要があります。そうしないと、エラーが報告されます。

-----2. さらに、Springを使用してトランザクションを管理する場合、

SelectKey と insert は同じトランザクション内にあるため、この場合、データがデータベースに挿入されないため、Mysql は自動的に増加されたキーを取得できません。

トランザクション管理をキャンセルすれば問題は発生しません。

以下は XML と注釈の例です。SelectKey は非常に単純なので、次の 2 つの例で十分です。

<挿入id="挿入" パラメータタイプ="マップ"> 
 テーブル1 (名前) の値 (#{名前}) に挿入します 
 <selectKey 結果タイプ="java.lang.Integer" キープロパティ="id"> 
  コールID() 
 </selectKey> 
 </挿入>

上記の xml の入力パラメータは map であり、selectKey は結果を入力パラメータ map に格納します。 POJO でも状況は同じですが、注意すべき点が 1 つあります。keyProperty に対応するフィールドには、POJO 内に対応する setter メソッドが必要であり、setter のパラメーター型が一貫している必要があります。そうでない場合は、エラーが報告されます。

@Insert("table2 (name) の値(#{name}) に挿入") 
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class) 
int insertTable2(名前 name);

上記は注釈の形式です。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Mysql マスタースレーブ同期 Last_IO_Errno:1236 エラー解決
  • MySQLとElasticsearch間のデータ非対称性問題の解決策
  • MySQL レプリケーション エラー Last_SQL_Errno:1146 の解決方法
  • Mysql の LAST_INSERT_ID() 関数の使用に関する詳細な説明

<<:  ウェブページ作成時のHTMLタグの使用に注意してください

>>:  Dockerネットワーク作成に--subnetを追加した後の問題を解決する

推薦する

Vue 監視プロパティと計算プロパティ

目次1. 監視プロパティを監視する1. ショッピングカート2. すべて選択し、すべて選択解除する2....

iframe パラメータの説明と例

<iframe src=”test.jsp” width=”100″ height=”50″ ...

HTMLページでチェックボックスを操作する方法

チェックボックスは Web ページで非常によく使用されます。e コマースの Web サイトでもプラッ...

Vueは3階層メニューを再帰的に実装する

この記事の例では、3階層メニューを再帰的に実装するVueの具体的なコードを参考までに共有しています。...

MySQL 8.0 エラー サーバーがクライアントに不明な認証方法を要求しました 解決策

最新バージョンのMySQL 8.0.11をインストールした後、ユーザーを作成して認証します。認証され...

ウェブページを作るときに注意すべき5つのポイント

1. 色合わせの問題<br />Web ページには 3 色以上使用しないでください。そう...

MySQL 高可用性クラスタの展開とフェイルオーバーの実装

目次1. 内閣府1. コンセプト2. MHAの構成3. MHAの特徴2. MySQL+MHAをビルド...

MySQLの文字セットと検証ルールの詳細な説明

1いくつかの一般的な文字セットMySQL で最も一般的な文字セットには、ASCII 文字セット、ラテ...

MySQLトランザクションの特徴と分離レベルについてお話ししましょう

インターネットにはすでにこの種の記事が溢れていますが、私がこれをまだ書いている理由は単純です。それは...

Javascriptの基礎を学ぶための10の重要な質問

目次1. Javascript とは何ですか? 2. DOMとは何か3. JSコードの実行方法4. ...

Dockerカスタムブリッジdocker0とdockerのコマンド操作の開始、終了、再起動

質問会社がサーバーを移行した後、デフォルトで作成された docker0 ブリッジが会社の外部ネットワ...

Reactを使用して画像認識アプリを実装する方法

まずは効果の写真をお見せしましょう。 個人的には効果は問題ないと思います。アプリが写真を学習する時間...

レスポンシブなアコーディオン効果を実現するための CSS3 の詳細な説明

最近、外国人が CSS3 を使用してアコーディオン効果を実現しているビデオを見たので、自分で学習した...

echartsマップカルーセルハイライトを解決するための記事

目次序文やることリストやるだけ地図を準備するインスタンスをバックアップ用に保存するタイマーカルーセル...

Nginx 構成 80 ポート アクセス 8080 とプロジェクト名アドレス メソッド分析

Tomcatはプロジェクトにアクセスします。通常はIP + ポート + プロジェクト名です。 Ngi...