Heim  >  Artikel  >  Datenbank  >  Detaillierte Erläuterung von Beispielen für den Aufruf gespeicherter MySQL-Prozeduren über Mybatis

Detaillierte Erläuterung von Beispielen für den Aufruf gespeicherter MySQL-Prozeduren über Mybatis

零下一度
零下一度Original
2018-05-15 17:43:351530Durchsuche

In diesem Artikel wird hauptsächlich die Implementierung gespeicherter MySQL-Prozeduren vorgestellt, die über Mybatis aufgerufen werden. Interessierte Freunde können darauf verweisen.

1. Einführung in gespeicherte Prozeduren

Unsere häufig verwendete SQL-Anweisung in der Betriebsdatenbank muss zuerst kompiliert und dann ausgeführt werden, während gespeicherte Prozeduren (Gespeicherte Prozeduren) ist eine Reihe von SQL-Anweisungen zur Ausführung bestimmter Funktionen. Sie werden kompiliert und in der Datenbank gespeichert. Der Benutzer ruft die gespeicherte Prozedur auf und führt sie aus, indem er den Namen der gespeicherten Prozedur angibt und Parameter angibt (sofern die gespeicherte Prozedur über Parameter verfügt).

Eine gespeicherte Prozedur ist eine programmierbare Funktion, die erstellt und in der Datenbank gespeichert wird. Es kann aus SQL-Anweisungen und einigen speziellen Kontrollstrukturen bestehen. Gespeicherte Prozeduren sind nützlich, wenn Sie dieselbe Funktion auf verschiedenen Anwendungen oder Plattformen ausführen oder wenn Sie bestimmte Funktionen kapseln möchten. Gespeicherte Prozeduren in einer Datenbank können als Simulation des objektorientierten Ansatzes in der Programmierung angesehen werden. Es ermöglicht die Kontrolle darüber, wie auf Daten zugegriffen wird.

2. Vorteile gespeicherter Prozeduren

  1. Gespeicherte Prozeduren verbessern die Funktionalität und Flexibilität der SQL-Sprache. Gespeicherte Prozeduren können mithilfe von Flusskontrollanweisungen geschrieben werden, sind äußerst flexibel und können komplexe Beurteilungen und komplexere Operationen durchführen.

  2. Gespeicherte Prozeduren ermöglichen die Programmierung von Standardkomponenten. Nachdem eine gespeicherte Prozedur erstellt wurde, kann sie im Programm mehrmals aufgerufen werden, ohne dass die SQL-Anweisung der gespeicherten Prozedur neu geschrieben werden muss. Und Datenbankexperten können gespeicherte Prozeduren jederzeit ändern, ohne den Quellcode der Anwendung zu beeinträchtigen.

  3. Gespeicherte Prozeduren können eine schnellere Ausführungsgeschwindigkeit erreichen. Wenn eine Operation eine große Menge an Transaction-SQL-Code enthält oder mehrmals ausgeführt wird, wird die gespeicherte Prozedur viel schneller ausgeführt als die Stapelverarbeitung. Weil gespeicherte Prozeduren vorkompiliert sind. Wenn eine gespeicherte Prozedur zum ersten Mal ausgeführt wird, wird die Abfrage vom Optimierer analysiert und optimiert und schließlich wird ein Ausführungsplan in der Systemtabelle gespeichert. Die Batch-Transaction-SQL-Anweisung muss bei jeder Ausführung kompiliert und optimiert werden, und die Geschwindigkeit ist relativ langsamer.

  4. Gespeicherte Prozeduren können den Netzwerkverkehr reduzieren. Wenn bei Vorgängen für dasselbe Datenbankobjekt (z. B. Abfrage, Änderung) die an diesem Vorgang beteiligte Transaction-SQL-Anweisung in einer gespeicherten Prozedur organisiert ist, wird beim Aufruf der gespeicherten Prozedur auf dem Clientcomputer nur der Aufruf übertragen die Netzwerkanweisungen, wodurch der Netzwerkverkehr erheblich erhöht und die Netzwerklast verringert wird.

  5. Gespeicherte Prozeduren können vollständig als Sicherheitsmechanismus genutzt werden. Durch die Einschränkung der Berechtigungen zum Ausführen einer bestimmten gespeicherten Prozedur kann der Systemadministrator die Zugriffsberechtigungen für die entsprechenden Daten einschränken, den Zugriff unbefugter Benutzer auf die Daten verhindern und die Sicherheit der Daten gewährleisten.

