mybatis调用数据库存储过程

mybatis调用数据库存储过程及常见属性详解

调用mapper

String visitCode = mapper.getVisitCode(objectMap);

Dao层,xml文件代码编写

 <select id="getVisitCode" parameterType="map" resultType="string" statementType="CALLABLE">
        <![CDATA[
        {
            call getMinSerial_withLeft(
                #{tableName, jdbcType=VARCHAR, mode=IN},
                #{columnName, jdbcType=VARCHAR, mode=IN},
                #{left, jdbcType=VARCHAR, mode=IN},
                #{rightLength, jdbcType=INTEGER, mode=IN}
            )
            }
        ]]>
    </select>

属性statementType的属性值有:STATEMENT,PREPARED ,CALLABLE

详解:

STATEMENT

  • 普通的不带参的查询SQL
  • 支持批量更新与批量删除
  • Statement每次执行sql语句,数据库都要执行sql语句的编译,因此在使用Statement进行查询时,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。
  • 对应于Statement对象,有SQL注入的风险

PREPARED

  • 可变参数的SQL,编译一次,执行多次,效率高
  • 安全性高,有效防止了SQL注入
  • 支持批量删除,与批量更新
  • preparedStatement是预编译的,在执行可变参数的一条SQL的时候,PreparedStatement要比Statement的效率要高的,因为DBMS预编译一条SQL的效率要比多次编译一条SQL的效率要高,==另外PreparedStatement有效防止了SQL注入。==在进行多次执行重复语句的时候,PreparedStatement具有更高的运行效率,并且在这种情况下比较适合使用batch,其次就是编写的代码拥有更高的可读性与可维护性。

CALLABLE

  • 继承了PreparedStatement,支持带参数的SQL操作
  • 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持
  • 当使用存储过程的时候,需要指定statementType的值为CALLABLE

其他常见的属性:databaseId,flushCache,keyColumn,keyProperty,timeout,useGeneratedKeys

databaseId

  • 用于指定所配置的数据源的id,在多数据源的时候,可以使用
<bean id="vendorProperties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="Oracle">oracle</prop>
            <prop key="MySQL">mysql</prop>
        </props>
    </property>
</bean>

SQL在指定数据源的时候

<select id="qryAllUserInfo" databaseId="oracle" parameterType="****" >
    select * from sys_user
</select>
<select id="qryAllUserInfo" databaseId="mysql" parameterType="****" >
    select * from sys_user
</select>

flushCache与userCache

其主要针对二级缓存进行使用,在没有配置的情况下,mybatis的默认二级缓存如下

  • flushCache默认为false,表示任何时候语句被调用,都不会去清空二级缓存和本地缓存
  • useCache默认为true,表示将本条语句的查询结果进行二级缓存
  • 在insert、update、delete语句时:flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存都会被清空,useCache属性在该情况下没有值。update的时候flushCache=false,则当你更新后,查询的数据还是老数据。

keyColumn,keyProperty,useGeneratedKeys

  • 在插入数据库后,还返回插入的主键如id值到相应的pojo模型中。这非常方便的在进行业务插入时,无需再次查询最后一次插入的数值id。

  • keyColumn,指定数据库的主键名是什么,比如id,对特定的数据库(PostgreSQL)若自动生成的主键不是第一个字段则必须进行设置

  • keyProperty,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型中的那个属性之中

  • useGeneratedKeys,取值范围true|false(默认值),设置是否使用JDBC的getGeneratedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。Mysql和SQLServer执行auto-generated key field,因此当数据库设置好自增主键后,可以通过JDBC的getGeneratedKeys方法或取,但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

例子

