Mybatis を介して MySQL ストアド プロシージャを呼び出す例の詳細な説明

零下一度
リリース: 2018-05-15 17:43:35
オリジナル
1534 人が閲覧しました

この記事では主に Mybatis を通じて呼び出される MySQL ストアド プロシージャの実装について紹介します。興味のある方は参考にしてください。

1. ストアド プロシージャの概要

一般的に使用されるオペレーティング データベース言語の SQL ステートメントは、最初にコンパイルされ、実行時に実行される必要があります。ストアド プロシージャ (ストアド プロシージャ) は、特定の機能を完了するように設計された SQL ステートメントのセットです。コンパイルされてデータベースに保存されると、ユーザーはストアド プロシージャの名前を指定し、パラメーターを指定することによって (ストアド プロシージャにパラメーターがある場合)、それを呼び出して実行します。

ストアド プロシージャは、データベースに作成され保存されるプログラム可能な関数です。これは、SQL ステートメントといくつかの特別な制御構造で構成されます。ストアド プロシージャは、異なるアプリケーションやプラットフォームで同じ機能を実行する場合、または特定の機能をカプセル化する場合に便利です。データベース内のストアド プロシージャは、プログラミングにおけるオブジェクト指向アプローチのシミュレーションとみなすことができます。これにより、データへのアクセス方法を制御できます。

2. ストアド プロシージャの利点

  1. ストアド プロシージャは、SQL 言語の機能と柔軟性を強化します。ストアド プロシージャはフロー制御ステートメントを使用して作成でき、柔軟性が高く、複雑な判断やより複雑な操作を実行できます。

  2. ストアド プロシージャを使用すると、標準コンポーネントをプログラムできます。ストアド プロシージャを作成した後は、ストアド プロシージャの SQL ステートメントを書き直すことなく、プログラム内でストアド プロシージャを複数回呼び出すことができます。また、データベースの専門家は、アプリケーションのソース コードに影響を与えることなく、いつでもストアド プロシージャを変更できます。

  3. ストアド プロシージャを使用すると、より高速な実行速度を実現できます。操作に大量の Transaction-SQL コードが含まれている場合、または複数回実行される場合、ストアド プロシージャはバッチ処理よりもはるかに高速に実行されます。ストアド プロシージャはプリコンパイルされているためです。ストアド プロシージャが初めて実行されるとき、オプティマイザによってクエリが分析および最適化され、最終的に実行プランがシステム テーブルに保存されます。バッチ Transaction-SQL ステートメントは、実行するたびにコンパイルして最適化する必要があり、速度は比較的遅くなります。

  4. ストアド プロシージャにより、ネットワーク トラフィックを削減できます。同じデータベース オブジェクトに対する操作 (クエリ、変更など) の場合、この操作に関係する Transaction-SQL ステートメントがストアド プロシージャに編成されている場合、そのストアド プロシージャがクライアント コンピュータで呼び出されるとき、呼び出しのみが送信されます。これにより、ネットワーク トラフィックが大幅に増加し、ネットワーク負荷が軽減されます。

  5. ストアド プロシージャはセキュリティ メカニズムとして十分に活用できます。システム管理者は、特定のストアドプロシージャの実行権限を制限することで、対応するデータへのアクセス権限を制限し、権限のないユーザーによるデータへのアクセスを回避し、データのセキュリティを確保することができます。

3. ストアドプロシージャのデメリット

  1. 一度ロジックが変わると修正が面倒

  2. このストアドプロシージャを書いた人が辞めてしまうと、おそらく、他の人があなたのプログラム ロジックとストレージ ロジックを理解する必要があるため、彼女のコードを引き継ぐ人にとっては大惨事になるでしょう。拡大にはつながりません。

  3. 最大のデメリット! ただし、ストアド プロシージャを使用するとコードの量が減り、開発効率が向上します。ただし、非常に致命的なのは、パフォーマンスの消費が多すぎることです。

4. ストアドプロシージャの構文

4.1 ストアドプロシージャを作成する

create procedure sp_name()
begin
.........
end
ログイン後にコピー

4.2 ストアドプロシージャを呼び出す

call sp_name()
ログイン後にコピー

注: ストアドプロシージャにパラメータが渡されていない場合でも、かっこをストアドプロシージャ名の後に追加する必要があります

