ホームページ >データベース >mysql チュートリアル >Mybatis を介して MySQL ストアド プロシージャを呼び出す例の詳細な説明
この記事では主に Mybatis を通じて呼び出される MySQL ストアド プロシージャの実装について紹介します。興味のある方は参考にしてください。
1. ストアド プロシージャの概要
一般的に使用されるオペレーティング データベース言語の SQL ステートメントは、最初にコンパイルされ、実行時に実行される必要があります。ストアド プロシージャ (ストアド プロシージャ) は、特定の機能を完了するように設計された SQL ステートメントのセットです。コンパイルされてデータベースに保存されると、ユーザーはストアド プロシージャの名前を指定し、パラメーターを指定することによって (ストアド プロシージャにパラメーターがある場合)、それを呼び出して実行します。
ストアド プロシージャは、データベースに作成され保存されるプログラム可能な関数です。これは、SQL ステートメントといくつかの特別な制御構造で構成されます。ストアド プロシージャは、異なるアプリケーションやプラットフォームで同じ機能を実行する場合、または特定の機能をカプセル化する場合に便利です。データベース内のストアド プロシージャは、プログラミングにおけるオブジェクト指向アプローチのシミュレーションとみなすことができます。これにより、データへのアクセス方法を制御できます。
2. ストアド プロシージャの利点
ストアド プロシージャは、SQL 言語の機能と柔軟性を強化します。ストアド プロシージャはフロー制御ステートメントを使用して作成でき、柔軟性が高く、複雑な判断やより複雑な操作を実行できます。
ストアド プロシージャを使用すると、標準コンポーネントをプログラムできます。ストアド プロシージャを作成した後は、ストアド プロシージャの SQL ステートメントを書き直すことなく、プログラム内でストアド プロシージャを複数回呼び出すことができます。また、データベースの専門家は、アプリケーションのソース コードに影響を与えることなく、いつでもストアド プロシージャを変更できます。
ストアド プロシージャを使用すると、より高速な実行速度を実現できます。操作に大量の Transaction-SQL コードが含まれている場合、または複数回実行される場合、ストアド プロシージャはバッチ処理よりもはるかに高速に実行されます。ストアド プロシージャはプリコンパイルされているためです。ストアド プロシージャが初めて実行されるとき、オプティマイザによってクエリが分析および最適化され、最終的に実行プランがシステム テーブルに保存されます。バッチ Transaction-SQL ステートメントは、実行するたびにコンパイルして最適化する必要があり、速度は比較的遅くなります。
ストアド プロシージャにより、ネットワーク トラフィックを削減できます。同じデータベース オブジェクトに対する操作 (クエリ、変更など) の場合、この操作に関係する Transaction-SQL ステートメントがストアド プロシージャに編成されている場合、そのストアド プロシージャがクライアント コンピュータで呼び出されるとき、呼び出しのみが送信されます。これにより、ネットワーク トラフィックが大幅に増加し、ネットワーク負荷が軽減されます。
ストアド プロシージャはセキュリティ メカニズムとして十分に活用できます。システム管理者は、特定のストアドプロシージャの実行権限を制限することで、対応するデータへのアクセス権限を制限し、権限のないユーザーによるデータへのアクセスを回避し、データのセキュリティを確保することができます。
3. ストアドプロシージャのデメリット
4. ストアドプロシージャの構文
4.1 ストアドプロシージャを作成するcreate procedure sp_name() begin ......... end4.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 サイトの他の関連記事を参照してください。