猿猿正在系统的学习一些计算机知识,和后端技术栈,目前阶段主要在系统学习java。此专栏,为我学习过程中的学习笔记,便于日后复习回顾来看,也很适合新人学习参考。
以下是猿猿对数据库和java深入的第一遍学习笔记哦。知识比较细,目录有点长。
视频学习
1.起步
什么是数据库?什么是数据管理系统?
姓名:作用:常见的数据库管理系统 什么是SOL?他们之间的关系 2.安装和卸载MySQL
安装略卸载 3.用命令操作MySQl
启动服务关闭服务器登录客户端服务器
显示密码的形式登录:隐藏密码的形式登录:退出mysql:参数说明: 查看mysql中有哪些数据库选择使用数据库创建数据库查看mysql数据库版本号查看当前使用的是哪个数据库 删除数据库
终止一条命令的输入分号 4.数据库中最基本的单元是表
表行列 5.关于SQL语句的分类***记忆
DQL: 数据查询语言DML:数据操作语言DDL:数据定义语言TCL:事务控制语言DCL:数据控制语言 6.导入文件数据
数据的导出
注意:导出指定数据库导出指定的表 7.查看表
查看表中数据不看表中数据只看表的结构 8.SQL语句
==========SQL语句<始>命名规范 8.1简单查询
8.1.1 、查询一个字段8.1.2、查询两个字段或多个字段8.1.3、查询所有字段8.1.4、给查询的列起别名
注意: 8.2条件查询
8.2.1、什么是条件查询
语法格式: 8.2.2、都有哪些条件
小于: **<,** 大于: **>**, 不等于: **!=**, 不等于: **<>**, 小于等于: **<=**, 大于等于: **>=**两个值之间: between···and··· (**注意**:左小右大,闭区间) **等同于:** >= and <=为空或不为空: is null(is not null) (**注意**:数据库中null不能使用“=”衡量,它没有值只有值才能被“=”衡量)并且: and或者:orand和or同时出现有优先级嘛?包含: in 相当于多个or(not in 不在这个范围)模糊查询: like (支持%或下划线匹配) %任意个字符; _ 下划线,一个下划线只匹配一个字符; 8.3 排序
8.3.1、默认是升序8.3.2、指定降序8.3.3、指定升序8.3.4、多个字段排序8.3.5、根据字段位置排序(了解)8.3.6、综合案例
注意:关键字顺序不能变
程序执行顺序: 9.数据处理函数
9.1、常见的单行处理函数
lower 转化小写upper 转化大写concat 字符串的拼接substr 取子串
案例: trim 去空格str_to_date 将字符串转为日期date_format 格式化日期format 设置千分位round 四舍五入
结论:round案例: rand() 生成随机数ifnull 可以将null转化为一个具体值case··when···then···when···then···else···end 9.2、分组函数(多行行处理函数)
5个:
注意: 案例: 10.分组查询|***重要
10.1、什么是分组查询10.2、关键字的顺序不能变
执行顺序 10.3、案例
10.3.1、找出每个工作岗位的工资和
注意(重点): 10.3.2、找出每个部门的最高薪资10.3.3、找出“每个部门,不同工作岗位”的最高薪资
技巧:两个字段联合分组 10.3.4、找出每个部门的最高薪资,要求显示最高薪资大于3000的?
注意having: 10.3.5、where没办法的??? 11.单表查询大总结
关键字顺序不能颠倒
执行顺序 案例: 12.去除重复记录 distinct
关键字: distinct
注意: 13.连接查询 (重要)
13.1、什么是连接查询?13.2、连接查询的分类
13.2.1、根据年代分类13.2.2、根据连接方式分类 13.3、笛卡尔积现象
怎么避免笛卡尔积现象?起别名----效率 13.4、内连接之等值连接
SQL92语法:SQL99语法: 13.5、内连接之非等值连接
emp表 esalgrade表 s语法: 13.6、内连接之自连接
技巧:一张表看成两张表语法: 13.7、外连接 (主次之分)
右外连接
语法: 左外连接
语法:image-20210908211013024注意:思考:案例: 13.8、连接三张表、四张表
语法:案例: 效率问题 14、子查询
14.1、什么是子查询14.2、子查询可以出现在哪里?14.3、where子句中的子查询
案例(分组函数): 14.4、from子句中的子查询
巧妙: 15.union合并结果集(高效)
案例:优点:避免笛卡尔积的影响使用时的注意事项 16.limit (使用在分页中)
作用:用法:案例:注意(执行顺序): 分页
公式: 17.DQL语句的大总结
关键字顺序:执行顺序: ==========SQL语句<完>===========增删改 <始> 1.表的创建 (建表)
1.1建表的语法格式
语法: 1.2关于masql中的数据类型
varchar 可变长度的字符串char 定长字符串int 等于intbigint 等于longfloat 单精度浮点型数据double 双精度浮点型数据date 短日期类型datetime 长日期类型clob 字符大对象blob 二进制大对象 1.3、创建一个学生表
查看数据库中有哪些表删除表 2、插入数据(增加) insert(DML)
语法:注意:插入学生建表时设置默认值insert建表时字段名可以省略 str_to_date 将字符串转为日期
语法日期格式代码:注意:自动转化 date_format 格式化日期(查询日期)
展示在表中的都是字符串格式 3.修改 update (DML)
语法: 4.删除数据
语法注意: 5.插入多条数据(重要)
语法 6.快速建表
原理:语法 7.插入表
语法 8.快速删除表中的数据
慢方式 (DML)快方式 (DDL): 删除表!=删除数据
删除表 9.对表结构的修改10.约束(很重要)
10.1、什么是约束?10.2、约束包括哪些
10.2.1非空约束 not null10.2.2、唯一性约束:unique
新需求--表级约束什么时候需要使用表级约束?unique和not null可以联合 10.2.3、主键约束 (primary key,简称PK)
主键约束的相关字语:什么是主键?记住:主键的特征给一张表添加主键约束表级约束---复合主键:主键值建议类型主键分类自动维护主键值(重要) 10.2.4、外键约束 (foreign key,简称FK) 五星
外键约束的相关属于案例:加外键约束语法+引用: ===========表<完> 1.存储引擎 (了解)
1.1、什么是存储引擎?1.2、怎么给表添加存储引擎
什么是数据库引擎方式结论: 1.3、怎么查看mysql怎么查看存储引擎
语法 1.4、mysql常用的存储引擎
MyISAM存储引擎?存储特点:缺点:InnoDB存储引擎存储特点:MEMORY存储引擎?存储特点 2.事务概述(重要且精通)
2.1、什么是事务
什么是业务逻辑 2.2、只有DML语句才会有事务一说2.3、事务为什么存在?
什么是事务? 2.4事务怎么做到多条语句同时成功和同时失败?
提交事务、回滚事务 2.5、怎么提交事务和回滚事务
语法:在mysql默认的事务行为是什么关闭自动提交功能 2.6、事务包括四个特性
事务的隔离性
事务和事务的隔离4级别读未提交读已提交可重复读序列化/串行化 2.7、查看隔离级别:2.8、验证:隔离级别
验证 read uncommitted验证:read committed验证:repeatable read验证:serializable 3.索引(index)
3.1、什么是索引
注意: 3.2、索引的实现原理
原理: 3.3、什么时候添加索引?3.4、索引创建、删除、语法
创建索引删除索引 3.5、查看一个sql语句是否使用了索引进行检查3.6、索引有失效的时候
第一种(%开头)第二种(or)第三种(复合索引右侧)
**什么是复合索引?** 第四种(字段运算)第五种(函数) 3.7、索引优化数据库
分类 4.视图(view)
4.1、什么是视图?4.2、怎么创建视图?
表复制创建视图删除视图对象 4.3、用视图可以做什么4.4、视图对象在实际开发过程有什么用 5.DBA常用命令
数据的导出
注意:导出指定的表 数据的导入
注意:创建数据库使用数据库初始化数据库 6.数据库设计的三范式(熟记)
6.1、什么是数据库设计范式6.2、数据库设计范式共有3个
第一范式第二范式第三范式
好处: 案例
第一范式第二范式口诀:多对多的设计第三范式口诀:一对多的设计 6.3、总结表的设计image-202109131053529326.4、嘱咐一句话 求平均薪水的等级最低的部门的部门名称 JDBC对面的女孩看过来
idea打开mysql架包一、JDBC简介
什么是JDBC工作原理 二、使用详情
1、准备工作2、JDBC编程步骤
小写转大写加载驱动程序需要的驱动:代码:
完整代码代码解释StringBuildercreateStatement关于List<Map<String, Object>> 详细步骤
第一步创建项目:第二步加入驱动:第三步连接数据库 三.详设
原理
解释: 视图层
流程问题 四、回顾
JDBC的基本概念MVC三层架构JDBC的链接方式四种
1.JDBC+ODBC桥的方式2.JDBC+厂商API的形式3.JDBC+厂商Database Connection4.JDBC+DATAbase的链接方式扩展 jdbc占位符的使用jdbc查询展示view
方法一方法二方法三方法四 初始化表格不可编辑 ER图
什么是ER图基本要素ER图元素
实体补充属性的补充 扩展知识
MVC高内聚低耦合this关键字静态方法
代码块的分类和执行顺序 深入理解static
1、static存在的主要意义2、static的独特之处3、static应用场景4、静态变量和实例变量的概念5、静态变量和实例变量区别【重点常用】6、访问静态变量和实例变量的两种方式7、static静态方法8、static静态代码块9、static变量与普通变量区别10、静态内部类11、静态导包12、static注意事项13、final与static的藕断丝连 深入理解类的加载理解execute理解HashMap
HashMap的工作原理以及存取方法过程HashMap具体的存取过程如下:get值方法的过程是: 遍历数组的几种方法数组遍历集合的方法
1. 经典循环方式迭代的方式加强for循环使用Lambda表达式的forEach 集合mapjava为什么要抛出异常见到的方法
toUpperCase()toLowerCase()next()和hasnext()SimpleDateFormat
SimpleDateFormat设置日期格式format()方法将日期转换为字符串parse()方法将字符串转换为日期 获取密码框的值.next.last
LAST() 函数SQL LAST() 语法 .getRow.berforeFirstvector动态数组的遍历获取当前时间,并调整格式 idea使用教程
快捷键
1. Ctrl + Space2. Ctrl + N(Ctrl + Shift + N)3. Ctrl + B4. Ctrl + Alt + T5. Ctrl + Alt + B6. Ctrl + W7. Shift + F18. Ctrl + Q9. Ctrl + /10. F2/Shift + F211. Shift + F612. Ctrl + Alt + L13. Ctrl + Alt + I14. Ctrl + Alt + O15. Ctrl + ]/[16.Ctrl+E17.Shift+Click18.Ctrl+Shift+Backspace19.Ctrl+F1220.Ctrl+F721.Ctrl+Shift+N22.Alt+Q23.Ctrl+P25.Alt+Insert26.Ctrl+Alt+V27.Alt+Up and Alt+Down 下面的不是很有用
28.Alt+Enter29.Ctrl+Shift+Alt+N30.Ctrl+Shift+Space31.Alt+F332.Ctrl+O33.Ctrl+Alt+Space34. Ctrl+J35.Ctrl+Shift+F730.Ctrl+Alt+Up /Ctrl+Alt+Down31.Ctrl+Shift+J32.Alt+F8是计算变量值 Java几种消息对话框的弹出
普通对话框Java代码警示框Java代码错误提示框Java代码基本提示框java代码2.show/confirm/iDialog3.showOptionDialog(自定义选择提示对话框)4.showInputDialog(下拉框或者输入框)输入框Java代码 java正则的使用Java_Swing中关于关闭窗口的方法idea快捷键**idea格式化代码时,注释被格式化问题**String、StringBuffer和StringBuilder的区别
StringStringBufferStringBuilder
StringBuffer类中实现的方法:StringBuilder类中实现的方法: **如何在单个窗口打开多个Maven工程啊?**连接池
一.什么是数据库连接池二.传统的连接机制与数据库连接池的运行机制区别三.为什么要使用连接池 四.常用的开源数据库连接池
1.dbcp 数据的加密、解密方式级联操作时间戳时区问题
.时区问题.乱码问题 储存时间的问题idea编码转化mysql 单条插入和批量插入
单条插入插入多条语句 getmetaData 作品逻辑
middle 和 productmiddle和buy 考核问题总结
视频学习操作数据库是按照找个步骤写的:
(1)注册驱动;
(2)获取数据库连接;
(3)拼接sql语句,设置sql参数;
(4)执行sql语句;
(5)处理sql返回结果;
(6)关闭执行语句和数据库连接;
1.起步 什么是数据库?英文单词 Database,简称 DB。按照一定格式储存数据的一些文件的组合。
什么是数据管理系统? 姓名:DatabaseManagement,简称DBMS。
作用:专门用来管理数据库中的数据,数据库管理系统可以对数据库进行增删改查
常见的数据库管理系统MySOL、Oracle、MS SqlServer、DB2、Sybase
什么是SOL?结构化查询语句
他们之间的关系DBMS----执行–>SOL -----操作 ----->DB
安装数据管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理
2.安装和卸载MySQL 安装略 卸载 3.用命令操作MySQl(以下的命令不区分大小写)
启动服务net start MySQL(数据库名称)关闭服务器
net stop MySQl(数据库名称)登录客户端服务器 显示密码的形式登录:
mysql -uroot -p123456隐藏密码的形式登录:
mysql -uroot -p退出mysql:
exit; 或 quit;
三个框依次是:用户名、MySQL服务器所在地址、用户密码) 或 mysql -u root -p
参数说明:-h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;-u : 登录的用户名;-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。 查看mysql中有哪些数据库
show databases;//默认带了四个数据库选择使用数据库
use 数据库名创建数据库
create database 数据库名查看mysql数据库版本号
select version();查看当前使用的是哪个数据库
select database();
删除数据库drop database 数据库名;终止一条命令的输入
c 或 “ ; ”(报错)
分号注意:mysql 是不见分号“ ; ”不执行," ; "表示结束
4.数据库中最基本的单元是表表 table 行row(被称为数据/记录) 列 column(被称为字段)
表存储数据数据库下面有很多表查看某个数据库下有某些表 show tables; 行
记录/数据 列
每一个字段(列)都有:字段名、数据类型、约束等属性 5.关于SQL语句的分类***记忆 DQL: 数据查询语言
凡是带有select关键字的都是查询语句,select···
DML:数据操作语言凡是对表中的数据进行增删改的都是DMLinsert delete update
- insert 增delete删update改
凡是带有create、drop、alter的都是DDLDDL主要操作的是表的结构,不是表中的数据
- create:新建 等同于增drop:删除alter:修改
- 事务提交: commit事务回滚: rollback
如:授权 grant、撤销权限 revoke
6.导入文件数据怎么导入mysql文件中的数据导入
source 路径名数据的导出 注意:
在windows的dos命令窗口中:
导出指定数据库mysqldump 数据库名 表名 路径导出后文件名 用户名 密码
mysqldump ssm_db >D:c.sql -uroot -p123456导出指定的表
mysqldump ssm_db tbl_book >D:c.sql -uroot -p1234567.查看表 查看表中数据
select * from 表名; //从表中查所有的数据不看表中数据只看表的结构
desc 表名;//describe 缩写为desc8.SQL语句 ==========SQL语句<始> 命名规范
所有的标识符都是全部小写,单词和单词之间使用下划线进行衔接
8.1简单查询 8.1.1 、查询一个字段select 字段名 from 表名;
注意:
select和from都是关键字 字段名和表明都是标识符 8.1.2、查询两个字段或多个字段
使用“ , ”隔开
8.1.3、查询所有字段把所有字段都写上 select a,b,c,d··· from tablename;
使用* select * from dept;
缺点 (先把*转化为字段)效率低,开发时建议使用
1.as关键字能省略,别名里面有空格编译会报错
2.解决空格报错:加上单引号或双引号
3.在所有的数据中,字符串统一用单引号括起来,只有在mysql中可以使用
4.字段可以使用数学表达式
8.2条件查询 8.2.1、什么是条件查询不是将表中所有数据都查出来,查询出符合条件的。
语法格式:select 字段一,字段二,字段三 from 表名 where 条件;8.2.2、都有哪些条件
- 小于: <, 大于: >, 不等于: !=, 不等于: <>, 小于等于: <=, 大于等于: >= 两个值之间: between···and··· (注意:左小右大,闭区间) 等同于: >= and <= 为空或不为空: is null(is not null) (注意:数据库中null不能使用“=”衡量,它没有值只有值才能被“=”衡量) 并且: and 或者:or and和or同时出现有优先级嘛?
and的优先级高于or
在开发中不确定优先级,就加小括号
使用小括号调整
包含: in 相当于多个or(not in 不在这个范围)in后面跟的不是区间,而是具体的值
模糊查询: like (支持%或下划线匹配) %任意个字符; _ 下划线,一个下划线只匹配一个字符;转义字符:
8.3 排序 8.3.1、默认是升序select 字段一,字段二,字段三 from 表名 order by 字段名;8.3.2、指定降序
select 字段一,字段二,字段三 from 表名 order by 字段名 desc;8.3.3、指定升序
select 字段一,字段二,字段三 from 表名 order by 字段名 asc ;8.3.4、多个字段排序
注意://sal在前,起主导作用,只有字段一相等的时候才会启用字段二排序
select 字段一,字段二,字段三 from 表名 order by 字段一 asc ,字段二 asc;
如果工资一样的话,按照名字的升序排序
8.3.5、根据字段位置排序(了解) 8.3.6、综合案例 注意:关键字顺序不能变select··· from··· where··· order by···
程序执行顺序:先找表,赛选条件,选择字段名,排序
9.数据处理函数数据处理函数又被成为单行处理函数单行处理函数的特点:一个输入对应一个输出多行处理函数的特点:多个输入对应一个输出 9.1、常见的单行处理函数
语法: 函数+()
lower 转化小写一个输入对应一个输出select lower(字段名) as 别名 from 表名;//14个输入对应14个输出-----一个输入对应一个输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0Ra0cqH-1647160218301)(F:/T笔记/Typora/笔记//三月阶段笔记/数据库阶段/数据库——菜鸟教程.assets/image-20210908114048746.png)]
upper 转化大写 concat 字符串的拼接 substr 取子串select substr(字段名,n(n>0),m) as 别名 from 表名;//substr(被截取的字符串,起始下标,截取的长度)
注意:起始下标是从1开始的,没有0
案例:找出员工名字第一个字母是A的员工信息
首字母转化为大写在拼接 多函数嵌套
select upper(substr(name,1,1)) from t_student;//首字母转化为大写 select substr(name,2,length(neme)-1) from t_student;//取除首字母外的所有字符串 select concat(upper(substr(name,1,1)),substr(name,,2,length(name)-1)) as result from t_student;//合并
在插入数据处详讲
date_format 格式化日期(在插入数据处详讲)把日期转化为字符串
format 设置千分位 round 四舍五入 结论:select 后面可以跟某个表的字段名(可以等同看成变量名),也可以跟字面量/字面值(数据)。
round案例: rand() 生成随机数 ifnull 可以将null转化为一个具体值 case··when···then···when···then···else···end 9.2、分组函数(多行行处理函数)特点:输入多行,最终输出一行
5个:- count 计数sum 求和avg 平均值max 最大值min 最小值
分组函数使用时必须先进行分组,然后才能用
如果没有对数据进行分组,整张表默认为一组
分组函数自动忽略null,即你不需要对null进行处理
分组函数中count(*) 和 count(具体字段)
count(*) 统计总行数。(只要有数据 count++)
分组函数不能直接使用在where子句中
所有分组函数可以组合起来一起用
案例: 10.分组查询|***重要 10.1、什么是分组查询
select ··· from ··· group by···10.2、关键字的顺序不能变
select ··· from ··· where ··· group by ··· order by ···
执行顺序- from 从这张表中找where 过滤group by 开始分组select 查询order by 输出
select后面只能跟被分组的字段和分组函数,别的字段写在这里没有意义
10.3.2、找出每个部门的最高薪资 10.3.3、找出“每个部门,不同工作岗位”的最高薪资 技巧:两个字段联合分组 10.3.4、找出每个部门的最高薪资,要求显示最高薪资大于3000的? 注意having:使用having能对分完组的数据进一步过滤having不能单独使用,不能代替where,having必须和group by联合使用优化策略:
where和having 优先选择where,能用where过滤掉的就有限考虑wherewhere实在完成不了的在选择having
10.3.5、where没办法的???找出每个部门的平均薪资,要求显示平均薪资高于2500
11.单表查询大总结 关键字顺序不能颠倒select ··· from ··· where ··· group by ··· having ··· order by ···执行顺序
- from 从这个表中查询where 过滤group by 分组having 再过滤select 查询order by 输出
select distinct 字段一,字段二 from emp;注意:
原表数据不会被修改,只是查询结果去重distinct只能出现在所有字段的最前方,联合起来去除重复记录 13.连接查询 (重要) 13.1、什么是连接查询?
从一张表中单独查询,称为单表查询
多张表联合起来查询数据,被称为连接查询
13.2、连接查询的分类 13.2.1、根据年代分类 13.2.2、根据连接方式分类内连接 (AB两张表没有主次关系)----inner(可省略)
- 等值连接非等值连接自连接
- 左外连接(左连接)右外连接(右连接)
案例:查询每个员工所在部门名称
当两张表进行连接查询时,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积。这种现象称为:笛卡尔积现象(这是一个数学现象)
怎么避免笛卡尔积现象?连接时加条件,满足这条的记录被筛选出来
select ··· ename,dname ···from ··· emp ,dept ··· where emp.depno = dept.deptno起别名----效率 13.4、内连接之等值连接
案例:查询每个员工所在部门的名称,显示员工名和部门名?
SQL92语法:缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放在wehere后面
SQL99语法:内连接
**SQL99优点:**表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where
select ··· from ··· a ··· join b ··· on ··· a和b的连接条件 ··· where ··· 筛选条件 //join(连接)13.5、内连接之非等值连接
案例:找出每个员工的薪资等级,要求显示员工名、薪资、等级?
emp表 e salgrade表 s 语法:select e.ename,e.sal,s.grade from emp e (inner) join salgrade s on e.sal between s.losal and s.hisal; //条件不是一个等量关系,称为非等值连接13.6、内连接之自连接
案例:查询员工的上级领导,要求显示员工名和对应的领导名?
技巧:一张表看成两张表emp a 员工表 emp b 领导表
语法:select a.ename as '员工名',b.ename as '领导名' from emp a join emp b on a.mgr = b.empno; //员工的领导编号 = 领导的员工编号13.7、外连接 (主次之分) 右外连接 语法: 左外连接
展示查询结果等效于右外连接查询结果
语法: 注意: 思考:外连接的查询条数一定是>=内连接的查询结果条数的
案例: 13.8、连接三张表、四张表 语法: 案例: 效率问题我查询一些资料,有三种看法:
第一种:左连更优。http://stackoverflow.com/questions/17100819/left-join-significantly-faster-than-inner-join
第二种:内连更优。http://stackoverflow.com/questions/2726657/inner-join-vs-left-join-performance-in-sql-server
第三种:取决于实际情况。http://stackoverflow.com/questions/1810465/left-join-faster-or-inner-join-faster
select 语句中嵌套select语句,被嵌套的select语句称为子查询
14.2、子查询可以出现在哪里?多个select
14.3、where子句中的子查询 案例(分组函数): 14.4、from子句中的子查询 巧妙:可以把from后面表的查询结果当作临时表,进而来作比较
15.union合并结果集(高效)联合查询,乘法变加法
案例:查询工作岗位是MANAGER和SALESMAN的员工?
优点:避免笛卡尔积的影响union把乘法变加法,减少匹配次数
使用时的注意事项列数相同在oracle数据库中(严格),列和列的数据类型都要相同 16.limit (使用在分页中) 作用:
将查询结果集的一部分取出来。通常使用在分页查询中。
用法:limit startIndex ,length //完整用法 startIndex是起始下标(从0开始),length是长度 limit 5; 等效 limit 0,5 //取前五案例: 注意(执行顺序):
mySQL中,limit在order by之后执行
分页给出页码和条数===>写出sql语句:
公式:limit (pageNo-1)*pageSize , pageSize17.DQL语句的大总结 关键字顺序: 执行顺序: ==========SQL语句<完> ===========增删改 <始> 1.表的创建 (建表) 1.1建表的语法格式
语句归属:属于DDL语句,DDL包括:create drop alter
语法:create table 表名(字段名一 数据类型,字段名二 数据类型,字段名三 数据类型)1.2关于masql中的数据类型 varchar 可变长度的字符串
最长255
char 定长字符串
最长255 int 等于int
最长11 bigint 等于long float 单精度浮点型数据 double 双精度浮点型数据 date 短日期类型
年月日默认格式
%Y-%m-%d datetime 长日期类型
年月日时分秒默认格式
%Y-%m-%d %h:%i:%s 获取当前时间函数
now() 函数 (带有时分秒) clob 字符大对象
最多储存4G的字符串 blob 二进制大对象
图片、声音、视频等媒体数据 1.3、创建一个学生表
create table t_student( no int, name varchar(32), sex char(1), age int(3), email varchar(255) );查看数据库中有哪些表
show tables;删除表
drop table if exists 表名;2、插入数据(增加) insert(DML) 语法:
insert into 表名(字段名1,字段名2,字段名3···) values(值1,值2,值3);注意:
字段名和值要一一对应,数量对应,数据类型对应
插入学生insert into t_student (no,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com'); insert into t_student (no,name,sex,age,email) values(2,'lisi','m',19,'lisi@123.com');建表时设置默认值 insert建表时字段名可以省略 str_to_date 将字符串转为日期 语法
str_to_date('字符串日期','日期格式')
日期格式
代码:
注意:
自动转化
mysql自动将字符串转化为日期date格式
date_format 格式化日期(查询日期)把数据库中的日期date类型转化为字符串
date_format(日期类型数据,'日期格式')展示在表中的都是字符串格式 3.修改 update (DML) 语法:
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3··· wehere 条件
注意:没有条件限制 会导致所有数据全部更新。
4.删除数据 语法delete from 表名 where 条件;注意:
没有条件,整张表会被删除
5.插入多条数据(重要) 语法insert into t_user (字段名1,字段名2···) values (),(),(),();6.快速建表 原理:
将一个查询结果当作一张新建表,可以完成表的快速复制。表创建出来,同时表的数据也存在
语法 7.插入表将查询结果插入到一张表当中
语法 8.快速删除表中的数据 慢方式 (DML)delete from 表名;
缺点:数据删除,在硬盘上的真实储存空间不释放,比较慢优点:支持回滚,后悔了可以在恢复数据 ------------ 语法:rollback; 快方式 (DDL):
truncate table 表名;//删除表中的数据,表还在
优点:效率高,一次性截断缺点:不支持回滚 删除表!=删除数据 删除表
drop table 表名;9.对表结构的修改
对表结构的修改需要使用: alter属于DDL语句DDL包括:create drop alter 10.约束(很重要) 10.1、什么是约束?
可以用来保证表中数据的完整性有效性。
10.2、约束包括哪些加到列后面的叫列级约束,没有加到列后面的叫表级约束。
ALTER TABLE t_user ADD unique(username) ; desc t_user
- 非空约束 not null唯一性约束 unique 有表级约束主键约束 primary key(简称PK) 有表级约束外键约束 foreign key(简称FK)检查约束 check(mysql不支持,oracle支持)
唯一性约束unique约束的字段不能重复,但是可以为多个null
拥有表级约束 新需求–表级约束
name和email两个字段联和起来具有唯一性
像这种约束没有添加在 列的后面,这种约束称为表级约束
什么时候需要使用表级约束? unique和not null可以联合 10.2.3、主键约束 (primary key,简称PK) 主键约束的相关字语:- 主键约束:一种约束主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段主键值:主键字段中的每一个值都叫做:主键值
主键值是每一行记录的唯一标识主键值是每一行记录的身份证号一张表主键约束只能有一个 记住:
任何表都应该有主键,没有主键 表无效
主键的特征not null + unique (主键值不能为空,同时也不能重复)
给一张表添加主键约束 表级约束—复合主键:一个字段做主键叫做单一主键,多个字段做主键叫做复合主键
主键值建议类型
int
bigint
char等类型
不建议使用:varchar来做主键,因为主键值一般都是数字且都是定长的
主键分类单一主键复合主键自然主键业务主键 自动维护主键值(重要)
自增:auto_increment 从1开始,以1递增删除表、创建表、插入表、查询表
10.2.4、外键约束 (foreign key,简称FK) 五星 外键约束的相关属于- 外键约束:一种约束**外键字段:**该字段上添加了外键约束**外键值:**外键字段当中的每一个值
请设计数据库表,来描述“班级和学生信息”
加外键约束 语法+引用:被引用的字段必须要有unique约束外键值可以为null
===========表<完> 1.存储引擎 (了解) 1.1、什么是存储引擎?存储表或组织数据的方式
1.2、怎么给表添加存储引擎 什么是数据库引擎数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。可以使用 SQL Server Management Studio 管理数据库对象,使用 SQL Server Profiler 捕获服务器事件。
方式在建表的时候,在小括号的最后,给表指定存储引擎
ENGINE 来指定存储引擎、CHARSET 来指定这张表的字符编码方式 结论:
mysql默认的储存引擎是: InnoDBmysql默认的字符编码方式是:utf8 1.3、怎么查看mysql怎么查看存储引擎 语法
show engines G // 支持九大搜索引擎,版本不同 支持情况不同1.4、mysql常用的存储引擎 MyISAM存储引擎?
它管理的表具有以下特征:
存储特点:可被转化为压缩,只读表来节省空间
缺点:不支持事务机制,安全性低
InnoDB存储引擎 存储特点:效率不是很高,不能压缩安全性高(支持事务) MEMORY存储引擎? 存储特点
查询效率最高,不需要和硬盘交互不安全,关机后数据消失。(因为数据和索引都在内存当中) 2.事务概述(重要且精通) 2.1、什么是事务
一个事务就是一个完整的业务逻辑。是一个最小的工作单元,不可再分多条语句捆绑一起,同时成功或同时失败提交(开启事务,语句结束时)和回滚(回滚到上一次 你提交的位置上) 什么是业务逻辑 2.2、只有DML语句才会有事务一说
- insert 增delete 删update 改
事务就是批量的DML语句同时成功,或者同时失败!
2.4事务怎么做到多条语句同时成功和同时失败?有 用来记录事务性活动的日志文件
提交事务、回滚事务 2.5、怎么提交事务和回滚事务 语法:commit //提交事务 rollback //回滚事务
事务对应的英语单词是: transaction
在mysql默认的事务行为是什么 关闭自动提交功能开发的时候j建议关闭,输入多条语句后 利用 commit提交(在输入rollback就不能撤销成功了,表已经不能被改变)
开启事务,即关闭自动提交功能。
start transaction; //开启事务,即关闭自动提交功能2.6、事务包括四个特性
- A:原子性(最小的工作单元,不能再分)C:一致性(所有事务要求,在同一个事务当中,所有操作必须同时成功或同时失败,以保证事务的一致性)I:隔离性(A事务和B事务之间有一定的隔离,教室A和B中间有一个墙,这个墙就是隔离性)D:持久性(事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上)
加深理解
读未提交:read uncommitted(最低隔离级别)
什么是读未提交?《没有提交就读到了》
事务A可以读取到事务B未提交的数据这种隔离级别存在的问题?
脏读现象(Dirty Read)我们称读到了脏数据
一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据: 一般都是理论上的,大多数数据库的隔离级别都是二挡起步
读已提交:read committed
是oracle数据库的默认隔离级别
什么是读已提交?《提交之后才能读到》
事务A只能读到事务B提交之后的数据这种隔离级别解决了什么问题?
解决了脏读现象读取的是最真实的数据 这种隔离级别存在什么问题?
不可重复读取数据
可重复读:repeatable read
是mysql中默认的事务隔离级别
什么是可重复读?《提交之后也读不到,永远读到的都是刚开启事务时的数据》
这种隔离级别解决了什么问题?
解决了不可重复读数据 存在的问题
可能会出现幻影读每一次读取到的数据都是幻象,不够真实
序列化/串行化:serializable(最高隔离级别)
级别最高,效率最低,解决了所有的问题
isolation 隔离 transaction 事务
SELECT @@tx_isolation2.8、验证:隔离级别 验证 read uncommitted 验证:read committed
最真实的数据
验证:repeatable read幻像数据
验证:serializable 3.索引(index)添加索引
3.1、什么是索引 注意:
目录(索引)需要排序,因为只有排序了 才会有区间查找
缩小查找范围就是扫描某个区间
3.2、索引的实现原理主键、id和 tnique约束的会自动创建索引对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IY92iUsP-1647160218315)(F:T笔记Typora笔记三月阶段笔记数据库阶段数据库——菜鸟教程.assetsimage-20210912170407203.png)]
原理:缩小区间范围,避免全局搜索
3.3、什么时候添加索引? 3.4、索引创建、删除、语法 创建索引create index (起名) emp_ename_index on [表名(字段名)] emp(ename); 给emp表的ename字段添加索引,起名:emp_ename_index删除索引
drop index emp_ename_index (索引名) on emp(表名); 将emp表上的emp_ename_index 索引对象删除3.5、查看一个sql语句是否使用了索引进行检查
explain select * from emp where ename = 'KING'; // explain 解释
扫描14条记录,证明没有使用索引 。 type = All;
数组+数 的结合体(内部算法)
3.6、索引有失效的时候 第一种(%开头)查询条件以“%”开始的时候,会索引失效
第二种(or)使用or时,要求两边的字段都要有索引,否则不会走索引
第三种(复合索引右侧)使用复合索引的时候,没有使用左侧的列查找,索引失效
什么是复合索引?两个字段,或者更多字段联合起来添加一个索引,叫做复合索引
create index emp_job_sal_index on emp(job,sal) //给两个字段添加索引第四种(字段运算)
在where中,索引列(字段)参加了运算,索引失效
第五种(函数)在where当中,索引列使用了函数
3.7、索引优化数据库索引是各种数据库进行优化的重要手段,优化的时候优先考虑的因素就是索引
分类 4.视图(view) 4.1、什么是视图?view:站在不同的角度去看待同一份数据
4.2、怎么创建视图? 表复制create table dept2 as secect * from dept;创建视图
create view dept2_view as select * from dept2;删除视图对象
drop view dept2_view;4.3、用视图可以做什么 4.4、视图对象在实际开发过程有什么用
简化sql语句,方便,简化开发,利于维护。as后面只能使查询语句(DQL语句)
视图对象在数据库中也是以文件的形式存在的
5.DBA常用命令数据的导入和导出(数据的备份)
数据的导出 注意:在windows的dos命令窗口中:
mysqldump bjpowernode>D:bjpowernode.sql -uroot -p123456导出指定的表
mysqldump bjpowernode emp>D:bjpowernode.sql -uroot -p123456数据的导入 注意:
要先登录到mysql数据库服务器上
创建数据库create database bjpowernode;使用数据库
use bjpowernode初始化数据库
source D:bjpowernode.sql6.数据库设计的三范式(熟记) 6.1、什么是数据库设计范式 6.2、数据库设计范式共有3个 第一范式 第二范式
依赖
第三范式依赖
好处: 案例 第一范式 第二范式 口诀:多对多的设计多对多,三张表,关系表两个外键
建立三张表,分开写 在写一个关系表(用两个外键做)
第三范式 口诀:一对多的设计一对多,两张表,多的表加外键
6.3、总结表的设计 6.4、嘱咐一句话 求平均薪水的等级最低的部门的部门名称薪水最低等级一定最低,但等级最低薪水不一定最低
select t.*,grade from (select d.deptno,avg(sal) as avgsal from emp e join dept d on e.deptno=d.deptno group by d.deptno) t join salgrade s on t.avgsal between s.losal and s.hisal where s.grade=(select grade from salgrade where (select avg(sal) as avgsal from emp group by deptno order by avgsal asc limit 1) between losal and hisal);JDBC对面的女孩看过来 idea打开mysql架包
打开架包
一、JDBC简介 什么是JDBCJDBC全称:Java Data Basa Connectivity (java数据库连接)
工作原理 二、使用详情 1、准备工作 2、JDBC编程步骤 小写转大写 加载驱动程序需要的驱动:把驱动加入到环境变量中
代码://1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver"); //反射 mysql驱动名
//2.获得数据库的连接
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/imooc"(地址),"root"(用户名),"root"(密码)); //DriverManager驱动类
//3.通过数据库的连接操作数据库。实现增删改查
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select user_name,age from imooc_goddess");//查询的对象被存在了rs对象中
//rs.next() 返回ture,说明rs里面有数据。返回false,说明rs里面没有数据
while(rs.next()) {
System.out.println(rs.getString("user_name"+","+rs.getInt(age)));
//如果对象中有数据,就会循环打印出来。没有数据不打印
}
完整代码
//加载驱动–>获取数据库的连接—>操作数据库
package com.imooc.db;1
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBUtil {
//"jdbc:mysql:///imooc"
private static final String URL= "jdbc:mysql://127.0.0.1:3306/imooc";
private static final String USER= "root";
private static final String PASSWORD= "123456";
public static void main(String[] args) throws Exception {
// 加载驱动程序,通过类名 反射的将这个类加入到环境变量中
Class.forName("com.mysql.jdbc.Driver");
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt= conn.createStatement();
ResultSet rs = stmt.executeQuery("select user_name,age from imooc_goddess");
while(rs.next()){
System.out.println(rs.getString("user_name")+","+rs.getInt("age"));
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Ai9CRU0-1647160218321)(F:T笔记Typora笔记三月阶段笔记数据库阶段数据库——视频学习(完结).assetsimage-20210914092025255.png)]
代码解释Class.forName(“com.mysql.jdbc.Driver”);
1.使用Class.forName(“com.mysql.jdbc.Driver”)后,jvm会加载这个类 2.加载这个类后,进入com.mysql.jdbc.Driver,会立即注册:
StringBuilder用法
效率
(1):用法:StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
(2):效率:
//第一种方法
StringBuilder sb=new StringBuilder();
sb.Append("123");
sb.Append("456");
string str=sb.ToString();
// 第二种方法
string s1=“123”;
string s2=“456”;
string str=s1+s2;
// 处理大规模的字符串的时候第二种方法效率会变低。
createStatement
Statement stmt=conn.createStatement(参数一,参数二) createStatement返回的Statement对象是执行sql语句用的 第一个参数可以取值为 ResultSet.RTYPE_FORWORD_ONLY,只可向前滚动; ResultSet.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。 ResultSet.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。 第二个参数可以取值为 ResultSet.CONCUR_READ_ONLY:这是缺省值,指定不可以更新 ResultSet ResultSet.CONCUR_UPDATABLE:指定可以更新 ResultSet
浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。说是CreateStatement和PrepareStatement的区别,但其实说的就是Statement和PrepareStatement的区别
代码背景:我们有一个数据库,里面有一个user表,有username,userpwd两列。我们要查出这两列的数据。
PrepareStatement可以提高代码的可读性
这是使用CreateStatement方法创建了stmt对象,再通过他查询的一部分语句片段。
String sql = "select * from users where username= '"+username+"' and userpwd='"+userpwd+"'"; stmt = conn.createStatement(); rs = stmt.executeQuery(sql);
而下面则是使用了PrepareStatement方法创建了pstmt对象,再通过这个对象查询的一部分语句片段。
String sql = "select * from users where username=? and userpwd=?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, username); pstmt.setString(2, userpwd); rs = pstmt.executeQuery();
原来PrepareStatement跟Statement的主要区别就是把上面sql语句中的变量抽出来了
第二点优点。ParperStatement提高了代码的灵活性和执行效率。
PrepareStatement接口是Statement接口的子接口,他继承了Statement接口的所有功能。它主要是拿来解决我们使用Statement对象多次执行同一个SQL语句的效率问题的。ParperStatement接口的机制是在数据库支持预编译的情况下预先将SQL语句编译,当多次执行这条SQL语句时,可以直接执行编译好的SQL语句,这样就大大提高了程序的灵活性和执行效率。
第三点优点安全!
关于List<Map<String, Object>>参考连接
首先map
java中的jdbc程序为什么要加finally:
finally的作用是保证无论程序正确执行还是发生异常,都把占用资源的connection给close掉,以释放资源。
与其他语言的模型相比,finally 关键字是对 Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。 如果没有 finally,您的代码就会很费解。
finally 块必须与 try 或 try/catch 块配合使用。此外,不可能退出 try 块而不执行其 finally 块。如果 finally 块存在,则它总会执行。
详细步骤 第一步创建项目:创建jdbc_imooc项目
第二步加入驱动:- 创建驱动文件找到mysql-connector-java-5.0.8.jar文件复制到lib里面将驱动加入到环境变量中
5.驱动加载成功
第三步连接数据库- 新建一个DBUtil.java 类用main方法连接数据库
数据持久化:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f5jH7pCo-1647160218322)(数据库——视频学习(完结).assets/image-20210918142134844.png)]
视图层 流程 问题 四、回顾 JDBC的基本概念 MVC三层架构 JDBC的链接方式四种 1.JDBC+ODBC桥的方式 2.JDBC+厂商API的形式 3.JDBC+厂商Database Connection 4.JDBC+DATAbase的链接方式 扩展 jdbc占位符的使用占位符的使用
避开 sql 需要使用字符串拼接的方式,从而解决 sql 注入的安全风险,
什么是SQL注入?
SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
SQL注入漏洞可能会影响使用SQL数据库(如MySQL,Oracle,SQL Server或其他)的任何网站或Web应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL注入攻击是最古老,最流行,最危险的Web应用程序漏洞之一。
Statement 接口的两个问题:
第一个问题: 使用 Statement 接口 对象发送的 sql 语句需要再数据库进行一次编译之后成为指令才能执行,
每条 sql 语句都需要编译一次, 这样是很慢的.
第二个问题: 使用 Statement 接口 操作的 sql 语句需要使用字符串的拼接方式实现,
这样的方式可能存在 sql 注入的安全风险并且拼接字符串比较麻烦.
对比 Statement 接口, PreparedStatement 接口的优点:
1.使用该接口操作的 sql 语句会先预先编译成指令在发送给数据库, 数据库就执行指令即可, 这样就提高了一定速度,
2.该接口可以避开 sql 需要使用字符串拼接的方式, 从而解决 sql 注入的安全风险,
而是使用 占位符 (?) 来代替原来的字符串拼接.
Connection conn = DBUtil.getconnection();
ResultSet res = null;//获取ResultSet结果集
try {
PreparedStatement preparedStatement = conn.prepareStatement("select *from product");//sql语句编译预处理
res = preparedStatement.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
res.last();//游标移动到查询到的数据库数据记录的最后一条
int row = res.getRow();//获取记录的总条数
res.beforeFirst();//游标回到第一个记录前的位置
System.out.println(row);
String arr[] = {"商品", "生产日期", "保质期", "品牌"};//定义表格的列名称
String comm[][] = new String[row][4];//row行,4列
res.next();//游标回到第一个记录的位置
for (int i = 0; i < row; i++) {
System.out.println(res.getString("product_name"));
comm[i][0] = res.getString("product_name");
comm[i][1] = res.getString("product_date");
comm[i][2] = res.getString("save_date");
comm[i][3] = res.getString("brand");
res.next();
}
// //创建表格
JTable productsViewTable = new JTable(comm,arr);
//设置单元格的高度
productsViewTable.setRowHeight(30);
//将表格加入到滚动面板上
JScrollPane scrollPane1 =new JScrollPane(productsViewTable);
//将滚动面板添加到卡片布局面板上
cardP.add(scrollPane1);
validate();//设置组件可见
pack();//自动调整组建大小使每个组键都能显示
方法二
private void fillStudent() {
DefaultTableModel dtm = (DefaultTableModel) stuOwnTable.getModel();
dtm.setRowCount(0);
Student student = new Student(userIdInfor);
try {
ArrayList students = studentController.selectStuMessage(student);
for (Student s : students) {
Vector v = new Vector();
v.add(s.getId());
v.add(s.getStudentName());
v.add(s.getStudentSex());
v.add(s.getStudentGrade());
v.add(s.getStudentPass());
v.add(s.getTeacherName());
v.add(s.getonTheJob());
dtm.addRow(v);
}
} catch (Exception e) {
e.printStackTrace();
}
}
方法三
JTable scoretable = new JTable();
// 设置表格单元格的高度为30
scoretable.setRowHeight(30);
// 将表格加入到滚动面板中
JScrollPane scorejsp = new JScrollPane(scoretable);
// 设置滚动面板的位置
scorejsp.setBounds(57, 48, 877, 464);
// 将滚动面板添加到面板
panel_1.add(scorejsp);
try {
// 通过联表查询根据账号查询出对应id所有的成绩
List li = scoreaction1.scoreupdate(String.valueOf(useraction.getUser(no).getId()));
for (Class_Score a : li) {
System.out.println(a);
}
panel_1.setLayout(null);
Vector score_column = new Vector<>();
score_column.add("课程编号");
score_column.add("课程名称");
score_column.add("课程学分");
score_column.add("任课教师");
score_column.add("课程成绩");
Vector> score_value = new Vector<>();
for (Class_Score c : li) {
Vector rowC = new Vector<>();
rowC.add(c.getClass_no());
rowC.add(c.getClass_name());
rowC.add(c.getClass_sco());
rowC.add(c.getClass_tea());
rowC.add(c.getClass_score());
if (c.getIn_del() == 0 && c.getClass_del() == 0) {
score_value.add(rowC);
}
}
DefaultTableModel scoremodel = (DefaultTableModel) scoretable.getModel();
scoremodel.setDataVector(score_value, score_column);
System.out.println("成绩更新了");
} catch (Exception e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
方法四
DefaultTableModel model = (DefaultTableModel) bookqueryTable.getModel();
// 先清空一遍数据
model.getDataVector().clear();
Vector rows = null;
if (bookList.size() == 0) {
rows = new Vector<>();
model.addRow(rows);
} else if (bookList.size() > 0) {
model.getDataVector().clear();
for (Book book : bookList) {
rows = new Vector<>();
rows.add(book.getId());
rows.add(book.getBNo());
rows.add(book.getBName());
rows.add(book.getBAuthor());
rows.add(book.getClassifyName());
rows.add(book.getBPublisher());
rows.add(book.getBPubdate());
rows.add(book.getBPrice());
rows.add(book.getBPagesnumber());
rows.add(book.getBCount());
rows.add(book.getBPlace());
rows.add(book.getBState());
model.addRow(rows);
}
}
reader = readerAction.getInfo(LoginView.LoginCount);
ArrayList logs = outLogAction.queryAll();
logs.removeIf(log -> log.getRid() != reader.getId());
updateOutlogQueryTable(logs);
初始化表格不可编辑
//表格不可编辑
public void noEdit() {
//初始化表格
this.table = new JTable(new DefaultTableModel())
{
//表格不允许被编辑
public boolean isCellEditable(int row, int column)
{
return false;
}
};
}
备份
private void addCarActionPerformed(ActionEvent e) {
int index = productsViewTable.getSelectedRow();//选中的行
System.out.println("==========");
selectRows();
}
//选中多行
public void selectRows() {
int[] rows=productsViewTable.getSelectedRows();
for(int i:rows) {
System.out.println(i);
}
// ArrayList list=new ArrayList();
// for(int i=rows.length-1;i>=0;i--){
//
// }
//
// list.clear();
}
//选中多行
public List> selectRows(JTable table) {
//存放选中的行
int[] rows=table.getSelectedRows();//获取当前选中的行数,并存入数组中
int column = table.getColumnCount();//选中的列数
//创建一个保存的集合,用来存放选中的所有行
List> object =new ArrayList>();
for (int j=0;j row = new HashMap();
for(int i=0;i result = selectRows(productsViewTable);
for(Object a: result) {
System.out.println(a);
}
// result.clear();
}
public List> selectRows(JTable table) {
//存放选中的行
int[] rows=table.getSelectedRows();//获取当前选中的行数,并存入数组中
int column = table.getColumnCount();//选中的列数
//创建一个保存的集合,用来存放选中的所有行
List> object =new ArrayList>();
for (int j=0;j row = new ArrayList