4.3 ストレージ プロセスの削除

drop procedure sp_name//
ログイン後にコピー

注: 1 つのストアド プロシージャ内の別のストアド プロシージャを削除することはできません。別のストアド プロシージャを呼び出すことのみが可能です

4.4 その他の一般的なコマンド

show procedure status
ログイン後にコピー

データベース内のすべてのストアド ストアド プロシージャの基本情報を表示します。所属するデータベースやストレージのプロセス名、作成時刻などを含む

show create procedure sp_name
ログイン後にコピー

特定のMySQLストアドプロシージャの詳細情報を表示

5. MySQLストアドプロシージャを呼び出すMyBatisの実装例

5.1 簡単な説明このケースでは、主に単純な統計手法を使用して、名前付きデバイスの総数を取得します。

5.2 データベーステーブルの作成

DROP TABLE IF EXISTS `cus_device`;
CREATE TABLE `cus_device` (
 `device_sn` varchar(20) NOT NULL COMMENT '设备编号',
 `device_cat_id` int(1) DEFAULT NULL COMMENT '设备类型',
 `device_name` varchar(64) DEFAULT NULL COMMENT '设备名称',
 `device_type` varchar(64) DEFAULT NULL COMMENT '设备型号',
 PRIMARY KEY (`device_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ログイン後にコピー

5.3 ストアドプロシージャを作成します

デバイスの名前を入力パラメータとして取得し、デバイスの総数を出力パラメータとして取得します

DROP PROCEDURE IF EXISTS `countDevicesName`;
DELIMITER ;;
CREATE PROCEDURE `countDevicesName`(IN dName VARCHAR(12),OUT deviceCount INT)
BEGIN
SELECT COUNT(*) INTO deviceCount FROM cus_device WHERE device_name = dName;

END
;;
DELIMITER ;
ログイン後にコピー

5.4 MybatisはMySQLストアドプロシージャを呼び出します

1 .mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration PUBLIC  
  "-//mybatis.org//DTD Config 3.0//EN" 
  "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 

  <settings>
  <!-- 打印查询语句 -->
    <setting name="logImpl" value="STDOUT_LOGGING" />
  </settings>
  <!-- 配置别名 --> 
  <typeAliases> 
    <typeAlias type="com.lidong.axis2demo.DevicePOJO" alias="DevicePOJO" />  
  </typeAliases> 

  <!-- 配置环境变量 --> 
  <environments default="development"> 
    <environment id="development"> 
      <transactionManager type="JDBC" /> 
      <dataSource type="POOLED"> 
        <property name="driver" value="com.mysql.jdbc.Driver" /> 
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/bms?characterEncoding=GBK" /> 
        <property name="username" value="root" /> 
        <property name="password" value="123456" /> 
      </dataSource> 
    </environment> 
  </environments> 

  <!-- 配置mappers --> 
  <mappers> 
    <mapper resource="com/lidong/axis2demo/DeviceMapper.xml" /> 
  </mappers> 

</configuration>
ログイン後にコピー

2.CusDevice.java

public class DevicePOJO{

   private String devoceName;//设备名称
   private String deviceCount;//设备总数


  public String getDevoceName() {
    return devoceName;
  }
  public void setDevoceName(String devoceName) {
    this.devoceName = devoceName;
  }
  public String getDeviceCount() {
    return deviceCount;
  }
  public void setDeviceCount(String deviceCount) {
    this.deviceCount = deviceCount;
  }
}
ログイン後にコピー

4.Mapper

package com.lidong.axis2demo;

public interface DeviceDAO {

  /**
   * 调用存储过程 获取设备的总数
   * @param devicePOJO
   */
  public void count(DevicePOJO devicePOJO);

}
ログイン後にコピー

の実装:statementType="CALLABLE" を実行するように MyBatis に指示するそうでない場合は、エラーが報告されます

スレッド「メイン」の例外 org.apache.ibatis.Exceptions.PersistenceException

mode=IN 入力パラメータ mode=OUT 出力パラメータ jdbcType は、データベースによって定義されたフィールド タイプです。

このように Mybatis を記述すると、出力 deviceCount 値を自動的にバックフィルするのに役立ちます。


5. テスト

えー

結果

以上がMybatis を介して MySQL ストアド プロシージャを呼び出す例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!