この記事では主に Mybatis を通じて呼び出される MySQL ストアド プロシージャの実装について紹介します。興味のある方は参考にしてください。
1. ストアド プロシージャの概要
一般的に使用されるオペレーティング データベース言語の SQL ステートメントは、最初にコンパイルされ、実行時に実行される必要があります。ストアド プロシージャ (ストアド プロシージャ) は、特定の機能を完了するように設計された SQL ステートメントのセットです。コンパイルされてデータベースに保存されると、ユーザーはストアド プロシージャの名前を指定し、パラメーターを指定することによって (ストアド プロシージャにパラメーターがある場合)、それを呼び出して実行します。
ストアド プロシージャは、データベースに作成され保存されるプログラム可能な関数です。これは、SQL ステートメントといくつかの特別な制御構造で構成されます。ストアド プロシージャは、異なるアプリケーションやプラットフォームで同じ機能を実行する場合、または特定の機能をカプセル化する場合に便利です。データベース内のストアド プロシージャは、プログラミングにおけるオブジェクト指向アプローチのシミュレーションとみなすことができます。これにより、データへのアクセス方法を制御できます。
2. ストアド プロシージャの利点
ストアド プロシージャは、SQL 言語の機能と柔軟性を強化します。ストアド プロシージャはフロー制御ステートメントを使用して作成でき、柔軟性が高く、複雑な判断やより複雑な操作を実行できます。
ストアド プロシージャを使用すると、標準コンポーネントをプログラムできます。ストアド プロシージャを作成した後は、ストアド プロシージャの SQL ステートメントを書き直すことなく、プログラム内でストアド プロシージャを複数回呼び出すことができます。また、データベースの専門家は、アプリケーションのソース コードに影響を与えることなく、いつでもストアド プロシージャを変更できます。
ストアド プロシージャを使用すると、より高速な実行速度を実現できます。操作に大量の Transaction-SQL コードが含まれている場合、または複数回実行される場合、ストアド プロシージャはバッチ処理よりもはるかに高速に実行されます。ストアド プロシージャはプリコンパイルされているためです。ストアド プロシージャが初めて実行されるとき、オプティマイザによってクエリが分析および最適化され、最終的に実行プランがシステム テーブルに保存されます。バッチ Transaction-SQL ステートメントは、実行するたびにコンパイルして最適化する必要があり、速度は比較的遅くなります。
ストアド プロシージャにより、ネットワーク トラフィックを削減できます。同じデータベース オブジェクトに対する操作 (クエリ、変更など) の場合、この操作に関係する Transaction-SQL ステートメントがストアド プロシージャに編成されている場合、そのストアド プロシージャがクライアント コンピュータで呼び出されるとき、呼び出しのみが送信されます。これにより、ネットワーク トラフィックが大幅に増加し、ネットワーク負荷が軽減されます。
ストアド プロシージャはセキュリティ メカニズムとして十分に活用できます。システム管理者は、特定のストアドプロシージャの実行権限を制限することで、対応するデータへのアクセス権限を制限し、権限のないユーザーによるデータへのアクセスを回避し、データのセキュリティを確保することができます。
3. ストアドプロシージャのデメリット
4. ストアドプロシージャの構文
4.1 ストアドプロシージャを作成するcreate procedure sp_name() begin ......... end
call sp_name()
4.3 ストレージ プロセスの削除
drop procedure sp_name//
show procedure status
show create procedure sp_name
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;
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 ;
<?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>
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; } }
package com.lidong.axis2demo; public interface DeviceDAO { /** * 调用存储过程 获取设备的总数 * @param devicePOJO */ public void count(DevicePOJO devicePOJO); }
スレッド「メイン」の例外 org.apache.ibatis.Exceptions.PersistenceException
mode=IN 入力パラメータ mode=OUT 出力パラメータ jdbcType は、データベースによって定義されたフィールド タイプです。
このように Mybatis を記述すると、出力 deviceCount 値を自動的にバックフィルするのに役立ちます。
5. テスト
結果
以上がMybatis を介して MySQL ストアド プロシージャを呼び出す例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。