通过Docker启动DB2,并在Spring Boot整合DB2

1 简介

DB2是IBM的一款优秀的关系型数据库,简单学习一下。

2 Docker安装DB2

为了快速启动,直接使用Docker来安装DB2。先下载镜像如下:

docker pull ibmcom/db2:11.5.0.0

启动数据库如下:

docker run -itd \
  --name mydb2 \
	--privileged=true \
	-p 50000:50000 \
	-e LICENSE=accept \
	-e DB2INST1_PASSWORD=pkslow \
	-e DBNAME=testdb \
	ibmcom/db2:11.5.0.0

这样获得的数据库,具体信息如下:

连接URL:jdbc:db2://localhost:50000/testdb

用户名:db2inst1

密码:pkslow

在IDEA上连接如下:

默认的Schema为DB2INST1,测试SQL如下:

创建表:

CREATE TABLE EMPLOYEE_SALARY
(DEPTNO   CHAR(3)      NOT NULL,
 DEPTNAME VARCHAR(36)  NOT NULL,
 EMPNO    CHAR(6)      NOT NULL,
 SALARY   DECIMAL(9,2) NOT NULL WITH DEFAULT);

插入数据:

INSERT INTO EMPLOYEE_SALARY (DEPTNO, DEPTNAME, EMPNO, SALARY) VALUES ('001', 'IT', '001322', 80000.00);
INSERT INTO EMPLOYEE_SALARY (DEPTNO, DEPTNAME, EMPNO, SALARY) VALUES ('001', 'IT', '001323', 20000.00);
INSERT INTO EMPLOYEE_SALARY (DEPTNO, DEPTNAME, EMPNO, SALARY) VALUES ('002', 'Architecture', '001324', 3220.00);
INSERT INTO EMPLOYEE_SALARY (DEPTNO, DEPTNAME, EMPNO, SALARY) VALUES ('002', 'Architecture', '001325', 8000.00);
INSERT INTO EMPLOYEE_SALARY (DEPTNO, DEPTNAME, EMPNO, SALARY) VALUES ('003', 'Front Office', '001326', 13320.00);
INSERT INTO EMPLOYEE_SALARY (DEPTNO, DEPTNAME, EMPNO, SALARY) VALUES ('001', 'IT', '001327', 5433.00);

查询:

SELECT * FROM DB2INST1.EMPLOYEE_SALARY;

Spring Boot整合DB2

添加相关依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
    <groupId>com.ibm.db2</groupId>
    <artifactId>jcc</artifactId>
    <version>11.5.0.0</version>
  </dependency>
</dependencies>

配置相关属性:

server.port=8082
spring.datasource.url=jdbc:db2://localhost:50000/testdb
spring.datasource.username=db2inst1
spring.datasource.password=pkslow
spring.jpa.generate-ddl=true

创建Entity:

package com.pkslow.springboot.jpa.db2.entity;

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

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

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "EMPLOYEE", schema = "DB2INST1")
public class Employee {
    @Id
    private Long id;
    private String name;
}

创建Repository类用于操作数据库:

public interface EmployeeRepository extends CrudRepository<Employee, Long> {
}

最后,写个方法测试一下:

@Configuration
@Slf4j
public class TestConfig {
    @Autowired
    private EmployeeRepository repository;

    @PostConstruct
    public void init() {
        Employee employee1 = new Employee(1L, "Larry Deng");
        Employee employee2 = new Employee(2L, "LarryDpk");
        Employee employee3 = new Employee(3L, "Pkslow");

        repository.deleteAll();
        repository.save(employee1);
        repository.save(employee2);
        repository.save(employee3);

        List<Employee> employees = StreamSupport.stream(repository.findAll().spliterator(), false)
                .collect(Collectors.toList());

        employees.forEach(e -> log.info(e.toString()));

    }
}

启动后,日志打印正常如下:

2022-02-28 23:26:22.476  INFO 60847 --- [           main] c.pkslow.springboot.jpa.db2.TestConfig   : Employee(id=1, name=Larry Deng)
2022-02-28 23:26:22.476  INFO 60847 --- [           main] c.pkslow.springboot.jpa.db2.TestConfig   : Employee(id=2, name=LarryDpk)
2022-02-28 23:26:22.476  INFO 60847 --- [           main] c.pkslow.springboot.jpa.db2.TestConfig   : Employee(id=3, name=Pkslow)

表数据如下:

代码

代码请看GitHub: http://github.com/LarryDpk/pkslow-samples


References:

Docker Image

Statements Insert

本文转载于网络 如有侵权请联系删除

