相关文章推荐
玩足球的人字拖  ·  如何在Vue组件中调用封装好的外部js文件方 ...·  2 月前    · 
腼腆的柠檬  ·  SQL注入(二)手工注入流程,实战,文件读写 ...·  1 月前    · 
飘逸的米饭  ·  datetime和timestamp的区别-天翼云·  3 周前    · 
好帅的海龟  ·  pandas日常数据处理-天翼云·  1 周前    · 
谦逊的毛豆  ·  JS导出文本为文本文件-天翼云·  昨天    · 
爱笑的草稿本  ·  2的5次方在c++中如何表示 - CSDN文库·  6 月前    · 
豪爽的牛肉面  ·  QComboBox下拉项文本重叠_qcomb ...·  1 年前    · 
纯真的核桃  ·  php中如何使用pdo的方式连接并操作mys ...·  1 年前    · 
无邪的猴子  ·  混合应用程序疑难解答 - WPF .NET ...·  1 年前    · 
曾经爱过的松树  ·  shell 打印偶数行-奇数行 ...·  1 年前    · 
Code  ›  MyBatis 示例之存储过程(一)-天翼云
mybatis jdbc 存储过程 天翼
https://www.ctyun.cn/zhishi/p-225032
好帅的饺子
1 年前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 算力套餐 NEW 让算力触手可及
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云·创新直播间 NEW 与专家共同解读云计算领域前沿趋势
  • 新客特惠 NEW 全场热销云主机2.5折!
  • 天翼云电脑专场 HOT 移动办公神器天翼云电脑4核8G畅享3个月只要130元起!
  • 云主机特惠 HOT 多款云主机新老同享,满足您的上云需求!
免费活动
  • 企业免费试用专区 HOT 数十款产品免费试用,完成企业实名认证领取2000元试用金!
  • 个人免费试用专区 HOT 完成个人实名认证即可获得1000元试用金!
  • 新客特惠 全场云主机2.5折起
  • 云上安全专场 安全产品全场6折起!

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务。
进入甄选商城 进入云市场
办公协同
  • WPS云文档天翼云版 翼企云( License版) 天翼云企业云盘(标准服务版) 蓝信安全移动工作平台(SAAS) SSL证书 新域名服务 税务风控云 商企云财税(SAAS版) 翼云加速-标准版包月套餐 天翼云管家2.0 天翼云管家 翼备份(SaaS版)300G 智慧工厂_生产流程管理解决方案 天翼智慧工地 天翼全栈混合云敏捷版(软件) 天翼全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云诸葛AI平台 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台 AI创作间
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

MyBatis 示例之存储过程(一)

首页 知识中心 存储 文章详情页

MyBatis 示例之存储过程(一)

2023-06-15 06:47:55 阅读次数:21

mybatis, sql, 存储

本示例是《MyBatis 从入门到精通》​书中第一个存储过程的例子,有关本示例的基础环境,可以从 ​​http://mybatis.tk​​​ 或者 ​​https://github.com/mybatis-book/book​​ 获取,示例源码在 simple-all 中。

存储过程在数据库中比较常见,虽然大多数存储过程比较复杂,但是使用 MyBatis 调用时,用法都一样,因此我们这一节使用一个简单的存储过程来了解 MyBatis 中存储过程的使用方法。

存储过程涉及表 sys_user,建表语句如下。

DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
`user_password` varchar(50) DEFAULT NULL COMMENT '密码',
`user_email` varchar(50) DEFAULT 'test@mybatis.tk' COMMENT '邮箱',
`user_info` text COMMENT '简介',
`head_img` blob COMMENT '头像',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE= InnoDB AUTO_INCREMENT=1035 DEFAULT CHARSET=utf8 COMMENT='用户表';

准备测试数据如下。

INSERT INTO `sys_user` VALUES ('1', 'admin', '123456', 'admin@mybatis.tk', '管理员用户', 0x1231231230, '2016-06-07 01:11:12');
INSERT INTO `sys_user` VALUES ('1001', 'test', '123456', 'test@mybatis.tk', '测试用户', 0x1231231230, '2016-06-07 00:00:00');

对应实体类​ ​SysUser​ ​如下:

/**
* 用户表
*/
public class SysUser implements Serializable
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long id;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String userPassword;
/**
* 邮箱
*/
private String userEmail;
/**
* 简介
*/
private String userInfo;
/**
* 头像
*/
private byte[] headImg;
/**
* 创建时间
*/
private Date createTime;
//省略 getter 和 setter

建存储过程

我们先创建如下的存储过程。

# 第一个存储过程
# 根据用户 id 查询用户其他信息
# 方法看着很奇葩,但是展示了多个输出参数
DROP PROCEDURE IF EXISTS `select_user_by_id`;
DELIMITER ;;
CREATE PROCEDURE `select_user_by_id`(
IN userId BIGINT,
OUT userName VARCHAR(50),
OUT userPassword VARCHAR(50),
OUT userEmail VARCHAR(50),
OUT userInfo TEXT,
OUT headImg BLOB,
OUT createTime DATETIME)
BEGIN
# 根据用户 id 查询其他数据
select user_name,user_password,user_email,user_info,head_img,create_time
INTO userName,userPassword,userEmail,userInfo,headImg,createTime
from sys_user
WHERE
END;
DELIMITER ;

创建XML方法

<select id="selectUserById" statementType="CALLABLE" useCache="false">
{call select_user_by_id(
#{id, mode=IN},
#{userName, mode=OUT, jdbcType=VARCHAR},
#{userPassword, mode=OUT, jdbcType=VARCHAR},
#{userEmail, mode=OUT, jdbcType=VARCHAR},
#{userInfo, mode=OUT, jdbcType=VARCHAR},
#{headImg, mode=OUT, jdbcType=BLOB, javaType=_byte[]},
#{createTime, mode=OUT, jdbcType=TIMESTAMP}
)}
</select>

在调用存储过程的方法中,我们需要把 ​ ​statementType​ ​​ 设置为 ​ ​CALLABLE​ ​​,在使用 ​ ​select​ ​​ 元素中调用存储过程时,由于存储过程方式不支持 MyBatis 的二级缓存(后面章节会介绍),为了避免缓存配置导致出错,我们直接将 ​ ​select​ ​​ 元素的 ​ ​useCache​ ​​ 属性设置为 ​ ​false​ ​。

在存储过程中使用参数时,除了写上必要的属性名外,还必须指定参数的 ​ ​mode​ ​​(模式),可选值为 IN、OUT、INOUT 三种,入参使用 IN,出参使用 OUT,输入输出参数使用 INOUT。从上面代码可以轻易看出 IN 和 OUT 的两种模式的区别,那就是 OUT 模式的参数,必须指定 jdbcType。这是因为在 IN 模式下,MyBatis 提供了默认的 ​ ​jdbcType​ ​​,在 OUT 模式下没有提供,因此必须指定 ​ ​jdbcType​ ​​,另外在使用 Oracle 数据库时,如果入参存在 null 的情况,那么也必须指定 ​ ​jdbcType​ ​。

除了上面提到的这几点外,​ ​headImg​ ​​ 还特别设置了 ​ ​javaType​ ​​。在 MyBatis 映射的 Java 类中我们都不推荐使用基本类型,但是数据库 BLOB 类型对应的 Java 类型我们通常都是写成 byte[] 字节数组,因为 byte[] 数组不会有默认值的问题,所以不会影响我们一般的使用。但是在不指定 ​ ​javaType​ ​​ 的情况下,MyBatis 默认使用 ​ ​Byte​ ​​ 类型。由于我们使用的 ​ ​byte​ ​​ 是基本类型,所以设置 ​ ​javaType​ ​​ 的时候,基本类型要使用带下划线方式的类型,在这里就是 ​ ​byte[]​ ​​,​ ​_byte​ ​​ 对应的是基本类型,​ ​byte​ ​​ 对应的是 ​ ​Byte​ ​​ 类型,在使用 ​ ​javaType​ ​ 时一定要注意。