<insert id="addHuser" parameterType="com.xx.authorization.model.HUsers" useGeneratedKeys="true" keyColumn="USER_ID" keyProperty="userId">  
        INSERT INTO H_USERS(PHONE,PASSWORD,GENDERS,REGISTER_DATE,STATUS)  
        values (#{phone},#{password},  
        #{genders,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},  
        #{registerDate},#{status})  
</insert> 

当执行完该条语句之后,语句会获取插入的最新一条数据的主键,及USER_ID的值,然后映射到 userId,最后在映射到实体类的HUser的userId中,所执行完你会发现HUSer的userId是最新的id数据

例子2

<mapper namespace="com.dao.EmployeeDao">
    <insert id="insert">
        <selectKey order="BEFORE" keyColumn="employeeId,employeeGender" keyProperty="employeeId,employeeGender" resultType="com.entity.Employee">
            select employee_id employeeId,employee_gender employeeGender from employee where employee_id=13
        </selectKey>
        insert into subtable(employee_id,employee_name,employee_gender) values (#{employeeId},"mdzz",#{employeeGender})
    </insert>
</mapper>

该条语句,表示从employee 中查询employee_id=13的数据,查询到employeeId和employeeGender 并映射到keyProperty中,然后再下一个insert语句中,直接注入#{employeeId},#{employeeGender},这种情况多用在表2需要表1字段信息时,减少代码和SQL的编写。提高SQL执行速度。

timeout

默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

52岁前宝丽金小花懒理旧爱郭晋安离婚,大晒美腿甜蜜放闪

TVB三届视帝郭晋安与欧倩怡早前在社交平台共同宣布离婚&#xff0c;并透露二人已分居两年&#xff0c;18年夫妻情画上句号&#xff0c;惊爆全城。郭晋安曾受访指&#xff0c;遇上欧倩怡前只有两段深刻的感情&#xff0c;一段是初恋&#xff0c;另一段则是刘小慧。 旧爱刘小慧懒…

贪吃蛇游戏(C语言实现)

目录 游戏效果展示文件代码的展示test.cSnake.cSnake.h 下一个坐标不是食物 游戏效果展示 QQ录屏20240507163633 文件 代码的展示 test.c #define _CRT_SECURE_NO_WARNINGS#include<locale.h> //设置本地化 #include"Snake.h"//游戏的测试逻辑 void test() {…

【服务治理中间件】consul介绍和基本原理

目录 一、CAP定理 二、服务注册中心产品比较 三、Consul概述 3.1 什么是Consul 3.2 Consul架构 3.3 Consul的使用场景 3.4 Consul健康检查 四、部署consul集群 4.1 服务器部署规划 4.2 下载解压 4.3 启动consul 五、服务注册到consul 一、CAP定理 CAP定理&#xff…

STM32使用ADC单/多通道检测数据

文章目录 1. STM32单片机ADC功能详解 2. AD单通道 2.1 初始化 2.2 ADC.c 2.3 ADC.h 2.4 main.c 3. AD多通道 3.1 ADC.c 3.2 ADC.h 3.3 main.c 3.4 完整工程文件 1. STM32单片机ADC功能详解 STM32单片机ADC功能详解 2. AD单通道 这个代码实现通过ADC功能采集三脚电…

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度&#xff0c;还增强了用户界面的动态性和交互性&#xff0c;允许开发者将应用界面划分为多个独立、可重用的部分&#xff0c;每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

无人直播需要什么软件系统?最新AI实景自动无人直播软件:智能化引领直播拓客新时代

随着互联网的快速发展&#xff08;无人直播招商加盟&#xff1a;hzzxar&#xff09;直播行业已经成为商家品牌推广和商品销售的热门方式。近年来&#xff0c;人工智能技术的飞速发展&#xff0c;催生了一款令人惊叹的AI实景自动无人直播软件&#xff0c;为商家提供了全新的直播…

2024视觉与学习青年学者研讨会(VALSE 2024)热点推文预告

视觉与学习青年学者研讨会&#xff08;VALSE&#xff09;是国内人工智能领域顶尖学者一年一度的研讨会。该会议的特点是大、全、新。会议的规模大&#xff0c;参会者达到五千人以上&#xff1b;会议的主题全&#xff0c;全面覆盖人工智能的各大领域&#xff1b;会议的内容新&am…

SQL奇难怪状知识点分享

SQL执行顺序 select 语句的完整结构&#xff1a; select 去重 要查询的字段 from表&#xff08;注意&#xff1a;表和字段可以取别名&#xff09; xxxx&#xff08;left/right/full&#xff09; join 要连接的表 on 等值判断&#xff08;顺序&#xff1a;先on再where&#x…

内存卡罢工,数据危机?别急,有救!

在日常生活和工作中&#xff0c;我们越来越依赖于各种电子设备来存储重要数据。其中&#xff0c;内存卡因其便携性和大容量而广受欢迎。然而&#xff0c;当内存卡突然损坏打不开时&#xff0c;我们该如何应对&#xff1f;本文将为您详细解析这一问题&#xff0c;并提供有效的解…

JAVA版本的ATM编程问题记录

前段时间用C语言写了个银行ATM系统&#xff0c;还写了一篇文章记录了一些&#xff0c;C语言的ATM文章。后来又用IDEA写了一个JAVA版本的银行ATM。有人就会问为啥浪费这个时间写ATM呢&#xff1f;&#x1f9d0;其实是我本科代码没学好&#xff0c;所以现在想利用比较熟悉的ATM系…

探秘编程之旅:Baidu Comate 智能代码助手的魔法揭秘

目录 Baidu Comate智能代码助手1.场景需求2.安装步骤3.功能介绍3.1 /指令3.2 插件3.3 #知识 4.使用体验5.总结 Baidu Comate智能代码助手 智能编程助手的意义在于提升编程体验和效率&#xff0c;使开发人员能够更轻松、更快速地完成编码任务&#xff0c;是如今人工智能技术的一…

Flink DataSink介绍

介绍 Flink DataSink是Apache Flink框架中的一个重要组件&#xff0c;它定义了数据流经过一系列处理后最终的输出位置。以下是关于Flink DataSink的详细介绍&#xff1a; 概念&#xff1a;DataSink主要负责对经过Flink处理后的流进行一系列操作&#xff0c;并将计算后的数据结…

Linux学习笔记1

1.背景认知 可能很多人还没有接触Linux&#xff0c;会有点畏惧&#xff0c;我们可以把Linux类比成Windows&#xff0c; 下面是Windows和Linux的启动对比 Windows&#xff1a;上电后一开始屏幕是黑黑的---bios在启动Windows----Windows之后找到c盘启动各种应用程序 Linux&am…

OFDM802.11a的FPGA实现(十)导频插入(含verilog和matlab代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 目录 1.前言2.插入导频原理3.硬件实现4.Matlab仿真5.ModelSim仿真6.结果对比验证7.verilog代码 1.前言 前面一篇文章完成了星座图的映射&#xff0c;今天继续设计后面的模块。在接收机…

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析 下图为keil编译后的结果&#xff1a; 单位为Byte。Code是程序大小。RO是常量大小。RW是读写变量占用大小&#xff0c;如已初始化的静态变量和全局变量。ZI是全零变量占用大小&#xff0c;如未初始化的static修饰的静态变量、全局…

聊聊BitLocker

最近有消息称微软决定在Windows 11 24H2中默认开启BitLocker&#xff0c;这个消息在网上引起了不小的波澜。有人说&#xff0c;对于我们这些普通用户来说&#xff0c;BitLocker真的有必要吗&#xff1f; 什么是BitLocker BitLocker 是一项 Windows 安全功能&#xff0c;可为整…

如何使用多协议视频汇聚/视频安防系统EasyCVR搭建智慧园区视频管理平台?

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化&#xff0c;将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…

如何制作有趣的gif?这个方法别错过

是否在社交媒体上看到过很多有趣好玩的gif动图&#xff0c;有的搞笑有趣有的又很可爱。大家有没有想过自己动手制作gif动画呢&#xff1f;接下来&#xff0c;就给大家分享一招gif在线制作&#xff08;https://www.gif5.net/&#xff09;的方法&#xff0c;超简单不需要下载任何…

什么牌子的洗地机质量最好?四款耐用高分产品推荐

洗地机具备了吸尘、擦拭、除菌等多种功能&#xff0c;可以一次完成多种清洁任务&#xff0c;帮助用户更高效地保持家居整洁&#xff0c;节省时间和精力&#xff0c;备受人们的喜爱。但是怎么挑选到优质的洗地机一直是大家关注的问题。今天&#xff0c;笔者将结合自己在家电行业…
最新文章