相关文章

  • 内网渗透基石篇--隐藏通信隧道技术

    来自|FreeBuf一.应用层隧道技术1.ssh隧道建立双向安全隧道将其他TCP端口的通信通过SSH连接转发 用SSH作为传输层协议,对流量自动加解密 突破防火墙访问规则的限制 SSH本地端口转发 本机侦听端口,访问转发到远程主机指定端口ssh-L-CfN<listenposrt>:<remoteip>:<remoteport>user@<sshserver>-p<sshserverport>#能够共享该隧道ssh-L-CfNg<listenposrt>:<remoteip>:<remoteport>user@<sshserver>-p<sshserverport> 基于建立起来的SSH隧道,隧道中断则端口转发中断复制只能在建立隧道时创建转发,不能为已有隧道增加端口转发远程端口转发远程侦听端口,访问转发到本机主机指定端口ssh-R-CfNg<listenposrt>:<remoteip>:<remoteport>user@<s

  • 怎样正确使用函数式接口@FunctionalInterface,让你的代码更优雅!

    导读:JDK1.8增加了很多特性,其中就有对接口增强和lambda表达式的支持阅读源码其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。 这种类型的接口也称为SAM接口,即SingleAbstractMethodinterfaces。关于@FunctionalInterface注解它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA8之前一般是用匿名类实现的): 错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,idea报错提示其不是函数式接口。 提醒:加不加@FunctionalInterface对于接口是不是函数式接口没有影响,该注解知识提醒编译器去检查该接口是否仅包含一个抽象方法 函数式接口里允许定义默认方法函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;如下代码不会报错:函数式接口里允许定义静态方法 函数式接口里是可以包含静态方法,因为静态方

  • Swift与JS通过WKWebView互调

    创建WKWebViewlazyvarwebView:WKWebView={ //创建WKPreferences letpreferences=WKPreferences() //开启js preferences.javaScriptEnabled=true //创建WKWebViewConfiguration letconfiguration=WKWebViewConfiguration() //设置WKWebViewConfiguration的WKPreferences configuration.preferences=preferences //创建WKUserContentController letuserContentController=WKUserContentController() //配置WKWebViewConfiguration的WKUserContentController configuration.userContentController=userContentController //给WKWebView与Swift交互起一个名字:callbackH

  • PHP 用户请求数据获取与文件上传

    我们上篇教程提到,要获取HTTP请求数据,可以通过$_GET、$_POST、$_REQUEST等PHP内置的超全局变量,如果要获取Cookie和文件上传信息,可以通过额外的$_COOKIE和$_FILES。今天,学院君就来给大家演示下如何使用这些超全局变量获取请求数据。1、GET请求参数我们知道,HTTPGET请求是没有请求实体(表单请求数据)的,所有对于GET请求来说,请求数据以URL查询字符串(QueryString)的形式提供的,所谓查询字符串,就是URL中?之后的请求参数,例如对下面这个URL请求来说:https://xueyuanjun.com/search?term=laravel复制term=laravel就是查询字符串,也就是GET请求参数。我们在http/index.php中通过var_dump($_GET)打印GET请求数据:<?php echo'<pre>'; //var_dump($_SERVER); var_dump($_GET);复制在http目录下通过php-Slocalhost:9000启动HTTP服务器,然后在

  • Node.js 部署和运维工作量降低 80%,腾讯 NOW 直播是怎么做到的?

    一、背景简介 首先解释一下几个名词:NGW(NodeGateway,Node前端接入层):IVWEB团队开发的内部前端业务接入层方案,目前处于腾讯内部开源状态。BFF(BackendForFrontend),通常指服务于前端的后端。SFF(SeverlessForFrontend),BFF架构的升华,落地到Serverless中。目前,NOW直播团队正在逐步接入NGW,完成BFF向SFF架构的演进。从前后端分离到BFF,前端的能力不断扩大,逐渐涉猎到后端和运维,对前端人员的技术能力要求也越来越高。NOW直播IVWEB团队从提升研发效率的角度,在调研了腾讯云Serverless之后,团队决定接入云函数SCF产品,对BFF架构结合Serverless进行了新的尝试。在SFF架构下,Node服务落地到Serverless,最大的收益者是前端开发人员:前端同学不再需要关注服务器的申请/维护/扩容;无需关心生产环境的搭建;真正做到专注业务逻辑的开发;自动扩容,零运维;接入工作量降低了80%。此前,团队已经通过开发Nest系统的聚合服务(Node服务的可视化管理)完成了BFF架构的演进。NGW作为

  • Redis之List

    Redis之List1.特点队列:先进先出栈:先进后出数组:LIndEXLSET阻塞:BLBR2.操作栈原则:lpushlpop:先进后出rpop:先进先出127.0.0.1:6379>lpushl1abcdef (integer)6 127.0.0.1:6379>lrangel10-1 1)"f" 2)"e" 3)"d" 4)"c" 5)"b" 6)"a" 127.0.0.1:6379>lpopl1 "f" 127.0.0.1:6379>lpopl1 "e" 127.0.0.1:6379>lpopl1 "d" 127.0.0.1:6379>lrangel10-1 1)"c" 2)"b" 3)"a" 127.0.0.1:6379>rpopl1 "a" 复制支持数组:127.0.0.1:63

  • 2018年政府采购服务器突破23亿元 谁是标王?

    近日,《政府采购信息报》披露了一组全国服务器政府采购的相关数据。根据《政府采购信息报》不完全统计,2018年全国服务器政府采购规模达到23.17亿元,同比增长6.3%,其中百万元以上的采购项目达到450个,千万元以上大项目达到25个,“国家税务总局云平台扩容项目”以1.81亿元的采购规模荣登2018年服务器政府采购项目标王。前十大采购项目均为北京地区众所周知,北京作为国家的首都,是政府机构最多的地区,也当之无愧的成为服务器政府采购规模第一的地区。2018年,北京地区服务器采购规模达到10.48亿元,占全国服务器政府采购规模的46.6%,前十大服务器政府采购项目不出意外的全部落在北京地区,百万元以上的服务器采购项目达到144个,占全国百万元以上项目的32%。2018年前十大服务器政府采购项目甘肃和福建位列2018年政府采购服务器规模的第二和第三。其中,甘肃地区的服务器政府采购项目数量最多,达到了409个,采购规模达到了1.99亿元;福建则达到192个,采购规模为1.4亿元。此外,广东、河南和云南的采购规模均超亿元。毫无疑问,第四季度作为传统的“突击花钱”期,当仁不让地成为服务器政府采购的

  • 数据库分库分表如何避免“过度设计”和“过早优化”

    作者:butterfly100 来源:www.cnblogs.com/butterfly100/p/9034281.html复制一、数据切分关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分水平(横向)切分1垂直(纵向)切分垂直切分常见有垂直分库和垂直分表两种。垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与“微服务治理”的做法相似,每个微服务使用单独的一个数据库。如图:垂直分表是基于数据库中的"

  • MongoDB 入门极简教程

    安装MongoDBWindowns、Ubuntu17.10下安装MongoDB教程在此MongoDB帮助 要想获取命令列表,在mongodb客户端中输入db.help():1>db.help()MongoDB统计信息要想获取MongoDB服务器的统计信息,在mongodb客户端中输入db.stat(): 1>db.stats()创建数据库use命令MongoDB用use+数据库名称的方式来创建数据库。use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。语法格式use语句的基本格式如下: useDATABASE_NAME范例创建一个名为mydb的数据库,使用use语句如下: 12345>usemydbswitchedtodbmydb#使用命令db检查当前选定的数据库。>dbmydb使用命令showdbs来检查数据库列表。 123>showdbslocal0.78125GBtest0.23012GB刚创建的数据库(mydb)没有出现在列表中。为了让数据库显示出来,至少应该插入一个文档。 12345>db.movie.insert({"

  • 全栈设计师技术Wiki之商业智能

    封面由ARKie智能生成,小编御用AI设计师。商业智能BI,BusinessIntelligence 此概念最早于1996年由加特纳集团(GartnerGroup)提出,加特纳集团将商业智能定义为:商业智能描述了一系列的概念和方法,通过应用基于事实的支持系统来辅助商业决策的制定。是一类由数据仓库、查询报表、数据分析、数据挖掘、数据备份和恢复等部分组成的、以帮助企业决策为目的技术及其应用。商业智能技术提供使企业迅速分析数据的技术和方法,包括收集、管理和分析数据,将这些数据转化为有用的信息,然后分发到企业各处。 在实践中,商业智能的概念不断被深化,目前,商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务经营决策的工具。在进行商业智能产品的设计的时候,我们会关注:1数据来源商业智能系统中的数据来自企业各个业务系统。例如商贸型企业,其商务智能系统数据包括业务系统的订单、库存、交易账目、客户和供应商信息等,以及企业所处行业和竞争对手的数据、其他外部环境数据。而这些数据可能来自企业的CRM、SCM等业务系统。2知识商业智能能够辅助的业务经营决策,既可以是操作层的,也可以是战术

  • 碎片化 | 第七阶段-11-小明的故事之集群、负载、并发-视频

    视频内容如清晰度低,可转PC网页观看高清版本:http://v.qq.com/x/page/h0500917nyz.html分布式、集群、高并发、负载、缓存、云端分布式:不同的功能,不同的业务,不同的模块,分别部署到不同的服务器上面复制集群:相同的功能,相同的业务,相同的模块,分别部署到不同的服务器上面复制并发:同一时刻,N多人,同时访问同一个功能,同一个业务复制负载:所有服务器,在某一个时间段内,所承受的负载访问量复制缓存:将数据持久化,方便用户查询,提供服务器性能和体验、响应速度复制云端:阿里云、腾讯云、乐视云、百度云....复制小明的故事

  • pandas_VS_Excel统计纵向与横向统计总分最大最小

    pandas_VS_Excel统计纵向与横向统计总分最大最小【问题】【要求】1.在表格的右边插入列“总分”“平均分”“最高”“最低”,横向计算每个人的各项指标2.在格格的下面插入行“合计”“最高分”“最低分”纵向计算所有人的各项指标3.输出Excel文件【代码】#-*-coding:UTF-8-*- """ 纵向计算和,平均 横向统计和,最大傎,最小值 """ importpandasaspd d=pd.read_excel('pandas_VS_Excel统计纵向与横向统计总分最大最小.xlsx') print(d) temp=d[['语文','数学','英语']] print(temp) print(temp.sum(axis=1)) d['总分']=temp.sum(axis=1) d['平均分']=temp.mean(axis=1) d['最高']=temp.max(axis=1)

  • pagehelper使用有误导致sql多了一个limit

      接口测试报告中发现时不时有一个接口报错,但再跑一次又没有这个报错了。报错信息是sql异常,sql中有两个limit。查看后台代码和XXmapper.xml,发现确实只有一个limit。一开始开发以为是数据的问题或者是jmeter的问题导致。。。赶着提测就先没理了。   我的第一想法是pagehelper的问题,后面通过查找网上资料,发现pagehelper使用startPage()把分页标识存放在threadlocal,若当前线程在未调用mybatis查询前发生异常了(pagehelper会拦截mybatis的sql,添加分页语句,sql操作完毕后删除threadlocal中的分页标识),另一个的请求会复用该线程,但threadlocal仍存在分页标识,故执行sql语句时会多了limit。   推荐修改:把startPage()语句与mapper语句连着写。 原文连接 https://www.jianshu.com/p/c1851ee14e4c

  • golang中的字符串

    0.1、索引 https://waterflow.link/articles/1666449874974 1、字符串编码 在go中rune是一个unicode编码点。 我们都知道UTF-8将字符编码为1-4个字节,比如我们常用的汉字,UTF-8编码为3个字节。所以rune也是int32的别名。 typerune=int32 复制 当我们打印一个英文字符hello的时候,我们可以得到s的长度为5,因为英文字母代表1个字节: packagemain import"fmt" funcmain(){ s:="hello" fmt.Println(len(s))//5 } 复制 但是当我们打印嗨的时候,会打印3个字节。因为使用UTF-8,这个字符会被编码成3个字节: packagemain import"fmt" funcmain(){ s:="嗨" fmt.Println(len(s))//3 } 复制 所以,我们使用len内置函数输出的并不是字符数,而是字节数。 下面看一个有趣的例子,我们都知道汉字符使用3个字节编码,分别是0xE5,0x97,0xA8。我们运行下面代码会得到

  • 8.C#知识点:委托和事件

    知识点目录==========>传送门 首先推荐两篇大牛写的委托和事件的博客,写的超级好!看了就包你看会,想学习的朋友直接看这两篇就足以,我自己写的是算是自己学习的纪录。   传送门==========》C#中的委托和事件                C#中的委托和事件续。   委托是什么? 委托是一个类,它定义了一种的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。 --摘自百度百科。 说白了委托和我们平常常见的类是差不多的东西。它也是一个类型,一个对象。委托定义类似定义一种方法模板。满足于这个模板的任何方法都可以赋值于委托。并且将这个委托当参数进行传递,进而把方法当参数传递。 publicdelegatevoiddeTest(stringname);复制 这就定义个没有返回值的委托。定义委托需要关键字delegate,这个关键字和我们定义的class关键字是一样的,记住是这样

  • Unknown command &#39;run&#39; - try &#39;help&#39;

    /******************************************************************************* *Unknowncommand'run'-try'help' *说明: *FSL的U-Boot进行了命令的精简导致run指令无法找到,在config文件添加就可以了, *有时候也有可能在配置的.h文件中进行配置。 * *2019-8-18深圳宝安西乡曾剑锋 ******************************************************************************/ *include/configs/<yourconfig>.h *configs/<yourconfig>_defconfig [...省略] CONFIG_CMD_RUN=n [...省略]复制  

  • Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

    SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程。在该例程序中,使用"Ctrl+c"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被告知: bind:Addressalreadyinuse 原因在于服务器重新启动时需要绑定地址: bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr)); 复制 而这个时候网络正处于TIME_WAIT的状态,只有在TIME_WAIT状态退出后,套接字被删除,该地址才能被重新绑定。TIME_WAIT的时间是两个MSL,大约是1~4分钟。若每次服务器重启都需要等待TIME_WAIT结束那就太不合理了,好在选项SO_REUSEADDR能够解决这个问题。 服务器端尽可能使用REUSEADD,在bind()之前调用setsockopt来设置SO_REUSEADDR套接字选项,使用SO_REUSEADDR选项可以使不必等待TIME_WAIT状态消失就可以重启服务器。 /*设置地址重复使用*/ inton=1;//on为1表示开启 if(setso

  • Dapper批量更新

    本次示例项目使用Dappe1.50.5和Dapper.Contrib1.50.5 数据库执行的脚本检测工具是SQLServerPrifiler 1.使用WhereIn实现批量更新 1.1代码如下: ///<summary> ///把多个用户的isvalid置为0 ///</summary> publicvoidUpdateUsersByWhereInTest() { varsql=@"UPDATEdbo.[user]SETisvalid=0WHEREUserIdIN@UserId;"; varuserIdArr=newint[]{3013,3012,3011,3010}; varres=Repository.Execute(sql,new{UserId=userIdArr}); Assert.True(res>0); } 复制 1.2检测到数据库执行的脚本 execsp_executesqlN'UPDATEdbo.[user] SETisvalid=0 WHEREUserIdIN(@UserId1,@UserId2,@UserId3

  • node.js 使用阿里镜像

    https://developer.aliyun.com/mirror/NPM

  • P2340 奶牛会展

      感觉这是一道挺好的dp。   拿到题第一眼,就看出来是一个01背包(显然每一个只能选择取或者不取),那么只要一个做体积,一个做价值,跑完取所有v>0状态中v+f[v]的最大值就可以了。但是,与普通的01背包有一点不同。   第一,这道题的容积有负的,这导致了dp转移方向的变化。想想平时为什么01背包从大往小,因为我更新这个状态用到了体积小的状态,而物品只能放一遍,自然要保证这个状态的更新不可以用到已经被这个物品更新的状态)。但是当体积出现负的时候,那么这个状态的更新就会用到大的体积,所以就要反向枚举体积了,这个是很好理解的。   我写的时候遇到了一个小问题——就是在选的过程中,和允许是负的。这就难办了——因为模拟体积的是数组下标,体积可以是负的,但是数组下标……为了解决这个问题,我们可以使用数组偏移的方法,也就是说用一个大值代表0,保证最小的数的绝对值小于这个代表0的数,最后结算的时候减去这个数就行了。   有个细节问题:就是如果这个体积是负的,反向枚举是从开始(我第一遍写的时候顺手就写了v[i]),以及上限是很大值+v[i],因为我们要保证,我们的j-v[i]必须是在初始化

  • Fizz Buzz in Tensorflow:一场奇怪的面试

    话说FizzBuzz是什么鬼? FizzBuzz是洋人小朋友在学除法时常玩的游戏,玩法是:从1数到100,如果遇见了3的倍数要说Fizz,5的倍数就说Buzz,如果即是3的倍数又是5的倍数就说FizzBuzz。 最后演变为一个编程面试题:写一个程序输出1到100,但是如果遇到数字为3的倍数时输出Fizz,5的倍数输出Buzz,既是3的倍数又是5的倍数输出FizzBuzz。 面试中 面试官:你好,在开始面试之前要不要来杯水或来杯咖啡提提神。 我:不用,咖啡啥的我已经喝的够多了,三鹿也喝了不少。 面试官:很好,很好,你不介意在小白板上写代码吧。 我:It’stheonlywayIcode! 面试官:…. 我:那只是个笑话。 面试官:好吧,你是否熟悉”fizzbuzz”。 我:…. 面试官:你到底知不知道”fizzbuzz”? 我:我知道”fizzbuzz”,我只是不敢相信这么牛叉的IT巨头竟然问这个问题。 面试官:OK,我要你现在写一个程序输出1到100,但是遇到数字为3的倍数时输出Fizz,5的倍数输出Buzz,既是3的倍数又是5的倍数输出FizzBuzz。 我:额,这个,我会! 面试官

相关推荐

推荐阅读