mybatis使用存储过程

文章出处 :  https://blog.csdn.net/m0_37561039/article/details/83716915

在讲解mybatis的存储过程调用之前谈谈存储过程的优劣:

优点
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行 增删改查 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。

3.存储过程可以重复使用,可减少数据库开发人员的工作量。

4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 

缺点
1:调试麻烦,但是用 PL/SQL Developer 调试很方便,能够弥补这个缺点。

2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

4:如果在一个程序系统中大量的使用存储过程,到程序交付后,生产环境中随着用户需求的增加会导致数据结构的变化,此时要修改存储过程来满足变化后的需求,此时的代价将非常巨大,所以存储过程不是越多越好。

 

然后是存储过程的创建、显示数据库中的所有存储过程、列出存储过程的详细信息、删除存储过程

 

创建
CREATE PROCEDURE batch_insert()
BEGIN
DECLARE i INT DEFAULT 2;
WHILE i < 10000
DO 
INSERT INTO t_book VALUE(null,i,CONCAT("书名:",ROUND(RAND()*10000)),CONCAT("作者:",ROUND(RAND()*10000)),ROUND(RAND()*10000),NOW(),'历史',ROUND(RAND()*100000),(totalStore-125),'houniao1.jpg',CONCAT("简介:",ROUND(RAND()*10000)),1);
SET i=i+1;
END WHILE;
COMMIT;
END
以上存储过程是向t_book插入10000条数据,

t_book的ddl:

DROP TABLE IF EXISTS `t_book`;
CREATE TABLE `t_book` (
  `key_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `book_id` bigint(20) DEFAULT NULL,
  `book_name` varchar(30) DEFAULT NULL,
  `book_author` varchar(20) DEFAULT NULL,
  `book_price` int(10) DEFAULT NULL,
  `publish_date` date DEFAULT NULL,
  `book_kind` varchar(20) DEFAULT NULL,
  `total_store` int(11) DEFAULT NULL,
  `total_sold` int(11) DEFAULT NULL,
  `book_pic` varchar(255) DEFAULT NULL,
  `book_profile` varchar(255) DEFAULT NULL,
  `book_status` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
显示数据库中的所有存储过程
show procedure status where db='数据库名';

显示存储过程的详细内容
SHOW CREATE PROCEDURE `存储过程名`;--注意此处包裹存储过程名的标点符号是Esc键下面的那个的键!!!

删除存储过程
DROP PROCEDURE IF EXISTS `存儲過程名`

下面以一个简单查询来演示mybatis使用存储过程的过程

实体类:

public class Book implements Serializable{
    private static final long serialVersionUID = 597733879789573558L;
    private Long id;
    private Long bookId;
    private String bookName;
    private String bookAuthor;
    private Integer bookPrice;
    private String publishDate;//注意实体类的publishDate是String类型,而数据库中的publish_date是DATE类型
    private String bookKind;
    private Integer totalStore;
    private Integer totalSold;
    private String bookPic;
    private String bookProfile;
    private Boolean bookStatus;
    //省略setter、getter和构造器
}
数据库表t_book 的ddl在 ‘t_book的ddl‘ 如上已经列出!!!

根据书的bookId查询书的其他信息的存储过程

DROP PROCEDURE IF EXISTS `findBookByBookId`;
DELIMITER //
CREATE PROCEDURE `findBookByBookId`(
    IN bookId BIGINT,
    OUT id BIGINT,
    OUT bookName VARCHAR(20),
    OUT bookAuthor VARCHAR(20),
    OUT bookPrice int,
    OUT publishDate date,
    OUT bookKind VARCHAR(20),
    OUT totalStore INTEGER,
    OUT totalSold INTEGER,
    OUT bookPic VARCHAR(100),
    OUT bookProfile VARCHAR(255),
    OUT bookStatus tinyint(1)
)
BEGIN
SELECT key_id,book_name,author,price,publish_date ,kind,total_store ,total_sold ,pic,book_profile,book_status
INTO id, bookName,bookAuthor,bookPrice,publishDate,bookKind,totalStore,totalSold,bookPic,bookProfile,bookStatus
FROM t_book
WHERE book_id=bookId;
END
//
DELIMITER;
mybatis的mapper文件查询语句即结果映射,mapper的namespace值为com.ss.dao.BookMapper

<select id="selectBookByBookId" statementType="CALLABLE" useCache="false">
    {call findBookByBookId(
        #{bookId,mode=IN},
        #{id,mode=OUT,jdbcType=BIGINT},
        #{bookName,mode=OUT,jdbcType=VARCHAR},
        #{bookAuthor,mode=OUT,jdbcType=VARCHAR},
        #{bookPrice,mode=OUT,jdbcType=INTEGER,javaType=java.lang.Integer},
        #{publishDate,mode=OUT,javaType=java.lang.String,jdbcType=DATE},
        #{bookKind,mode=OUT,jdbcType=VARCHAR},
        #{totalStore,mode=OUT,jdbcType=INTEGER},
        #{totalSold,mode=OUT,jdbcType=INTEGER},
        #{bookPic,mode=OUT,jdbcType=VARCHAR},
        #{bookProfile,mode=OUT,jdbcType=VARCHAR},
        #{bookStatus,mode=OUT,jdbcType=TINYINT,javaType=java.lang.Boolean}
    )}
</select>

junit测试代码

@Test
public void findBookByBookId(){
    Book book = new Book();
    book.setBookId(28L);
    session.selectOne("com.ss.dao.BookMapper.selectBookByBookId", book);
    System.out.println(book);
}

注意:这里只能传入Book的对象做为参数,此book对象的各个属性接受返回的结果,最终打印结果和数据库的记录如下

Book [id=28, bookId=28, bookName=书名:9326, bookAuthor=作者:5098, bookPrice=7512, publishDate=2018-10-30, bookKind=恐怖, totalStore=22682, totalSold=22557, bookPic=houniao1.jpg, bookProfile=简介:8804, bookStatus=true]

以上就是mybatis使用存储过程的全部内容
--------------------- 
原文:https://blog.csdn.net/m0_37561039/article/details/83716915 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值