首页
碎碎念
东邻西舍
本站信息
前来吐槽
统计
Search
1
openwrt系统上安装第三方插件
26,761 阅读
2
ubuntu下zerotier的基本使用教程
13,581 阅读
3
给小米R3G更换系统:从padavan刷成openwrt
12,849 阅读
4
openwrt使用第一步:设置上网拨号
10,744 阅读
5
openwrt无线中继功能:实现不插网线就能上网
9,522 阅读
学习点滴
Java
Web前端
Linux
踩坑实录
折腾搞机
关于建站
只言片语
登录
Search
标签搜索
Linux
建站
Java
踩坑实录
Ubuntu
MySQL
折腾搞机
HTML
CSS
MyBatis
Spring
SQL
Nginx
路由器
树莓派
OpenWrt
Maven
Git
Win10
只言片语
知识分子没文化
累计撰写
83
篇文章
累计收到
152
条评论
首页
栏目
学习点滴
Java
Web前端
Linux
踩坑实录
折腾搞机
关于建站
只言片语
页面
碎碎念
东邻西舍
本站信息
前来吐槽
统计
搜索到
17
篇与
的结果
2021-07-25
SQL系列总结(一):DDL(数据定义语言)
前排提示: 本篇博客篇幅较长,建议结合目录进行阅读! 目录 前言 SQL简介 数据字典 定义: 0x01.模式 创建模式——CREATE SCHEMA 删除模式——DROP SCHEMA 0x02.基本表 数据类型 创建表 删除表 修改表 0x03.索引 索引类型 建立索引 修改索引名称 删除索引 0x04.视图 定义 特征 几个概念 创建视图 查询视图 更新视图 删除视图 总结 环境说明: 数据库:Mysql 5.5 连接软件:Navicat 前言 SQL总结系列目录: SQL系列总结(一):DDL(数据定义语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(二):DQL(数据查询语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(三):DML(数据操纵语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(四):DCL(数据控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL系列总结(五):TCL(事务控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com) SQL简介 SQL(Structured Query Language),称为结构化查询语言,是关系数据库的标准语言。其功能不仅仅是查询,而是包括数据库模式创建、数据库数据的插入与修改、数据库安全性完整性控制等一系列功能。 目前没有一个关系数据库系统(RDBMS)能够支持SQL标准的所有概念和特性。大部分数据库系统能支持SQL/92标准的大部分功能以及SQL99、SQL2003中的部分新概念。同时许多软件厂商对SQL基本命令集还进行了不同程度的扩充和修改,又可以支持标准以外的一项功能特性。因此,使用具体数据库系统时还需要参考相应的官方文档。 SQL总共由以下几部分组成: 数据查询语言(DQL: Data Query Language):其语句也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。 数据操纵语言(DML:Data Manipulation Language):用于添加、修改和删除。 数据控制语言(DCL:Data Control Language):实现权限控制,确定单个用户和用户组对数据库对象的访问。 数据定义语言(DDL:Data Definition Language):在数据库中创建新表或修改、删除表(CREATE TABLE 或 DROP TABLE);为表加入索引等。 数据字典 定义: 数据字典是关系型数据库内部的一组系统表,他记录数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整约束定义、各类用户对数据库的操作权限、统计信息等。 关系型数据库在执行SQL的数据定义语句时,实际上就是更新数据库字典表中的相应信息。 进行查询优化和查询处理时,数据字典中的信息是其重要依据。 本篇只涉及到DDL,即数据定义语言。如无特别说明,本篇博客中方括号内容表示可选内容。 SQL中的数据定义功能包括模式定义、表定义、视图和索引定义。 0x01.模式 创建模式——CREATE SCHEMA CREATE SCHEMA <模式名> AUTHORIZATION <用户名>; 若不指定模式名,则默认为用户名 用户需要有数据库管理员权限或者获得了管理员授予的CREATE SCHEMA权限才能创建模式 定义模式实际上定义了一个命名空间,用户在创建模式的同时可以在这个模式中创建基本表、视图、定义授权等。即: CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>]; 删除模式——DROP SCHEMA DROP SCHEMA <模式名> <CASCADE|RESRICT>; # CASCADE(级联)和 RESTICT(限制)两者必选其一 0x02.基本表 数据类型 数据类型 含义 CHAR(n),CHARACTER(n) 长度为n的定长字符串 VARCHAT(n),CHARACTERVARYING(n) 最大长度为n的变长字符串 CLOB 字符串大对象 BLOB 二进制大对象 INT,INTEGER 长整数(4字节) SMALLINT 短整数(2字节) BIGINT 大整数(8字节) NUMERIC(p,d) 定点数,由p位数字(不包括小数点、符号)组成,小数点后面有d位数字 DECIMAL(p,d),DEC(p,d) 同NUMERIC REAL 取决于机器精度的单精度浮点数 DOUBLE PRECISION 取决于机器精度的双精度浮点数 FLOAT(n) 可选精度的浮点数,精度至少为n位数字 BOOLEAN 布尔类型 DATE 日期,包含年、月、日,格式为YYYY-MM-DD TIME 时间,包含一日的时、分、秒,格式为HH:MM:SS TIMESTAMP 时间戳 INTERVAL 时间间隔类型 这里要说明的是,不同的数据库产品支持的数据类型并不完全相同,具体使用时还需参考官方文档。 创建表 CREATE TABLE <表名> (<列名1> <数据类型> [列级完整性约束条件1], <列名2> <数据类型> [列级完整性约束条件2], ... [<表级完整性约束条件>]); 附:常用到的与表有关的约束条件: NOT NULL:非空约束 UNIQUE:唯一约束 PRIMARY KEY:主键约束 FROEIGN KEY:外键约束 CHECK:校验约束 查看当前数据库有多少表: # 选中某一个数据库 USE <数据库名>; # 查看该数据库的所有表 SHOW TABLES; 删除表 DROP TABLE <表名> [RESTRICT|CASCADE]; RESTRICT与CASCADE的区别: RESTRICT指限制删除,表示该表的删除是有限制条件的:即该表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能存在依赖于该表的对象,比如视图、触发器、存储过程或者函数等。只有当这些限制条件不存在时,才能允许删除。 CASCADE指级联删除,加上此参数之后则该表的删除没有限制条件。在删除基本表的同时,相关的对象,例如视图等,都将被一起删除。 如果不指定删除类型时,默认是RESTRICT。 修改表 这里的修改针对的是基本表的结构(如添加删除列、或者修改数据类型),并不是基本表的数据。对于基本表数据的修改属于DML的范围,本篇博客只涉及到DDL。 添加新列 ALTER TABLE <表名> ADD [COLUMN] <新列名> <数据类型> [完整性约束]; # 给已存在的列添加列级完整性约束 ALTER TABLE <表名> ADD [列级完整性约束条件]; 添加新的表级约束条件 ALTER TABLE <表名> ADD <表级完整性约束条件>; 删除指定列 ALTER TABLE <表名> DROP [COLUMN] <列名> [CASCADE|RESTRICT]; 删除指定的完整性约束条件 ALTER TABLE <表名> DROP CONSTRAINT <完整性约束名> [RESTRICT|CASCADE]; 修改表中已存在的列 ALTER TABLE <表名> ALTER COLUMN <列名> <数据类型>; 0x03.索引 建立索引的目的:加快查询速度 缺点:索引虽然能够加速数据库查询,但需要占用一定的存储空间,并且当基本表更新时,索引也需要进行相应的维护。这些都会增加数据库的负担,因此要根据实际应用的需要有选择地创建索引。 索引类型 目前SQL标准中没有涉及索引,但商用关系数据库系统一般都会支持索引机制,且不同数据库支持的索引类型不尽相同。 顺序文件上的索引:针对按指定属性值升序和降序存储的关系,在该属性上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。 B+树索引:将索引属性组织成 B+树的形式,B+树的叶节点为属性值和相应的元组指针。B+树索引具有动态平衡的优点。 散列(hash)索引:建立若干个桶,将索引属性按照其散列函数映射到相应桶中,桶中存放索引属性和相应的元组指针。散列 索引具有查找速度快的特点。 位图索引:用位向量记录索引属性中可能出翔的值,每个位向量对应一个可能值。 建立索引 CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名1>[<次序1>],···); <表名>是要建索引的基本表的名字 索引可以建立在该表的一列或者多列上,各列名之间用逗号分隔没每个列名后妈可以用<次序>指定索引值的排列次序,可选ASC(升序)或者DESC(降序)。默认ASC。 UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。 CLUSTER此索引是聚簇索引。 修改索引名称 ALTER INDEX <旧索引名> RENAME TO <新索引名>; 要修改索引本身的话,建议删除再重建。 删除索引 DROP INDEX <索引名> 索引一经建立就由系统使用和维护,无需用户干预。 删除索引是由于数据库频繁进行增、删、改,系统便会花费许多时间来维护索引,从而降低查询效率,这是便可以删除一些不必要的索引。 索引删除后,数据字典上关于索引的描述也会被删除。 0x04.视图 定义 视图是从一个或几个基本表(或者视图)导出的表。 视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。 特征 数据库只存放视图的定义,而不存放视图中对应表的数据(否则数据库中便存放了很多相同的数据),这些数据仍存放在原来的基本表中。 归根到底,视图与“图”无关,其实质上还是表。只不过由于不存放数据,只存放定义,因此称其为“虚表”。 几个概念 行列子集视图:建立在基本表之上,只是去掉了基本表的某些行和列,但保留了主键的这类视图。 分组视图:带有聚集函数和GROUP BY子句的查询的视图。 带表达式的视图:简单来说就是视图中存在基本表中不实际存在的列,即虚拟列。这些列是由基本表中的数据列经过各种计算派生出来的。 创建视图 CREATE VIEW <视图名> (<列名>,<列名>,<列名> ...) AS <子查询> [WITH CHECK OPTION]; <子查询>是针对基本表的SELECT语句,即从建立视图的基本表中选取部分数据,而不是全部数据 [WITH CHECK OPTION]是一个条件表达式,有这个条件表达式时,对视图进行UPDATE、INSERT和DELETE时如果要操作的行不满足这里的条件,则不允许进行 视图不仅可以建立在单个基本表上,也可以建立在多个基本表上 数据库执行CREATE VIEW语句的结果只是把视图的定义存入数据字典,并不执行其中的SELECT语句。只有在进行视图的查询时,才会执行SELECT语句。 组成视图的属性列名全部指定或者全部省略,没有第三种选择。 以下三种情况必须要指明视图的列名: 某个目标列并不是单纯的属性名,而是聚集函数或者列表达式 多表连接时选出了几个同名列作为视图的字段 需要在视图中为某个列启用新的更适合的名字 查询视图 视图其本质上还是表,因此可以对其进行查询。查询视图与查询表的语句基本相同。详见[DQL]()。 在视图查询的过程中,会经过视图消解,将对视图的查询转换为对基本表的查询。 视图消解:关系型数据库执行视图的查询操作时,首先进行有效性检查,即确定查询中涉及到的表、视图等是否都存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称之为视图消解。 局限:目前多数关系数据库对行列子集视图都能正确地转换。但对非行列子集视图的查询就不一定能做转换了,因此这类查询应该直接对基本表进行。 非行列子集视图:图中的部分列由其他表的列经过运算得出。 视图查询与基于派生表的查询的区别: 视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接饮用该视图。 而派生表知识在语句执行时临时定义,语句执行还定义即被删除。 更新视图 视图的更新包括INSERT、DELETE、UPDATE,其操作语句与表的操作语句基本相同。此处不再详述。详见[DML]()。 类似于视图的查询,对视图的更新同样是通过视图消解,转换为对基本表的更新操作。 目前各个关系数据库一般只允许对行列子集视图进行更新,而且不同的数据库对视图的更新还有更进一步的规定。由于各数据库系统实现方法上的差异,这些的规定也不尽相同。 删除视图 DROP VIEW <视图名> [CASCADE]; 视图删除实质上是将视图的定义从数据字典中删除。 CASCADE是可选的 若要删除的视图还导出了其他视图,那么加上CASCADE参数之后将会把该视图导出的视图一块删除。 总结 SQL可以分为数据定义(DDL)、数据查询(DQL)、数据更新(DML)、数据控制(DCL)四大部分。 综上,DDL中的基本操作可以用表格简单总结一下: 操作对象 创建 删除 修改 模式 CREATE SCHEMA DROP SCHEMA 表 CREATE TABLE DROP TABLE ALTER TABLE 视图 CREATE VIEW DROP VIEW 索引 CREATE INDEX DROP INDEX ALTER INDEX 主要参考资料:《数据库系统概论(第5版)》 王珊 萨师煊 编著
2021年07月25日
1,542 阅读
0 评论
1 点赞
2021-06-18
在IDEA中配置Maven开发环境
目录: 前言 1. 下载Maven安装文件 2.解压并配置环境变量 2.1、windows端 2.2、Linux端 3.设置IDEA 3.1 修改Maven全局配置文件 3.2 修改路径 3.3 导入Maven依赖 环境说明: 系统:win10专业版 deepin V20 IDE:IDEA 2020.3 java:jdk1.8 Maven:3.8.1 前言 Maven是一个构建自动化工具,主要用于Java项目,由Apache软件基金会托管,它以前是Jakarta项目的一部分。Maven还可用于构建和管理用 C#、Ruby、Scala 和其他语言编写的项目。 Maven解决了构建软件的两个方面:软件是如何构建的,以及它的依赖关系。与早期的工具(如Apache Ant)不同,它对构建过程使用约定,并且只需要写下异常。 XML 文件描述了正在构建的软件项目、它对其他外部模块和组件的依赖、构建顺序、目录和所需的插件。它带有预定义的目标,用于执行某些明确定义的任务,例如代码编译及其打包。 Maven从一个或多个存储库(例如Maven 2 Central Repository)动态下载Java库和Maven插件,并将它们存储在本地缓存中。下载工件的本地缓存也可以使用本地项目创建的工件进行更新。公共存储库也可以更新。 Maven官网:http://maven.apache.org/ 1. 下载Maven安装文件 Maven下载页面:http://maven.apache.org/download.cgi 进入下载页面,根据不同的系统选择前两个二进制文件之一下载就可以了。如果打算自行构建Maven,那就下载后面的源码文件。 2.解压并配置环境变量 部分参考资料:Maven – Installing Apache Maven 2.1、windows端 将下载下来的“.zip”压缩文件解压,这里以解压到“D:\Software”为例进行说明。 “计算机”图标上点击右键->属性->高级系统设置(win10 20H2需要在属性窗口的“相关设置”标签中才能找到高级系统设置),在高级系统设置窗口的右下角点击“环境变量”。 “环境变量”分为两种,一种是“用户变量”,这里面配置的环境变量只适用于当前计算机用户,另一种是“系统变量”,适用于这台计算机上的所有用户。具体设置成哪种环境变量看个人习惯。 添加如下两条环境变量,其中MAVEN_HOME的值是Maven文件的解压路径: 环境变量名称 环境变量值 MAVEN_HOME D:\Software\apache-maven-3.8.1 Path %MAVEN_HOME%\bin 其实第一个环境变量的名称并不是固定的,在其他的配置环境变量的教程中名称也可能不同。这个只是习惯而已,只要保证环境变量值没什么问题即可。 第二条Path也可以写成“D:\Software\apache-maven-3.8.1\bin”,这里引用了上条设置的MAVEN_HOME,表示的是Maven安装路径下的bin文件夹 全都添加完之后,两连“确定”完成环境变量的配置。 2.2、Linux端 Linux下也可以用以下命令下载安装包: wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz 下载下来的是一个后缀名为“.tar.gz”的压缩包。解压压缩包到/usr/下: sudo tar -xvf apache-maven-3.8.1-bin.tar.gz -C /usr/ # 当然解压目录不一定非得是/usr/,换成其他目录也可以,后面配置环境变量时目录就要修改 修改环境变量,编辑/etc/profile文件: sudo nano /etc/profile 在末尾加入以下环境变量,“/usr/apache-maven-3.8.1”是Maven安装文件所在的目录: export PATH=/usr/apache-maven-3.8.1/bin:$PATH 然后ctrl + o保存,ctrl + x退出,再输入以下命令使环境变量生效: source /etc/profile 至此就算配置好了环境变量。使用“mvn -v”命令检验是否配置成功,若无法识别命令,部分Linux环境下可能还需要重启一遍电脑才能生效。 3.设置IDEA 此处以Win10下的IDEA开发环境为例,Linux下相关操作都是一样的。 在cmd控制台窗口中输入以下命令查看Maven版本,检验是否配置成功: mvn -v 没有错误的话,输出结果是这样: 3.1 修改Maven全局配置文件 Maven有一个全局配置文件,里面是Maven的一些设置,该文件存放在Maven安装路径的conf文件夹中,修改的就是这个配置文件。关于这个文件的详解可以看这篇:Maven全局配置文件settings.xml详解 - 洪墨水 - 博客园 (cnblogs.com) Maven需要一个文件夹来存放从Maven仓库下载到本地的依赖包,为了减少对系统盘的空间占用,建议将这个文件夹设置到其他分区。找到配置文件里的settings标签,在标签里面加上: <!-- 中间的路径是本地Maven依赖包的存放路径 --> <localRepository>D:\programmeSoftware\MavenRepository</localRepository> Maven仓库在国外,在国内下载速度比较慢,所以还需要将镜像源更改为国内的镜像源。找到<mirrors>标签,往标签内加入阿里云的镜像源配置: <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> 3.2 修改路径 首先在IDEA中新建一个Maven项目,步骤与新建普通Java项目类似,项目类型选择成Maven。 依次点击“File”->“settings”(或者快捷键Ctrl+Alt+s)打开设置界面,然后选择“Build,Execution,Deployment”->“Maven”,设置如下: “User settings file”是Maven全局配置文件的存放路径,“Local repository”是从Maven仓库下载到本地的依赖包的存放路径。设置完了之后点击右下角“Apply”。 需要注意的是,这个设置仅适用于现在打开的Maven项目,为了将这个更改应用到新建的Maven项目上,还需要再进行设置。依次点击“File”->“New Projects Settings”->“Settings for New Projects...”,同样选择“Build,Execution,Deployment”->“Maven”,进行与上面同样的设置即可。 3.3 导入Maven依赖 Maven仓库地址:Maven Repository: Search/Browse/Explore (mvnrepository.com) 项目里用到的依赖包都是从这个网站上找的,以Mybatis为例,说一下依赖包的导入方式。 在网站顶部的搜索栏中搜索“Mabatis” 选择第一项,然后会看到该软件有很多个不同的版本,版本可以随便选择,但是一般为了防止项目中出现与软件版本相关的这类“玄学问题”,还是选择后面使用人数多的一项吧 点击版本号即可进入该版本界面,复制下方“Maven”标签下的那一串<dependency>标签 然后打开项目根目录下的pom.xml文件,将内容粘贴至<dependencies>(这个是复数的dependency)标签内部,注意缩进。导入依赖的第一步,完成。 当然由于只是导入了配置,本地并没有相应的依赖包,所以会看到粘贴的配置中会有红线报错,碰到报错先别慌,看第二步。此时需要在IDEA中要重载一遍项目的Maven依赖配置。有这么几种方法: 在左侧文件目录中的项目名称上单击右键,依次选择“Maven”->“Reload project” 在IDEA窗口右侧列表找到“Maven”,并单击展开菜单,点击菜单左上角刷新重载按钮 在打开的pom.xml文件界面上单击右键(只有在pom.xml文件上单击右键才可以,其他文件单击右键选项中没有Maven),依次选择“Maven”->“Reload project” 不管使用哪一种方式,最后结果都是窗口右下角会出现一个进度条,开始往本地下载pom.xml文件中导入的依赖项。等待这个进度条走完,原来的报错也就消失了。 在以后修改或添加了Maven依赖以后,都可以用这几种方法重新载入项目的Maven依赖配置。
2021年06月18日
1,336 阅读
0 评论
0 点赞
2021-05-31
Maven项目中的MyBatis配置
目录: 一、简介 二、创建项目 2.1、导入 Maven 依赖 2.2、创建 mybatis 核心配置文件 3.3、编写工具类 3.4、编写代码 实体类 Dao 接口 UserMapper 接口实现 UserMapper.xml 3.5、测试 三、问题 1、找不到 mapper.xml 文件 2、SSL 连接问题 环境说明: IDE:IDEA 2020.03 Java:jdk 1.8 MyBatis版本:3.5.3 mysql:5.5 mysql-connector-java:5.1.47 Junit:5.7.0 官方文档: mybatis – MyBatis 3 | 简介 Github 地址: GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java Maven 仓库地址: Maven Repository: org.mybatis » mybatis (mvnrepository.com) 一、简介 MyBatis 是一款优秀的持久层框架 支持自定义 SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 MyBatis 本是 apache 的一个开源项目 iBatis,2010 年这个项目由 apache 迁移到了 google code,并且改名为 MyBatis。 2013 年 11 月迁移到 Github。 二、创建项目 准备数据库,设置字符集与排序规则为 utf-8,否则无法正常插入中文字符。 然后执行以下 SQL 语句: -- 创建表 CREATE TABLE user(id INT NOT NULL AUTO_INCREMENT primary key,name char(20),updateTime datetime); -- 插入两条数据 INSERT INTO user(name,updateTime) value("张三",sysdate()); INSERT INTO user(name,updateTime) value("李四",sysdate()); 并且在 idea 中建好一个 Maven 项目。 2.1、导入 Maven 依赖 项目根目录下的 pom.xml 文件配置 Maven 依赖,在这个配置文件中加入以下依赖的坐标: <dependencies> <!--Mybatis--> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <!--mysql驱动--> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--Junit--> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> </dependencies> 2.2、创建 mybatis 核心配置文件 文件名:mybatis-config / mybatis-cfg,或其他 文件模板及说明:mybatis – MyBatis 3 | 入门 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 打印sql日志 --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!-- MySQL8.0以下的驱动名叫com.mysql.jdbc.Driver MySQL8.0以上的驱动名是com.mysql.cj.jdbc.Driver --> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 每一个mapper.xml配置文件都需要在mybaits核心文件中注册 --> <mappers> <!-- 使用文件路径的方式配置 --> <!-- <mapper resource="com/wlplove/dao/AtlasMapper.xml"/> --> <!-- 也可以使用类的方式进行配置 --> <mapper class="com.wlplove.dao.AtlasMapper"/> </mappers> </configuration> 其中,在这个配置文件的 <dataSource> 标签中定义了数据库连接信息,这里将信息写成了固定的死值。还有一种更灵活的方式就是从配置文件中读取信息,在 resources 目录下再新建一个数据库配置文件 jdbc.properties,里面写入数据库信息: # MySQL8.0以下的驱动名叫com.mysql.jdbc.Driver MySQL8.0以上的驱动名是com.mysql.cj.jdbc.Driver driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/pic?useSSL=false&useUnicode=true&characterEncoding=UTF-8 username=root password=root # 或者也可以配置成以下形式: #driver:com.mysql.jdbc.Driver #url:jdbc:mysql://localhost:3306/mybatis?useSSL=false&setUnicode=true&characterEncoding=utf8 #username:root #password:root 修改配置文件中的数据库信息部分为引用外部配置: <!-- 配置文件的路径 --> <properties resource="jdbc-config.properties"/> <dataSource type="POOLED"> <!-- MySQL8.0以下的驱动名叫com.mysql.jdbc.Driver MySQL8.0以上的驱动名是com.mysql.cj.jdbc.Driver --> <property name="driver" value="${driver}"/> <!-- 使用属性占位符 ${} 读取 property 文件中的属性 --> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> 3.3、编写工具类 将加载 SqlSession 的过程写成一个工具类,方便调用: public class MyBatisUtil { /** * 根据 XML 配置文件初始化出 SqlSessionFactory,并获取到 SqlSession 对象 * @return sqlSession */ public static SqlSession getSqlSession() { SqlSession sqlSession = null; try { String xmlFileResource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(xmlFileResource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = sqlSessionFactory.openSession(); } catch (Exception e) { e.printStackTrace(); } return sqlSession; } } 3.4、编写代码 实体类 即业务中涉及到的类,并且包括构造方法、getter 方法、setter 方法以及 toString() 方法 public class User { private int id; private String name; private Date updateTime; // 构造方法、set方法、get方法、toString方法略.... } Dao 接口 UserMapper public interface UserMapper { List<User> getUserList(); } 接口实现 UserMapper.xml 原来的 UserDaoImpl 转换为一个接口的 Mapper 映射文件: <?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"> <!-- namespace绑定一个Dao/mapper接口 --> <mapper namespace="com.wlplove.dao.UserMapper"> <!-- 查询语句 --> <!-- 注意其中的id,和resultType返回类型的名称 --> <select id="getUserList" resultType="com.wlplove.pojo.User"> SELECT * FROM mybatis.user; </select> </mapper> 定义好 Mybatis 的这个 Mapper 映射文件之后,需要在 Mybatis 的配置文件中注册一下才能正常调用: <!-- 每一个mapper.xml配置文件都需要在Mybaits核心文件中注册,有这么两种方式注册: --> <mappers> <!-- 使用文件路径的方式 --> <!-- <mapper resource="com/wlplove/dao/AtlasMapper.xml"/> --> <!-- 也可以使用类的方式 --> <mapper class="com.wlplove.dao.AtlasMapper"/> </mappers> 3.5、测试 只要在前面导入了 Junit 的依赖之后,就可以写一个单元测试方法调用写好的接口,单元测试方法没有返回值,没有参数,可以像 main 方法一样直接执行。 class UserMapperTest { // 每一个单元测试方法前面加入 @Test 注解 @Test void getUserList() { // 获取sqlSession对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); // 执行sql UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } // 关闭sqlSession sqlSession.close(); } } 三、问题 1、找不到 mapper.xml 文件 报错信息:Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/wlplove/dao/UserMapper.xml 原因是 Maven 在打包的时候,默认打包 src/main/java 下的 class 文件与 src/main/resources 下的配置文件,没有将该路径下的 mapper 配置文件打包进来,导致运行时候找不到 mapper 文件而报错。 解决方法:手动指定资源文件的位置,参考:mybatis:Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource_在路上s的博客-CSDN博客 修改 pom.xml 文件,在里面加入以下内容,然后更新 Maven 配置即可: <build> <!-- **.xml写在src找不到问题解决方案 --> <resources> <resource> <!-- directory:指定资源文件的位置 --> <directory>src/main/java</directory> <includes> <!-- “**” 表示任意级目录 “*”表示任意任意文件 --> <!-- mvn resources:resources :对资源做出处理,先于compile阶段 --> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!-- filtering:开启过滤,用指定的参数替换directory下的文件中的参数(eg. ${name}) --> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> 2、SSL 连接问题 报错信息: WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 翻译过来就是: 警告:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果没有设置显式选项,则默认情况下必须建立SSL连接。为了符合不使用SSL的现有应用程序,verifyServerCertificate属性设置为“false”。您需要通过设置useSSL=false来显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。 在数据库的连接参数中添加不使用 SSL 连接的参数 useSSL=false 即可解决: <property name="url" value="jdbc:mysql://localhost:3306/practice?setUnicode=true&characterEncoding=utf8&useSSL=false"/> 参考: 史上最详细mybatis与spring整合教程-腾讯云开发者社区-腾讯云 (tencent.com)
2021年05月31日
1,363 阅读
0 评论
0 点赞
2021-05-24
Java总结:JDBC连接操作数据库(一)
目录: 前言 一、JDBC结构 1.Java程序 2.JDBC管理器 3.驱动程序 4.数据库 二、JDBC编程的步骤 1、导入包 2、加载驱动程序 3、设置JDBC的连接地址信息 4、创建数据库连接 5、使用SQL语句操作数据库 5.1.Statement接口方法创建表: 5.2.PreparedStatement接口: 6、关闭连接 三、相关的类与方法 1、DriverManager类 ——管理驱动 2、Connection接口 ——建立连接 3、Statement接口 ——执行SQL语句 4、PreparedStatement接口 ——执行SQL语句 5、ResultSet接口 ——存放查询之后返回的结果 前言 Java Database Connectivity简称JDBC,属于Java核心API的一部分,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口。支持ANSI SQL-92标准,通过调用这些类和接口提供的成员方法,我们可以方便地连接各种不同的数据库,进而使用标准的SQL命令对数据库进行查询、插入、删除、更新等操作。 一、JDBC结构 1.Java程序 主要功能是根据JDBC方法实现对数据库的访问和操作。 主要任务有:请求与数据库建立连接,向数据库发送SQL请求,为结果集定义存储应用和数据类型,查询结果,处理错误,控制传输、提交及关闭连接等。 2.JDBC管理器 即驱动程序管理器,动态地管理和维护数据库查询查询所需要的所有驱动程序对象,实现Java程序与特定驱动程序的连接。 主要任务有:为特定数据库选择驱动程序,处理JDBC初始化调用,为每个驱动程序提供JDBC功能的入口,为JDBC调用执行参数等 3.驱动程序 主要任务:建立与数据库的连接,向数据库发送请求,用户程序请求是执行编译,将错误代码格式化成标准的JDBC错误代码。 编程所使用的数据库系统不同,所需要的驱动程序也有所不同。 4.数据库 按数据结构来存储和管理数据的计算机软件。 常见的数据库比如mysql、Oracle、SqlServer等。 二、JDBC编程的步骤 一次完整的JDBC实现过程分为以下几步: 1、导入包 在程序首部将相关的包导入程序 import java.sql.*; 2、加载驱动程序 使用Class.forName()方法来加载相应的驱动程序。不同数据库所需要加载的驱动程序也不同: // 加载mysql的驱动程序 Class.forName("com.mysql.jdbc.Driver"); //加载oracle的驱动程序 Class.forName("oracle.jdbc.driver.oracleDriver"); 3、设置JDBC的连接地址信息 指定JDBC要连接的地址、端口、数据库、用户名、密码等信息 String username = "root"; String password = "root"; String url = "jdbc:mysql://localhost:3306/test"; // 如果要往表中插入中文,还需要设置编码为utf-8 String url = "jdbc:mysql://localhost:3306/test?seUnicode=true&characterEncoding=utf8"; 其中,"jdbc:mysql"是连接协议,“localhost”是连接地址,“3306”是mysql的连接端口(mysql的默认连接端口是3306),“test”是要连接操作的数据库。 4、创建数据库连接 DriverManager 类中的getConnection() 方法用上一步设置好的url作为参数来创建一个连接对象,并返回这个连接对象给Connection的实例。 //url是上一步创建的连接地址 Connection conn = DriverManager.getConnection(url,username,password); 5、使用SQL语句操作数据库 JDBC中执行SQL语句可以使用Statement接口以及其子接口PreparedStatement接口,下面分别使用不同接口来举例简单说明其用法: 5.1.Statement接口方法创建表: /** * 例子:Statement接口执行创建表,并且插入一组数据 */ // 在当前数据库下创建一个学生表,表中包含主键字段id、姓名name、以及更新时间updatetime String sql1 = "create table student(id int NOT NULL AUTO_INCREMENT primary key,name char(10),updateTime Datetime)"; // 向创建的student表添加一组信息 String sql2 = "insert into student(name,updatetime) values('qwe',sysdate())"; // 创建一个Statement对象 Statement st = conn.createStatement(); // 用executeUpdate()函数执行不返回任何内容的sql语句,如INSERT、UPDATE、DELETE以及其他DDL(数据定义语言)等。其参数为SQL语句 // 执行建表SQL语句 st.executeUpdate(sql1); // execute()函数可以执行传进来的任意SQL语句 // 执行插入数据的SQL语句 st.execute(sql2); // 释放资源 st.close(); 5.2.PreparedStatement接口: /** * 例子:PreparedStatement接口执行查询表中数据的SQL语句 */ String sql3 = "select * from student"; // 创建一个PreparedStatement对象,同时对传入的SQL语句进行预编译 PreparedStatement ps = conn.prepareStatement(sql3); // PreparedStatement接口中的execute()方法是没有参数的,因为SQL语句在创建对象时已传入并且预编译了 ResultSet result = ps.executeQuery(); while(rs.next()){ // 通过索引来获取查询到的值 int id = rs.getInt(1); String name = rs.getString(2); // 通过列名来获取查询到的值 Date date = rs.getDate("updateTime"); } // 释放资源 ps.close(); 6、关闭连接 用完就要释放所连接的数据库及JDBC资源,关闭与数据库的连接 conn.close(); 上面就是是JDBC编程的基本流程,下面对这个过程中涉及到的一些类与方法做简单介绍: 三、相关的类与方法 1、DriverManager类 ——管理驱动 用于管理一组JDBC驱动程序的基本服务。 官方文档介绍:DriverManager (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 static Connection getConnection(String url) 用指定的数据库URL来创建连接 static Connection getConnection(String url, Properties info) 用指定的数据库URL和相关信息(用户名、用户密码等属性列表)来创建连接 static Connection getConnection(String url, String user, String password) 用指定的数据库URL、用户名和用户密码来创建连接 static Driver getDriver(String url) 定位在给定URL下的驱动程序。 DriverManager尝试从已注册的JDBC驱动程序集中选择适当的驱动程序。 static void deregisterDriver(Driver driver) 从DriverManager的已注册驱动程序列表中删除指定的驱动程序。 static void println(String message) 将消息输出到当前JDBC日志流。 static void setLoginTimeout(int seconds) 驱动程序尝试连接数据库时将等待的最长时间,以秒为单位。 2、Connection接口 ——建立连接 负责建立与指定数据库的连接。 默认情况下,Connection对象处于自动提交模式,这意味着它在执行每个语句后自动提交更改。 如果禁用了自动提交模式,则必须显式调用方法commit()方法才能提交更改;否则,将不会保存数据库更改。 官方文档介绍: Connection (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 Statement createStatement() 创建一个Statement对象,用于将SQL语句发送到数据库。 PreparedStatement prepareStatement(String sql) 创建一个PreparedStatement对象,用于将参数化的SQL语句发送到数据库。 void close() 立即释放此Connection对象的数据库和JDBC资源,而不是等待它们自动释放。 void commit() 使自上一次提交/回退以来进行的所有更改永久生效,并释放此Connection对象当前持有的所有数据库锁。 void rollback() 撤销对数据库执行的添加、删除或者修改记录等操作,并释放此Connection对象当前持有的所有数据库锁。 3、Statement接口 ——执行SQL语句 用于执行静态SQL语句并返回其产生的结果的对象。 默认情况下,每个Statement对象只能同时打开一个ResultSet对象。 因此,如果一个ResultSet对象的读取与另一个的读取交错,则每个都必须由不同的Statement对象生成。 如果当前存在打开的语句,Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。 官方文档介绍: Statement (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 Connection getConnection() 检索产生此Statement对象的Connection对象 void close() 立即释放此Statement对象的数据库和JDBC资源,而不是在自动关闭时等待它发生 boolean execute(String sql) 执行给定的SQL语句,该语句可能返回多个结果 ResultSet executeQuery(String sql) 执行给定的SQL语句,该语句返回一个ResultSet对象 int executeUpdate(String sql) 执行给定的SQL语句,该语句可以是INSERT,UPDATE或DELETE语句,也可以是不返回任何内容的SQL语句,例如SQL DDL语句 ResultSet getResultSet() 以ResultSet对象的形式检索当前结果 executeUpdate()、executeQuery()与execute()方法的区别: execute()函数:可以执行所有SQL语句。 当执行查询语句时,返回的boolean值指示查询结果的形式,返回值为true时表示查询结果为ResultSet,反之为false(即认为没有查到);执行其他语句时,如果第一个结果是更新计数或不存在任何结果,则返回false executeUpdate():执行insert、update、delete等不返回任何内容的非查询语句。 executeQuery():用于执行select语句。返回一个ResultSet对象,其中包含由给定查询产生的数据; 永不为空 4、PreparedStatement接口 ——执行SQL语句 表示预编译的SQL语句的对象。是Statement的子接口。 创建PreparedStatement对象时需传入一个SQL语句,该SQL语句已预编译并存储在PreparedStatement对象中。然后可以使用该对象多次有效地执行该语句。 官方文档介绍: PreparedStatement (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 boolean execute() 在此PreparedStatement对象中执行SQL语句,可以是任何类型的SQL语句 ResultSet executeQuery() 在此PreparedStatement对象中执行SQL查询,并返回查询生成的ResultSet对象 int executeUpdate() 在此PreparedStatement对象中执行SQL语句,该对象必须是SQL数据操作语言(DML)语句,例如INSERT,UPDATE或DELETE; 或不返回任何内容的SQL语句,例如DDL语句 5、ResultSet接口 ——存放查询之后返回的结果 表示数据库结果集的数据表,通常通过执行查询数据库的语句来生成。 ResultSet对象有一个游标,该游标指向其当前数据行。 最初,光标位于第一行之前。next()方法可将光标移动到下一行,当ResultSet对象中没有更多行时它将返回false,因此可以在while循环中使用它来迭代结果集。例如: // 假设rs是前面进行查询操作返回的ResultSet对象 while(rs.next()){ // 输出结果 } 用next()方法可以实现访问每一个数据行,那么如何获取数据行中的每一列数据呢?ResultSet接口提供了用于从当前行中检索列值的getter方法,方法名是get+类型,如getBoolean(),getInt()。 getter方法的参数可以是列的索引值或者列的名称,对应的是用索引或者列名来从当前数据行中检索列值。 通常,使用列索引会更有效。 列从1开始编号。为实现最大的可移植性,应按从左到右的顺序读取每一行中的结果集列,并且每一列只能读取一次。 getter方法用列名检索时传入的列名称不区分大小写。 当多个列具有相同的名称时,将返回第一个匹配列的值。 对于在查询中未明确命名的列,最好使用列的索引。 如果使用了列名,则应注意确保它们唯一地引用了预期的列,这可以通过SQL AS子句来确保。 例如: // 假设rs是前面进行查询操作返回的ResultSet对象 while(rs.next()){ // 使用索引来检索 int id = rs.getInt(1); // 使用列的名称来检索 String name = rs.getString("name"); // 且列名不区分大小写 Date updateTime = rs.getDate("UPDATETIME"); } 官方文档介绍: ResultSet (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 boolean absolute(int row) 将光标移动到此ResultSet对象中的给定行号 boolean first() 将光标移动到此ResultSet对象的第一行 void beforeFirst() 将光标移动到此ResultSet对象的前面,紧挨着第一行 boolean isFirst() 检索光标是否在此ResultSet对象的第一行上 boolean last() 将光标移动到此ResultSet对象的最后一行 void afterLast() 将光标移动到此ResultSet对象的末尾,紧接在最后一行之后 boolean isLast() 检索光标是否在此ResultSet对象的最后一行 boolean next() 将光标从当前位置向前移动一行 void insertRow() 将插入行的内容插入到此ResultSet对象和数据库中 void updateRow() 使用此ResultSet对象的当前行的新内容更新底层数据库 void deleteRow() 从此ResultSet对象和底层数据库中删除当前行 void update类型(int ColumnIndex,类型 x) 使用给定类型x更新指定列 int get类型(int ColumnIndex) 以Java类型的形式获取此ResultSet的对象的当前行中指定列的值 主要参考资料: 《数据库系统概论(第5版)》 王珊 萨师煊 编著 Java SE 1.8 官方文档
2021年05月24日
1,480 阅读
0 评论
1 点赞
2021-04-14
IDEA添加并配置Tomcat服务器
目录: 一、提前准备 二、创建Java web项目 三、添加Tomcat服务器 四、启动Tomcat服务器 五、其他操作 更改Tomcat默认端口 环境说明: 系统:Win10专业版 JDK版本:1.8 Tomcat版本:8.5.57 开发环境:IDEA 2020.03 Ultimate 一、提前准备 首先,访问Tomcat官网,选择一个版本的Tomcat进行下载,下载完之后解压。本篇博客以Tomcat8.5为例,下载的是windows 64位。下载完之后解压,记住解压完的文件位置,后面导入服务器时要用到。 其次,要保证当前的计算机正确配置了Java环境,win10系统下Java环境的配置请参考:Win10系统配置Java开发环境 二、创建Java web项目 注意:IDEA的Community版本是无法进行Web开发的,Web开发需要Ultimate版本 打开IDEA,先创建一个Java项目。然后在项目名上依次点击右键->”Add Framework Support“,弹出的窗口中勾选“Web Application”选项,点击右下角“OK”即可。 这样创建出来的就是Java web项目了,原来的项目目录会多出来一个“web”文件夹: 三、添加Tomcat服务器 依次点击“File”->“setting”(或者快捷键Ctrl+Alt+s)打开设置界面,然后选择“Build,Execution,Deployment”->“Application Servers”,点击“+”新添加一个应用服务器: 选择的服务器类型为“Tomcat Server”,注意不要选成“TomEE Server”: 在弹出的窗口中选择本地Tomcat的所在目录,IDEA会自动识别出Tomcat的版本,两连“OK”退出 回到主界面,找到菜单栏右边的“Add Configuration”: 点击左上角“+”,在展开的列表中依次选择“Tomcat Server”->“Local”,新建一个本地服务配置。因为前面添加了Tomcat服务器,所以右侧窗口中出现的配置项已自动填好,有需要的可以根据下图说明来改变部分选项: 然后我们需要把之前新建的这个项目放到Tomcat服务器上运行。切换到选项卡“Deployment”,点击左下角“+”,选择“Artifact”,当前项目就被添加上去了,添加完点击“OK”退出。 四、启动Tomcat服务器 如果前面配置没问题的话,现在左下角会出现“Services”窗口选项,在服务器名称上右键->“Run”,Tomcat服务器就启动了。 等待几秒钟服务器完全启动之后,会自动在浏览器中打开项目,如果没有自动打开那就用“localhost:8080”在浏览器中访问项目。 当前由于我们运行的只是空项目,没有对项目做任何更改,所以项目的运行结果会是下面这样: 到这里就配置成功了。 五、其他操作 更改Tomcat默认端口 在主界面找到菜单栏右边的“Tomcat ”,选择“Edit Configurations”: “HTTP port”是默认端口,更改完之后要重启Tomcat服务器才能生效 暂时这些,其他的碰到再添加。
2021年04月14日
1,466 阅读
0 评论
0 点赞
1
2
3
4