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を追加した後の問題を解決する

推薦する

HTMLページの読み込みと解析プロセスの詳細な紹介

ブラウザがHTMLを読み込みレンダリングする順序1. IE は上から下へダウンロードし、上から下へレ...

CentOS6で定期的にjarプログラムを実行するスクリプトをcrontabで実行する

1. 簡単なJavaプログラムを書く パブリッククラステストシェル{ パブリック静的voidメイン(...

MySQL はカスタムシーケンスを使用して row_number 関数を実装します (詳細な手順)

いくつかの記事を読んだ後、ようやく MySQL で row_number() ソートを実装する方法が...

WMLタグの概要

構造関連タグ--------------------------------------------...

WeChatアプレットが複数行テキストのスクロール効果を実現

この記事の例では、WeChatアプレットで複数行のテキストスクロールを実装するための具体的なコードを...

CSS を使用して複数列の等高レイアウトを設定する方法の例

最初は、複数の列のコンテンツのサイズと高さが異なります。ここで、表示する背景を異なるものに設定し、各...

Centos7 のインストールと Mysql5.7 の設定

ステップ1: MySQL YUMソースを取得するMySQLの公式サイトにアクセスして、RPMパッケー...

CSSセレクタを使用してラベルスタイルを設定するサンプルコード

CSS セレクターHTML タグにスタイルを設定すると、タグの属性を設定できます。 <div ...

Node-Redを使用してMySQLデータベースに接続する方法

Node-red をデータベース (mysql) に接続するには、まずコンピューターに MySQL ...

JavaScript 即時実行関数の使用状況分析

一般的に、関数は実行する前に呼び出す必要があることはご存じのとおりです。以下に示すように、関数を定義...

テーブル関連の配置とJavascript操作テーブル、tr、td

適切に機能するテーブル プロパティ設定:コードをコピーコードは次のとおりです。 <テーブル セ...

標準SQL更新ステートメントの3つの用途についての簡単な理解

1. 環境: MySQL-5.0.41-win32 Windows XP プロフェッショナル2. テ...

dockerでredis5.0.3をインストールする方法

1. 公式5.0.3イメージを取得する [root@localhost ~]# docker pul...

H5レイアウト実装手順における天井と底部の吸引を解決するための純粋なCSS

どのような製品について言及したいですか?最近、ユーザーがマーケティングの変化をよりよく観察できるよう...