3. Nachteile gespeicherter Prozeduren

  1. Sobald sich die Logik ändert, ist sie es Es ist mühsam, es zu ändern

  2. Wenn die Person, die diese gespeicherte Prozedur geschrieben hat, zurücktritt, wird es wahrscheinlich eine Katastrophe für die Person sein, die ihren Code übernimmt, da andere Ihre Programmlogik verstehen müssen und Ihre Speicherlogik. Der Expansion nicht förderlich.

  3. Das größte Manko! Obwohl gespeicherte Prozeduren die Codemenge reduzieren und die Entwicklungseffizienz verbessern können. Aber eine sehr fatale Sache ist, dass es zu viel Leistung verbraucht.

4. Syntax der gespeicherten Prozedur

4.1 Gespeicherte Prozedur erstellen

create procedure sp_name()
begin
.........
end

4.2 Gespeicherte Prozedur aufrufen

call sp_name()

Hinweis: Nach dem Namen der gespeicherten Prozedur müssen Klammern hinzugefügt werden, auch wenn für die gespeicherte Prozedur keine Parameter übergeben wurden

4.3 Gespeicherte Prozedur löschen

drop procedure sp_name//

Hinweis: Dies ist nicht möglich in einer gespeicherten Prozedur sein Um eine andere gespeicherte Prozedur zu löschen, können Sie nur eine andere gespeicherte Prozedur aufrufen

4.4 Andere allgemeine Befehle

show procedure status

Zeigt die grundlegenden Informationen aller gespeicherten Prozeduren in der Datenbank an, einschließlich die Datenbank, zu der sie gehört, und der Name der gespeicherten Prozedur, die Erstellungszeit usw.

show create procedure sp_name

Detaillierte Informationen zu einer bestimmten MySQL-gespeicherten Prozedur anzeigen

Fallimplementierung von MyBatis, der die gespeicherte MySQL-Prozedur aufruft

5.1 Kurze Beschreibung des Falls

Der Fall wird hauptsächlich durch einfaches Zählen der Gesamtzahl der Geräte mit einem bestimmten Namen implementiert.

5.2 Erstellung einer Datenbanktabelle

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 Erstellung einer gespeicherten Prozedur

Nehmen Sie den Namen des Geräts als Eingabeparameter und die Gesamtzahl der gezählten Geräte als Ausgabeparameter

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 ruft die gespeicherte MySQL-Prozedur auf

1

3. Implementierung von DeviceDAO
<?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>

4. Implementierung von Mapper
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;
  }
}

Hinweis: StatementType="CALLABLE" muss CALLABLE sein und MyBatis anweisen, die gespeicherte Prozedur auszuführen. andernfalls wird ein Fehler gemeldet
package com.lidong.axis2demo;

public interface DeviceDAO {

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

}
Ausnahme im Thread „main“ org.apache.ibatis.Exceptions.PersistenceException

mode=IN Eingabeparameter mode=OUT Ausgabeparameter jdbcType ist der von der Datenbank definierte Feldtyp.
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lidong.axis2demo.DeviceDAO">

  <resultMap id="BaseResultMap" type="CusDevicePOJO">
    <result column="device_sn" property="device_sn" jdbcType="VARCHAR" />
  </resultMap>

  <sql id="Base_Column_List">
    device_sn, device_name,device_mac
  </sql>

  <select id="count" parameterType="DevicePOJO" useCache="false"
    statementType="CALLABLE"> 
    <![CDATA[ 
    call countDevicesName(
    #{devoceName,mode=IN,jdbcType=VARCHAR},
    #{deviceCount,mode=OUT,jdbcType=INTEGER});
    ]]>
  </select>
</mapper>
Wenn Sie Mybatis so schreiben, können wir den Ausgabewert „deviceCount“ automatisch auffüllen.


5. Test


Ergebnisse

package com.lidong.axis2demo;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
 * MyBatis 执行存储过程
 * @author Administrator
 *
 */
public class TestProduce {

  private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder; 
  private static SqlSessionFactory sqlSessionFactory; 
  private static void init() throws IOException { 
    String resource = "mybatis-config.xml"; 
    Reader reader = Resources.getResourceAsReader(resource); 
    sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 
    sqlSessionFactory = sqlSessionFactoryBuilder.build(reader); 
  } 

  public static void main(String[] args) throws Exception {
    testCallProduce();
  }

  /**
   * @throws IOException
   */
  private static void testCallProduce() throws IOException {
    init();
    SqlSession session= sqlSessionFactory.openSession(); 
    DeviceDAO deviceDAO = session.getMapper(DeviceDAO.class); 
    DevicePOJO device = new DevicePOJO(); 
    device.setDevoceName("设备名称"); 
    deviceDAO.count(device);
    System.out.println("获取"+device.getDevoceName()+"设备的总数="+device.getDeviceCount());
  }

}


Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für den Aufruf gespeicherter MySQL-Prozeduren über Mybatis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn