Spring Boot学习篇(四)

news2024/11/16 9:47:06

Spring Boot学习篇(四)

1 BLOB(二进制大类型)

1.1 创建tb_blob表,其sql语句如下所示

CREATE TABLE tb_blob(
  id number primary key,
  fname VARCHAR2(50) NOT NULL,
  f blob
)

1.2 在entity包下面创建TbBlob实体类

package com.zlz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Id;
import javax.persistence.Table;

@AllArgsConstructor
@NoArgsConstructor
@Data
//@Table(name="tb_blob") 制定查询时的表名
public class TbBlob {
    @Id
    private Integer id;
    private String fname;
    private byte[] f;//数据库blob对应java中的字节数组
}

1.3 在com包.zlz包.mapper包下创建TbBlobMapper接口

package com.zlz.mapper;

import com.zlz.entity.TbBlob;
import tk.mybatis.mapper.common.Mapper;

public interface TbBlobMapper extends Mapper<TbBlob> {
    int add(TbBlob b);
}

1.4 在mappers文件夹下创建TbBlobMapper.xml

1.4.1 创建后的目录结构如下所示

在这里插入图片描述

1.4.2 TbBlobMapper.xml内容如下

<?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.zlz.mapper.TbBlobMapper">
    <insert id="add">
        insert into tb_blob values(#{id},#{fname},
        #{f,typeHandler=org.apache.ibatis.type.BlobTypeHandler})
    </insert>
</mapper>

1.5 两种使用场景

1.5.1 将图片写入到数据库中

a 示例代码
@Autowired
TbBlobMapper tbBlobMapper;
//写进去的方法
@Test
public void blobTest() throws Exception {
    InputStream inputStream=new FileInputStream("C:\\Users\\SSS翱翔万里\\Pictures\\Camera Roll\\1.jpg");
    byte[] bs=new byte[inputStream.available()];
    inputStream.read(bs);
    TbBlob tbBlob = new TbBlob(10,"a.png",bs);
    tbBlobMapper.add(tbBlob);
}
b.控制台运行截图

在这里插入图片描述

c 数据库内容截图1

在这里插入图片描述

c.数据库内容截图2(点击了小圆点后出现的图片)

在这里插入图片描述

1.5.2 将图片从数据库从读出到指定目录中

a 示例代码
@Test
public void blobRead() throws Exception {
    TbBlob tbBlob = tbBlobMapper.selectByPrimaryKey(10);
    OutputStream os = new FileOutputStream("d:\\"+tbBlob.getFname());
    os.write(tbBlob.getF());
    os.close();
}
b.控制台运行截图

在这里插入图片描述

c 最终效果图

在这里插入图片描述

2 CLOB(文本类型)

2.1 创建tb_clob表,其sql语句如下所示

CREATE TABLE tb_clob(
  id number primary key,
  fname VARCHAR2(50) NOT NULL,
  f clob
)

2.2 在entity包下面创建TbClob实体类

package com.zlz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Id;

@AllArgsConstructor
@NoArgsConstructor
@Data
//@Table(name="tb_lob") 制定查询时的表名
public class TbClob {
    @Id
    private Integer id;
    private String fname;
    private String f;//数据库clob对应java中String
}

2.3 在com包.zlz包.mapper包下创建TbClobMapper接口

package com.zlz.mapper;

import com.zlz.entity.TbBlob;
import com.zlz.entity.TbClob;
import tk.mybatis.mapper.common.Mapper;

public interface TbClobMapper extends Mapper<TbClob> {

}

2.4 两种使用场景

2.4.1 将txt文本写入到数据库中

a 示例代码
@Autowired
   TbClobMapper tbClobMapper;
   @Test
   public void clob() throws Exception {
       //clob存储的是大量的文本信息
       InputStream inputStream=new FileInputStream("d:\\clobTest.txt");
       //将字节流转换成字符流
       Reader reader=new InputStreamReader(inputStream);
       BufferedReader bufferedReader=new BufferedReader(reader);
       //因为大量拼接,所以用StringBuilder
       StringBuilder stringBuffer = new StringBuilder();
       String s=null;
       while((s=bufferedReader.readLine())!=null){
          stringBuffer.append(s+"\r\n");
       }
       TbClob tbClob = new TbClob(10,"test.txt",stringBuffer.toString());
       tbClobMapper.insertSelective(tbClob);
   }
b.控制台运行截图

在这里插入图片描述

c 数据库内容截图1

在这里插入图片描述

c.数据库内容截图2(点击了小圆点后出现的文本内容)

在这里插入图片描述

2.4.2 将文本内容从数据库读出到指定目录中

a 示例代码
@Autowired
   TbClobMapper tbClobMapper;
@Test
    public void clobRead() throws Exception {
        //需要把信息查询到才行
        TbClob tbClob = tbClobMapper.selectByPrimaryKey(10);
        OutputStream os=new FileOutputStream("d:\\"+tbClob.getFname());
        //字节输出流转换成字符输出流 OutputStreamWriter
        OutputStreamWriter osw= new OutputStreamWriter(os);
        osw.write(tbClob.getF());
        osw.close();
    }
b.控制台运行截图

在这里插入图片描述

c 生成的文件的位置

在这里插入图片描述

d.生成文件的内容

在这里插入图片描述

3.调用存储过程

3.1 存储过程的出参为String类型

3.1.1 创立存储过程zz

-- 转账的存储过程
CREATE or replace procedure zz
(zh1 number,zh2 in number,money number,jg out varchar2)
as
 vzh1sal number;--用于接收转出账户的余额
 vcount number:=0;-- 累加受影响行数
begin
   select sal into vzh1sal from emp where empno=zh1;
   if vzh1sal<money then
     jg:='余额不足';
     return;
   end if;
   -- 余额足够 转账
   update emp set sal=sal-money where empno=zh1;
   vcount:=vcount+sql%rowcount;  
   update emp set sal=sal+money where empno=zh2; 
   vcount:=vcount+sql%rowcount;
   -- 判断是否操作成功
   if vcount=2 then
      jg:='转账成功';
      commit;
   else
      jg:='转账失败';
      rollback;
   end if;      
end;

3.1.2 在zlz包.mapper包下创建TbBlobMapper接口,其目录结构如下所示

在这里插入图片描述

3.1.3 在TbBlobMapper接口中创建zz方法

package com.zlz.mapper;
import tk.mybatis.mapper.common.Mapper;

import java.util.Map;

public interface TbBlobMapper extends Mapper<TbBlob> {
    //存储过程,要拿到out参数,必须使用map集合
    void zz(Map<String,Object> map);
}

3.1.4 在resource包.mappers包下创建TbBlobMapper.xml文件,其目录结构如下所示

在这里插入图片描述

3.1.5 在TbBlobMapper.xml里面创建zz方法所对应的select标签

<?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.zlz.mapper.TbBlobMapper">
     <!--
      PREPARED 使用预编译
      STATEMENT 没有预编译,可能导致注入攻击
      CALLABLE 执行存储过程
    -->
    <!--jdbcType是指定在数据库周中的类型 javaTyoe 在java中是什么类型-->
    <select id="zz" statementType="CALLABLE">
       call zz(#{zh1},#{zh2},#{money},#{jg,mode=OUT,jdbcType=VARCHAR})
    </select>
</mapper>

3.1.6 测试

a 转账失败
a.1 测试代码
@Autowired
    TbBlobMapper tbBlobMapper;
@Test
public void t1(){
   Map<String,Object> map=new HashMap();
   map.put("zh1", 7499);
   map.put("zh2", 1111);
   map.put("money", 100);
   map.put("jg", null);
   tbBlobMapper.zz(map);
   //拿到出参并打印
    System.out.println(map.get("jg"));
}
a.2 控制台运行截图

在这里插入图片描述

b 转账成功
b.1 测试代码
@Autowired
    TbBlobMapper tbBlobMapper; 
@Test
    public void t1(){
       Map<String,Object> map=new HashMap();
       map.put("zh1", 7369);
       map.put("zh2", 7499);
       map.put("money", 100);
       map.put("jg", null);
       tbBlobMapper.zz(map);
       //拿到出参并打印
        System.out.println(map.get("jg"));
    }
b.2 控制台运行截图

在这里插入图片描述

b.3 转账前数据表的数据

在这里插入图片描述

b.4 转账后数据表的数据

在这里插入图片描述

3.2 存储过程的出参为Cursor游标类型

3.2.1 创立存储过程p3

create or replace procedure p3
(losal number,hisal number,jg out sys_refcursor)
as
begin
  open jg for select * from emp where sal
       between losal and hisal;
end;

3.2.2 在zlz包.mapper包下创建EmpMapper接口,其目录结构如下所示

在这里插入图片描述

3.2.3 在EmpMapper接口中创建p3方法

package com.zlz.mapper;

import com.zlz.entity.Emp;
import tk.mybatis.mapper.common.Mapper;

import java.util.Map;

public interface EmpMapper extends Mapper<Emp> {
    //无论出参是什么类型,要想拿到出参的值,都得是map集合
    void p3(Map<String,Object> map);
}

3.2.4 在resource包.mappers包下创建EmpMapper.xml文件,其目录结构如下所示

在这里插入图片描述

3.2.5 在EmpMapper.xml里面创建p3方法所对应的select标签

<?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.zlz.mapper.EmpMapper">
    <!--返回的是一个游标 jdbcType、javaType都是必须要写的-->
    <select id="p3" statementType="CALLABLE">
        call p3(#{a},#{b},#{c,mode=OUT,jdbcType=CURSOR,resultMap=myemp,javaType=ResultSet})
    </select>
    <!--告诉结果对应员工表-->
    <resultMap id="myemp" type="emp">

    </resultMap>
</mapper>

3.2.6 测试

a 测试代码
@Test
public void p3(){
    Map<String,Object> map=new HashMap<>();
    map.put("a", 2000);
    map.put("b", 3000);
    //这句话是一定要的
    map.put("c", null);
    em.p3(map);
    //拿到结果
    List<Emp> list = (List<Emp>) map.get("c");
    for (Emp emp : list) {
        System.out.println(emp);
    }
}
b 控制台运行截图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式】NXP/LPC使用GPIO+定时器模拟UART串口接收

目录 一 项目背景 二 原理说明 三 设计实现--GPIO部分 四 设计实现--定时器部分 五 总结 一 项目背景 项目需要使用485串口编码器&#xff0c;编码器的数据以波特率9600持续向外发送。接收端计划使用485转换芯片MCU串口。但是片上的外设资源已经被占用了&#xff0c;没有多…

19.删除链表的倒数第N个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&#…

车辆未冲洗抓拍识别 工地车辆冲洗监测 opencv

车辆未冲洗抓拍识别 工地车辆冲洗监测系统t通过opencvpython可以对进出车辆冲洗情况进行自动识别&#xff0c;发现冲洗不合格自动进行抓拍存档。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API&#xff0c;结合了Op…

如何对美国服务器响应速度进行优化

决定一个网站加载速度的最大因素之一是服务器的响应时间。服务器响应时间是你的服务器响应用户请求的速度&#xff0c;它可以大大影响你网站的用户体验。本文中&#xff0c;我们将讨论如何确定美国服务器响应时间慢的原因&#xff0c;尤其是如何对美国服务器响应速度进行优化。…

初探Lua脚本

1、什么是Lua Lua脚本是一个由C语言编写的小巧脚本语言&#xff0c;在所有脚本引擎中&#xff0c;Lua的速度是最快的。Lua的核心代码不过一万多行&#xff0c;因为是C语言编写的&#xff0c;因此Lua可以在几乎所有的操作系统和平台进行编译运行 2、Lua适用场景 1&#xff09;…

minio分布式集群部署

minio分布式集群部署 分布式 Minio 可以让你将多块硬盘或者多台服务器组成一个对象存储服务。由于硬盘分布在不同的节点上&#xff0c;分布式 Minio 避免了单点故障。MinioMinio分布式模式可以帮助你搭建一个高可用的对象存储服务&#xff0c;你可以使用这些存储设备&#xff…

七种分布式系统的解决方案,一次性讲给你听!

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 TB级数据放在一台机器上&#xff1a;难啊&#xff01;到底啥是分布式存储&#xff1f;那啥又是分布式存储系统呢&#xff1f;天哪&#xff01;某台机器宕机了咋办&#xff1f;Master节点如何感知到数据副本消失…

nps内网穿透

nps服务端: linux, 公网ip npc客户端: windows, 内网 文件提取 链接&#xff1a;https://pan.baidu.com/s/1HgujpVoXpLxQ-IgAnI2Izg 提取码&#xff1a;8hyl nps安装 1.上传压缩包到服务器, 解压 2.修改conf文件夹下nps.conf文件 #HTTP(S) proxy port, no startup if em…

vue3 antd项目实战——Form表单使用【v-model数据的双向绑定,form表单嵌套input输入框、Radio单选框】

vue3 ant design vue项目实战——单选框&#xff08;Radio&#xff09;的使用以及Form表单的双向绑定知识调用&#xff08;form表单的源代码附在文章最后&#xff09;场景复现实现需求form表单整体架构的搭建input输入框文本域的嵌套单选组合Radio的嵌套button按钮组合的嵌套fo…

JVM 面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

C语言:预处理(1)

程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境&#xff1a; 第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第二种是执行环境&#xff0c;它用于实际执行代码。 翻译环境&#xff1a; 组成一个程序的每个…

MySQL 数据库练习题记录01

文章目录前言一、数据库练习题一1.1 表结构1.2 查询所有学生的信息(学号&#xff0c;姓名&#xff0c;性别&#xff0c;班级名称)1.3 查询所有人(包括没有成绩的学生)的课程分数(学号&#xff0c;姓名&#xff0c;性别&#xff0c;班级名称&#xff0c;语文分数&#xff0c;数学…

改进YOLOv5 | 引入密集连接卷积网络DenseNet思想 | 搭建密集连接模块

YOLOv5引入密集连接卷积网络DenseNet思想 CVPR 2017最佳论文 D e n s e N e t DenseNet DenseNet 论文地址:h

SpringBoot快速入门篇

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot快速入门篇 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王的主页…

手写 mini 版 Webpack

目录 1. mini 版 Webpack 打包流程 2. 创建 minipack.js 2.1 需要用到的插件库 2.1.1 babylon —— 解析 JavaScript 语法&#xff0c;生产 AST 语法树 2.1.2 babel-traverse —— 对 AST 进行遍历、转换的工具 2.1.3 transformFromAst —— 将 ES6、ES7 等高级的语法&am…

[Verilog]有限状态机设计举例

有限状态机设计举例 摘要&#xff1a;有限状态机&#xff08;FSM&#xff09;是许多数字系统中用来控制系统和数据流路径行为的时序电路。FSM的实例包括控制单元和时序。 本实验介绍了两种类型的FSM&#xff08;Mealy和Moore&#xff09;的概念&#xff0c;以及开发此类状态机的…

Codeforces Round #837 (Div. 2)

A. Hossam and Combinatorics 题目链接&#xff1a;Problem - A - Codeforces 样例输入&#xff1a; 2 5 6 2 3 8 1 6 7 2 8 3 2 10样例输出&#xff1a; 2 4题意&#xff1a;给定一个有n个元素的数组&#xff0c;然后让我们求出有多少对(i,j)满足|a[i]-a[j]|max|a[p]-q[q]…

Hudi学习01 -- Hudi简介及编译安装

文章目录Hudi简介Hudi概述Hudi特性Hudi使用场景Hudi编译安装安装Maven编译hudi修改pom文件修改源码兼容hadoop3解决spark模块依赖的问题hudi编译命令Hudi简介 Hudi概述 Apache Hudi (Hadoop Upserts Delete and Incremental) 是下一代流数据湖平台。Apache Hudi 将核心仓库和…

并发编程中用到的几种常见锁

没有加锁而造成的数据竞争 任务&#xff1a;使用10个线程&#xff0c;同时对一个count加100000&#xff1b;最后我们期望的结果是100000&#xff1b; 实验代码&#xff1a; #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <ti…

git项目 拉项目 提交 上传 保姆级教程

git 项目拉取提交 下载git https://git-scm.com/ 拉取代码 打开需要存代码的位置 右键 git bash打开git客户端 输入命令 git clone [复制的地址]上传代码 修改代码 方法一&#xff1a;命令行 打开对应的文件夹&#xff0c;右键打开git bash 拉取最新代码&#xff08;选…