Mybatis使用MySQL存储函数转载

原创
小哥 3年前 (2022-10-28) 阅读数 64 #大杂烩

1.存储过程简介
我们共同的操作数据库语言SQL语句需要在执行时编译并执行,而存储过程(Stored Procedure)是一套SQL语句集、编译并存储在数据库中时,用户通过指定存储过程的名称并给出参数(如果存储过程有参数)来调用来执行它。

存储过程是在数据库中创建并保存的可编程函数。它可能会有SQL语句和一些特殊的控制结构。当您希望在不同的应用程序或平台上执行相同的函数或封装特定函数时,存储过程非常有用。数据库中的存储过程可以看作是编程中面向对象方法的模拟。它允许控制如何访问数据。

2.存储过程的好处
存储过程增强功能SQL语言的功能性和灵活性。存储过程可以用流控制语句编写,非常灵活,可以完成复杂的判断和更复杂的操作。

存储过程允许对标准组件进行编程。一旦创建了存储过程,就可以在程序中多次调用它,而不必重写存储过程。SQL声明。数据库专业人员可以随时修改存储过程,而不会影响应用程序源代码。

存储过程可以更快地执行。如果某个操作包含大量数字Transaction-SQL代码或多次执行,则存储过程的执行速度比批处理快得多。因为存储过程是预编译的。当您第一次运行存储过程时,优化器会对其进行分析和优化,并提供最终存储在系统表中的执行计划。在批处理时Transaction-SQL语句在每次运行时都会进行编译和优化,这相对较慢。

存储过程可以减少网络流量。对同一数据库对象的操作(例如,查询、修改),如果此操作涉及Transaction-SQL语句被组织起来存储过程,因此当在客户端计算机上调用存储过程时,只在网络中传输调用语句,从而大大增加了网络流量,降低了网络负载。

存储过程可以作为一种安全机制充分利用。通过限制存储过程的权限,系统管理员可以实现对相应数据的访问权限限制,避免未经授权的用户访问数据,保证数据的安全。

3.存储过程的缺点
维护起来并不容易,一旦逻辑发生变化,修改起来就麻烦了。
如果编写此存储过程的人离开,对于接管她的代码的人来说估计是一场灾难,因为其他人必须读取您的程序逻辑和存储逻辑。不利于扩张。
最大的缺点! 虽然存储过程可以减少代码量,提高开发效率。但有一件事是非常致命的,那就是它消耗了太多的性能。
4.存储过程的语法
4.1 创建存储过程
create procedure sp_name()
begin
.........
end

4.2 调用存储过程
call sp_name()
1
注意:即使存储过程没有传递任何参数,存储过程名称后面也必须有圆括号。

4.3 删除存储过程
drop procedure sp_name//
1
注意:不能删除一个存储过程中的另一个存储过程,只能调用另一个存储过程。

4.4其他常见命令
show procedure status
1
显示数据库中所有存储过程的基本信息,包括它们所属的数据库、存储过程的名称、创建时间等。

show create procedure sp_name
1
显示为MySQL存储过程详细信息

5.MyBatis调用MySQL存储过程的CASE实现
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">
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; } } 3. DeviceDAO的实现 package com.lidong.axis2demo; public interface DeviceDAO { /** * 调用存储过程 获取设备总数 * @param devicePOJO */ public void count(DevicePOJO devicePOJO); } 4.Mapper的实现 device\_sn, device\_name,device\_mac 注意:statementType=”CALLABLE” 必须为CALLABLE,告诉MyBatis要执行存储过程, 否则,将报告错误。 Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException mode=IN 输入参数 mode=OUT输出参数 jdbcType为数据库定义的字段类型。 这样写 Mybatis将帮助我们自动回填输出。deviceCount的值。 5.测试 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()); } } 结果 ———————————————— 版权声明:本文是CSDN博主《请叫我董子》的原文如下CC 4.0 BY-SA版权协议,转载请附上原始来源链接和本声明。 原始链接:https://blog.csdn.net/u010046908/article/details/69944959
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门