Primavera - procedimiento almacenado de llamadas mybatis

1. Introducción a los procedimientos almacenados.

Nuestra instrucción SQL de lenguaje de base de datos de operación comúnmente utilizada debe compilarse primero y luego ejecutarse cuando se ejecuta, y el procedimiento almacenado (Procedimiento almacenado) es un conjunto de instrucciones SQL para completar una función específica, que se almacena en la base de datos después de la compilación, el usuario especifica El nombre del procedimiento almacenado y los parámetros dados (si el procedimiento almacenado tiene parámetros) para llamarlo y ejecutarlo.

Un procedimiento almacenado es una función programable, que se crea y guarda en la base de datos. Puede estar compuesto de sentencias SQL y algunas estructuras de control especiales. Los procedimientos almacenados son muy útiles cuando desea realizar la misma función en diferentes aplicaciones o plataformas, o para encapsular funciones específicas. El procedimiento almacenado en la base de datos puede considerarse como una simulación del método orientado a objetos en la programación. Permite controlar cómo se accede a los datos.

2. Ventajas de los procedimientos almacenados

  1. Los procedimientos almacenados mejoran la funcionalidad y flexibilidad del lenguaje SQL. Los procedimientos almacenados se pueden escribir en declaraciones de control de flujo, que tienen una gran flexibilidad y pueden completar juicios complejos y operaciones más complejas.

  2. Los procedimientos almacenados permiten programar componentes estándar. Después de crear un procedimiento almacenado, se puede llamar varias veces en el programa sin tener que volver a escribir la instrucción SQL del procedimiento almacenado. Y los profesionales de bases de datos pueden modificar los procedimientos almacenados en cualquier momento, sin afectar el código fuente de la aplicación.

  3. Los procedimientos almacenados pueden lograr una mayor velocidad de ejecución. Si una operación contiene una gran cantidad de código Transaction-SQL o se ejecuta varias veces, el procedimiento almacenado es mucho más rápido que el procesamiento por lotes. Porque el procedimiento almacenado está precompilado. Al consultar un procedimiento almacenado por primera vez, el optimizador lo analiza y lo optimiza y proporciona un plan de ejecución que finalmente se almacena en la tabla del sistema. Las instrucciones de Transaction-SQL por lotes deben compilarse y optimizarse cada vez que se ejecutan, lo cual es relativamente lento.

  4. Los procedimientos almacenados también pueden reducir el tráfico de red. Para la operación del mismo objeto de base de datos (como consultar, modificar), si la instrucción Transaction-SQL involucrada en esta operación se organiza en un procedimiento almacenado, entonces cuando se llama al procedimiento almacenado en la computadora cliente, solo la llamada se transmite en la red Declaración, que aumenta enormemente el tráfico de red y reduce la carga de red.

  5. Los procedimientos almacenados se pueden utilizar completamente como mecanismo de seguridad. El administrador del sistema puede limitar los derechos de acceso a los datos correspondientes restringiendo los permisos de un determinado procedimiento almacenado, evitando el acceso de usuarios no autorizados a los datos y garantizando la seguridad de los datos.

3. Desventajas de los procedimientos almacenados.

  1. No es fácil de mantener, una vez que la lógica cambia, es problemático modificar
  2. Si la persona que escribe este procedimiento almacenado se va, se estima que será un desastre para la persona que se haga cargo de su código, porque otros tendrán que leer la lógica de su programa y su lógica almacenada. No propicio para la expansión.
  3. La mayor desventaja! Aunque los procedimientos almacenados pueden reducir la cantidad de código y mejorar la eficiencia del desarrollo. Pero una cosa muy fatal es que consume demasiado rendimiento.

4. La sintaxis del procedimiento almacenado

4.1 Crear un procedimiento almacenado

create procedure sp_name()
begin
.........
end
  • 1
  • 2
  • 3
  • 4 4
  • 5 5

4.2 Llamar a un procedimiento almacenado

call sp_name()
  • 1

Nota: Debe agregar paréntesis después del nombre del procedimiento almacenado, incluso si el procedimiento almacenado no pasa parámetros

4.3 Eliminar procedimiento almacenado

drop procedure sp_name//
  • 1

Nota: No puede eliminar otro procedimiento almacenado en un procedimiento almacenado, solo puede llamar a otro procedimiento almacenado

4.4 Otros comandos comunes

show procedure status
  • 1

Muestra la información básica de todos los procedimientos almacenados en la base de datos, incluida la base de datos, el nombre del procedimiento almacenado, la hora de creación, etc.

show create procedure sp_name
  • 1

Mostrar información detallada sobre un procedimiento almacenado de MySQL

5. Implementación de caso de MyBatis llamando al procedimiento almacenado de MySQL

5.1 Breve descripción del caso

El caso se realiza principalmente mediante estadísticas simples del número total de dispositivos con un nombre determinado.

5.2 Creación de tablas de bases de datos.

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;
  • 1
  • 2
  • 3
  • 4 4
  • 5 5
  • 6 6
  • 7 7
  • 8

5.3 Crear un procedimiento almacenado

Tome el nombre del dispositivo como parámetro de entrada y el número total de dispositivos contados como parámetro de salida

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 ;
  • 1
  • 2
  • 3
  • 4 4
  • 5 5
  • 6 6
  • 7 7
  • 8
  • 9 9

5.4 Mybatis llama al procedimiento almacenado de 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>
  • 1
  • 2
  • 3
  • 4 4
  • 5 5
  • 6 6
  • 7 7
  • 8
  • 9 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • dieciséis
  • 17
  • 18 años
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

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;
    }
}
  • 1
  • 2
  • 3
  • 4 4
  • 5 5
  • 6 6
  • 7 7
  • 8
  • 9 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • dieciséis
  • 17
  • 18 años
  • 19

3. Implementación de DeviceDAO

package com.lidong.axis2demo;

public interface DeviceDAO {

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

}
  • 1
  • 2
  • 3
  • 4 4
  • 5 5
  • 6 6
  • 7 7
  • 8
  • 9 9
  • 10
  • 11
  • 12

4. Implementación de Mapper

<?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>  
  • 1
  • 2
  • 3
  • 4 4
  • 5 5
  • 6 6
  • 7 7
  • 8
  • 9 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • dieciséis
  • 17
  • 18 años
  • 19
  • 20
  • 21

Nota: StatementType = "CALLABLE" debe ser CALLABLE, dígale a MyBatis que ejecute el procedimiento almacenado; de lo contrario, se informará un error 
Excepción en el subproceso "main" org.apache.ibatis.exceptions.PersistenceException

mode = parámetro de entrada IN mode = parámetro de salida OUT jdbcType es el tipo de campo definido por la base de datos. 
Escribir Mybatis de esta manera nos ayudará a rellenar automáticamente el valor de DeviceCount de salida.

5. Prueba

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());
    }

}
  • 1
  • 2
  • 3
  • 4 4
  • 5 5
  • 6 6
  • 7 7
  • 8
  • 9 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • dieciséis
  • 17
  • 18 años
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

El resultado 
Escriba una descripción de la imagen aquí

Publicado 7 artículos originales · 69 alabanzas · 200,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/u014320421/article/details/80003830
Recomendado
Clasificación