/**
* 使用存储过程查询用户信息
*
* @param user
* @return
void

因为我们这个存储过程没有返回值(不要和出参混淆),所以我们返回值类型使用 void,如果你把返回值设置为 ​ ​SysUser​ ​​ 或 ​ ​List<SysUser>​ ​​ 也不会报错,但是任何时候返回值都是 ​ ​null​ ​。

@Test
public void testSelectUserById(){
SqlSession sqlSession = //获取SqlSession的方法
try {
//这个例子的XML和接口都定义在UserMapper中
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser user = new SysUser();
user.setId(1L);
userMapper.selectUserById(user);
Assert.assertNotNull(user.getUserName());
System.out.println("用户名:" + user.getUserName());
} finally

执行测试,输出如下日志:

DEBUG [main] - ==>  Preparing: {call select_user_by_id( ?, ?, ?, ?, ?, ?, ? )} 
DEBUG [main] - ==> Parameters: 1(Long)
用户名:admin

使用出参方式的时候,通常情况下我们会使用对象中的属性接收出参的值,或者使用 ​ ​Map​ ​​ 类型方法入参接收返回值。这两种情况下有很大的区别。当我们使用 POJO 对象接收出参时,我们必须保证所有出参在 POJO 中都有对应的属性存在,否则就会抛出类似 ​ ​“Could not set property 'xxx'”​ ​​的错误,这是由于 POJO 对象中不存在出参对应的 setter 方法导致的。使用 Map 类型时就不需要必须存在该属性,当 Map 接收了存储过程的出参时,可以通过 ​ ​Map​ ​​ 对象的 ​ ​get("属性名")​ ​ 方法获取出参的值。

除了上面提到的错误外,当你在执行存储过程时,还可能会遇到下面的错误:

​ ​Parameter number x is not an OUT parameter​ ​

这个错误可能的原因是因为你调用的存储过程不存在,或者 MyBatis 中写的出参和数据库存储过程的出参对应不上而导致的。

版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/isea533/5602644,作者:isea533,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

上一篇: MyBatis 示例之存储过程(二)

下一篇: MyBatis的一级缓存和二级缓存(十三)

相关文章

2023-7-27

JDBC链接数据库

JDBC 简介JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准

2023-7-27

JDBC的CRUD操作之PreparedStatement的修改操作

1.1 JDBC的CRUD操作之PreparedStatement的修改操作 1.1.1 修改操作代码实现 已知表数据 修改 id=5 的用户信息

2023-7-27

Mybatis快速入门

文章目录​​1. MyBatis开发步骤​​​​2. Mybatis 映射文件概述​​1. MyBatis开发步骤MyBatis官网地址:http://www.mybatis.org/mybatis-3/添加MyBatis的坐标创建user

mybatis spring
2023-7-27

Oracle数据库的体系结构

文章目录1. Oracle数据库的体系结构2. Oracle和MySQL的区别1. Oracle数据库的体系结构数据库: ​​database​​ Oracle 数据库是数据的物理存储。这就包括(数据文件​​ORA​​或者 ​​DBF​​

oracle
2023-7-28

Cause: org.apache.ibatis.type.TypeException: Error setting non null for xxx with JdbcType错误的详细解决方法

Cause: org.apache.ibatis.type.TypeException: Error setting non null for xxx with JdbcType错误的详细解决方法

mybatis spring
2023-7-28

全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法

全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法

mybatis mysql
2023-7-28

mybatis框架针对字符串的null和““的传参带来的不可预测的隐含的问题

mybatis框架针对字符串的null和““的传参带来的不可预测的隐含的问题

mybatis mysql
2023-7-26

JDBC配置信息提取到配置文件

1.1 JDBC的配置信息提取到配置文件 1.1.1 配置文件 属性文件 格式:扩展名是.properties内容:key=valueXML文件 1.1.2 提取信息到配置文件 定义一个配置文件,在s

2023-7-26

JDBC的CRUD操作之PreparedStatement的删除操作

1.1 JDBC的CRUD操作之PreparedStatement的删除操作 1.1.1 删除操作的代码实现

2023-7-26

JDBC的CRUD操作之删除数据操作

JDBC的CRUD操作之删除数据操作

作者介绍

天翼云小翼
天翼云用户

文章

24411

阅读量

1049288

查看更多

最新文章

nocodb minio 集成试用

2023-7-23

添加NetApp存储到cinder后端

2023-7-23

KVM虚拟化笔记(十五)------kvm虚拟化存储池配置

2023-7-11

minio gataway 模式快速提供s3 兼容的文件服务

2023-7-13

解析ESX SERVER故障数据恢复方法

2023-7-13

出现ESXi系统无法连接FreeNAS的情况?90%以上的人都做错了!

2023-7-13

查看更多

热门文章

深入浅出: 大小端模式

2022-8-24

mysql列存储引擎-支持自定义函数-需求分析

2023-5-29

MySQL技术内幕 InnoDB存储引擎:行锁的3种算法

2023-5-8

java+内存分配及变量存储位置的区别

2023-4-5

mysql列存储引擎-exists结果错误-问题分析

2023-5-8

Docker学习-Docker存储

2023-3-22

查看更多

热门标签

mysql redis linux Oracle nginx docker
查看更多

相关产品

弹性云主机

随时自助获取、弹性伸缩的云服务器资源

天翼云电脑(公众版)

便捷、安全、高效的云电脑服务

对象存储

高品质、低成本的云上存储服务

云硬盘

为云上计算资源提供持久性块存储

查看更多

随机文章

mysql列存储引擎-POC-查询数据错误追踪

MyBatis 示例之存储过程(二)

MySql 存储过程 临时表 无法插入数据

hdfs 相关概念

存储相关

【RocketMQ入门到精通】— RocketMQ初级特性能力 | Message Persistence,消息中间件通常采用的几种持久化方式,可以存到数据库里面甚至redis里,你知道不?

推荐助力领好礼 邀请好友完成推荐任务 最高可得千元电信卡
查看详情
  • 7*24小时售后
  • 无忧退款
  • 免费备案
  • 专家服务
售前咨询热线
400-810-9889转1
  • 天翼云APP 微信公众号
服务与支持
  • 备案中心
  • 售前咨询
  • 智能客服
  • 自助服务
  • 工单管理
  • 客户公告
账户管理
  • 管理中心
  • 订单管理
  • 余额管理
  • 发票管理
  • 充值汇款
  • 续费管理
快速入口
  • 文档中心
  • 最新活动
  • 免费试用
  • 安全专区
  • 信任中心
  • 天翼云学堂
云网生态
  • 甄选商城
  • 渠道合作
  • 云市场合作
了解天翼云
  • 关于天翼云
  • 天翼云APP
  • 服务案例
  • 新闻资讯
  • 联系我们
  • 校园招聘
热门产品
  • 弹性云主机
  • 边缘安全加速平台
  • 天翼云电脑
  • 天翼云手机
  • 关系型数据库
  • 对象存储
  • 云硬盘
  • Web应用防火墙
  • 服务器安全卫士
  • 天翼云办公
热门推荐
  • 云服务备份
  • 云空间
  • 全站加速
  • 安全加速
  • 超融合服务-iStack
  • 智能边缘云
  • 应用编排服务
  • 微服务引擎
  • 共享流量包
更多推荐
  • web应用防火墙
  • 密钥管理
  • 等保咨询
  • 安全专区
  • 应用运维管理
  • 云日志服务
  • 云网融合
  • 云搜索服务
  • 数据湖探索
  • 数据仓库服务
友情链接
  • 天翼云盘
  • 天翼企业云盘
  • 189邮箱
  • 中国电信集团
©2023 京ICP备 2021034386号
 
推荐文章
玩足球的人字拖  ·  如何在Vue组件中调用封装好的外部js文件方法-天翼云
2 月前
腼腆的柠檬  ·  SQL注入(二)手工注入流程,实战,文件读写-天翼云
1 月前
飘逸的米饭  ·  datetime和timestamp的区别-天翼云
3 周前
好帅的海龟  ·  pandas日常数据处理-天翼云
1 周前
谦逊的毛豆  ·  JS导出文本为文本文件-天翼云
昨天
爱笑的草稿本  ·  2的5次方在c++中如何表示 - CSDN文库
6 月前
豪爽的牛肉面  ·  QComboBox下拉项文本重叠_qcombobox setview 下拉列表重叠_甩你十万八千里的博客-CSDN博客
1 年前
纯真的核桃  ·  php中如何使用pdo的方式连接并操作mysql数据库的方法_徊忆羽菲的博客-CSDN博客
1 年前
无邪的猴子  ·  混合应用程序疑难解答 - WPF .NET Framework | Microsoft Learn
1 年前
曾经爱过的松树  ·  shell 打印偶数行-奇数行 ,打印行号-阿里云开发者社区
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号