数据库(SQL)入门到精通
一. 数据库
数据库(Database) -----DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS. —Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系数据库管理系统。
1.关系型数据库
主要有MySQL、SQL Server、数蚕数据库、Oracle数据库。
(1)MySQL
免费产品,中小企业使用广泛。
(2)SQL Server
微软的商业化产品,微软SQL语句兼容性好,商业化成熟度高。
(3)数蚕数据库
数蚕科技针对中小型企业的数据库,c++接口特性良好,SQL特性较弱。
(4)Oracle 数据库
商业化程度最高的关系数据库, 优良的性能和企业扩展能力。
2.非关系型数据库
主要有FastDB、Memcached和Redis等主流内存数据库。一般应用于缓存等非关键数据存储,其优点是数据查询速度快,对下层编程接口良好。
二. Oracle中SQL命令的分类
1. DQL—数据库查询语言
select (查询)
(1)select 查询
语法:*select |字段名1 (as) 别名,字段名2 别名,字段… from 表名;
查询所有表中的所有字段
语法:select 所有字段 from 表名 或者 select * from 表名
注意:代表所有字段的意思,但是在实际开发中,写的效率相比直接写字段名要低,开发时不建议使用
2. DML—数据操纵语言
insert(插入),update(修改数据),delete(删除数据), select(查询)
(1)insert 插入
语法:insert into 表名 [(字段列表)] values(值列表);
(2)update 修改
语法:update 表名 set 字段=值 [,…] where 过滤行记录;
(3)delete 删除
语法:delete [from] 表名 where 过滤行记录
3. DDL—数据定义语言
create(创建) drop(删除) alter(修改) rename(重命名) truncate(截断)
(1)create 创建
create table 表名(字段….);
(2)drop 删除
drop table 表名//删除表
(3)alter 添加字段
alter table 表名 add 列名 数据类型 约束。
删除字段
alter table 表名 drop column 列名;
修改字段类型
alter table 表名 modify 列名 数据类型 约束。
修改字段的名字
alter table 表名 rename column 老列名 to 新列名
4. DCL—数据控制语言
grant(授权),revoke(撤销授权)
(1)grant 授权
grant 权限名 to 用户;
(2)revoke 撤销授权
revoke 权限名 from 用户;
5.TCL—事务控制语言
commit(提交),rollback(回滚)
(1)commit 提交事务
(2)rollback 回滚
事务是数据库中最小执行单元,由1-n条sql命令组成,组成一个事务的一组sql,是不可分割的原子操作,要么一起成功,要么一起失败。
数据库服务器,会针对每一个连接上来的客户端,开辟一小段内存空间(回滚段),用于暂时缓存客户端提交的sql命令,当事务结束的时候,需要显示的给出明确指示。
commit:提交,将回滚段中的sql真正的更新到数据库服务器中。
rollback:回滚,将回滚段中的sql全部丢弃。
三.SQL数据库
1. SELECT查询
(1)命令不区分大小写
查询表: SELECT * FROM 表名 = select * from 表名;
(2)基本语法
*select distinct |字段|表达式 (as) 别名 from 表 表别名
select 后面是结果集
distinct是去重关键字,确保查询结果的唯一性
**通配符 ***( 书写方便、可以检索未知列;但是降低检索的性能 )
伪列:不存在的列,构建虚拟的列
SQL中的字符串 ‘’ ,是一对单引号,拼接使用 ||
“” :双引号是原封不动打印,可以存在空格和区分大小写
别名:(as) 别名; as可省略;便于操作识别 、隐藏底层信息;表加别名不能使用as
null值:表属性值为null值可以使用内置函数 val(参数1,参数2) 如果参数1为null,函数最终的结果为参数2 ,如果参数1不为null,结果还是参数1
dual :虚表,可以被查询到,但真实不存在
2.条件查询
select 内容 from 表 where 条件;
执行流程: from-> where -> select
(1) 比较条件
= 、 >、 <、 >=、 <=、 !=、 <>、 between and
between and是成对出现的
了解 any some all
>=any(值列表) 大于最小值<=any(值列表)小于最大值
some与any 一样的效果
all 大于最大值 小于最小值
(2)且、或、非
and 、or、 not、 union、 union all、 intersect 、minus
且 或 非 --> and、 or、 not
Union,并集(去重)
Union All,全集(不去重)
Intersect,交集(找出重复)
Minus,差集(减去重复)
(3)null 值
null :is null、 is not null、 not is null
null不能使用条件判断,只能使用is
(4)like 模糊查询
like : 模糊查询 % _ escape(‘单个字符’)
模糊查询,使用通配符:
%:零个及以上(任意个数的)的字符
_:一个任意字符
遇到内容中包含 % _ 使用**escape(‘单个字符’)**指定转义符
(5)in、exists(难点)
in 、 exists(难点) 及子查询
in (值1,值2,值3…) 当对一个字段的多个值进行等值匹配;in相当于使用or的多个等值,定值集合 ,如果存在子查询,确保类型相同、字段数为1,如果记录多,效率不高,多用于一些少量数据的定值判断上
select 数据 from 数据来源 where exists(结果集) ---->exists条件为true,存在记录则返回结果,后续不再继续 比较查询,与查询的字段无关,与记录有关
(6)获取所有行的记录
select * from 表名;
select * from 表名 where 1=1 ; -->恒成立条件
select * from 表名 where 属性值 like ‘%’; -->属性值存在即成立
3.排序 order by
使用order by排序,排序不是真实改变存储结构的顺序,而是获取的集合的顺序.
select 数据 from 数据来源 where 条件 order by 排序字段1,排序字段…;
执行流程: from -->where -->select–> order by [desc 降序 asc升序(默认)]
(1)asc (默认升序)
(2)desc (降序)
多字段: 在前面字段相等时,使用后面的字段排序;多个字段排序使用, 排序的字段可以使构建出来的虚拟的字段
nulls (空排序): 所有的null值最先为nulls first,最后显示nulls last (默认为最后)
4.函数
函数分为系统内置函数和自定义函数(后期学习的 pl-sql 中定义)
单行函数 : 一条记录返回一个结果的
多行函数|组函数|聚合函数 : 多条记录返回一条结果的
1)单行函数
(1)日期函数
日期函数: 注意区分 db数据库时间 ,java应用服务器的时间。以一方为准 oracle以内部数字格式存储日期:年,月,日,小时,分钟,秒
- sysdate/current_date 以date类型返回当前的日期
- add_months(d,x) 返回加上x月后的日期d的值 -->add_months(日期对象,月份数)
- LAST_DAY(d) 返回的所在月份的最后一天
- months_between(date1,date2) 返回date1和date2之间月的数目 --> months_between(大月份,小月份)
- next_day(sysdate,‘星期一’) 下周星期一
a.当前时间
select sysdate from 表名;= select current_date from 表名;
b.修改日期(天数±)
select sysdate±天数 from 表名;
c.修改月份
select add_months(sysdate,数值) from dual; 从虚表处查看修改数值月份
d.月份之差
select 属性值, months_between(sysdate , hiredate) from emp;
hiredate是字段名入职日期
e.最后一天
select hiredate,last_day(hiredate) from emp; 查询当前月的最后一天
f.下个星期几的时间
select next_day(sysdate,‘星期日’) from dual; 查询下一个星期三是几号(即将要过的星期三)
2)转换函数(重点)
(1)to_date(数据,格式)
to_date(c,m) 字符串以指定格式转换为日期
设定一个特定的时间(用一个特定的时间字符串转换为日期)是 ‘2018-9-5 16:18:25’
select to_date(‘2018/9/5 16:18:25’,‘yyyy/mm/dd hh24:mi:ss’) from dual;
(2)to_char(数据,格式)
to_char(d,m) 日期以指定格式转换为字符串
将日期转为特定格式的字符串
select to_char(sysdate,‘yyyy年mm月dd日’) from dual;
select to_char(sysdate,‘yyyy"年"mm"月"dd"日"’) from dual;
select to_char(sysdate,‘yyyy"年"mm"月"dd"日" hh12:mi:ss’) from dual;
select to_char(sysdate,‘yyyy"年"mm"月"dd"日" hh24:mi:ss’) from dual;
3)判定函数 decode
decode (判定字段,值1,结果1,值2,结果2,值3,结果3…(,默认结果))
decode(condition,case1,express1,case2 , express2,….casen , expressn, expressionm)
例如:
给每个部门后后面添加一个伪列,如果10部门,伪列显示为十,二十,三十…
select deptno,dname,loc, decode(deptno,10,‘十’,20,‘二十’,30,‘三十’,‘四十’) 中文部门编号 from dept;
4)多行函数|聚合函数
组函数|聚合函数|多行函数 : 对结果集进行组函数计算
多行记录返回一个结果 ,注意: 组函数不能和非分组字段一起使用
注意:
a.组函数仅在选择列表和having子句中有效
b.出现组函数,select 只能有 组函数或 分组字段
(1)count(条件)计数
count(条件)统计所有个数
条件可以是 * 、主键 (推荐使用)
null不参与运算
统计数量过程中,可能处理重复 select count(distinct(deptno)) 有人的部门 from emp;
select count(1) from emp; 伪列 相当于为每条数据的后面添加一个伪列字段 1
(2)sum(条件) 求和
(3)max() 最大值
(4)min() 最小值
(5)avg() 平均值
注意:组信息与单条记录不能同时查询
5.分组 group by
分组: group by , 将符合条件的记录 进一步的分组
过滤组:having , 过滤组信息 ,表达式 同 where 一致
查询公式:select 数据 from 数据来源 where 行过滤条件 group by 分组字段1,… having 过滤组信息(以组为单位过滤) order by 排序字段…;
执行流程: from --> where --> group by --> having --> select --> order by
注意:
(1)select 后如果出现了组函数|分了组,组函数不能与非分组字段,可以与其他组函数或分组字段一起使用
(2)where 后不能使用组函数,因为还没有组,执行流程的问题
例如:
select max(sal),deptno from emp where deptno in (30,20) group by deptno; -->先过滤,后分组
select max(sal),deptno from emp group by deptno having deptno in (30,20); -->先分组,再过滤
区分:where :过滤行记录,不能使用组函数, having:过滤组 可以使用组函数
6.子查询和行转列
1)子查询
一条sql语句实现需求
2)行转列
目的: 达到 解耦(与记录之间)+扩展(与结构之间)
利用判断函数decode() 单行函数
例如:select name,max(decode(course,‘语文’,score)) 语文,min(decode(course,‘数学’,score)) 数学,max(decode(course,‘英语’,score)) 英语 from tb_student group by name;
7. rowid 和 rownum
rowid 和 rownum 都是伪列
1)rowid
当一个表中有多条一模一样的数据的时候,实现去重,重复数据只保留一条
查到要保留的数据
rowid理解为记录在插入到数据库的表中时候就存在的数据的地址(对象的地址),其实不是地址,根据地址得到的值
2)rownum
如果一个表中没有主键,没有不可重复的字段,可能会出现多条一模一样的数据,无法区分重复数据,可以根据rowid进行区分
rownum 结果集的序号 有一个结果集就有一个rownum select查到的结果集
rownum 从1开始,每次+1
分页:在oracle中使用rownum.因为rownum规律可循,控制rownum序号从1开始,每次+1,方便判断
查询中一般如果根据主键字段进行排序,先排序后确定rownum
8.连表查询
当需要获取的数据不是来自于同一张表而是来自于多张表时就需要使用到表连接
1)查询 select
查询语句:select 数据 from 数据来源1,… where 行过滤条件|表连接条件 group by 分组字段… having 组过滤条件 order by 排序字段…;
执行流程: from —> where —> group by —> having —> select —> order by
2) 92语法
表和表之间使用,连接
select 数据 from 数据来源1,数据来源2,数据来源3…
3)内连接和外连接
内连接(内部做满足条件显示不满足不显示)
外链接(有的表中的数据不满足条件也可以显示)
连接条件: where中定义连接条件
分为:等值连接和非等值连接
注意:同名字段必须指明出处
(1)笛卡尔积
表示数据对乘的结果,非* 必须区分使用表名 或别名.区分
(2)等值连接
两个表的连接字段,不定义是同名字段或者主外键关系的,数据类型需要保持一致(是在笛卡尔积基础上 取条件列相同的值)
(3)非等值连接
> < != <> between and
(4)自然连接
特殊的等值连接 (来自于同一张表)
(5)外连接
做表连接的时候,要满足连接条件才能显示,如果想要某张表中的数据无论是否满足条件都显示,可以使用外链接
外连接:左外连接和有外连接接
主表:主表中的数据无论是否满足条件都会显示
查询所有员工信息以及上级经理人信息 员工表作为主表
emp e1,emp e2 主表在左边就是左连接,主表在右边就是右连接
select * from emp e1,emp e2 where e1.mgr= e2.empno(+); --左连接
select * from emp e2,emp e1 where e1.mgr= e2.empno(+); --右连接
3) 99语法
(1)交叉连接 cross join
交叉连接 cross join —>笛卡尔积
(inner) join inner默认可以不写
(2)自然连接 nateral join
自然连接(主外键、同名列) natural join -->等值连接
自动做等值连接,注意: 同名字段不要使用限定词
natural join 自动帮你做等值连接 同名字段|主外键关系
join using(字段) 指明对哪一个字段做等值连接
(3)等值连接 join using
数据来源1 join 数据来源2 on 连接条件(等值|非等值) 同名字段需要指明出处
join using连接(同名列) -->等值连接
(4)非等值连接 join on
[inner]join on 连接 -->等值连接 非等值 自连接 (解决一切) 关系列必须区分
(4)外链接 left join,right join
left|right [outer] join on|using -->外连接
外链接: left join | right join 左外链接|右外链接
(5)全连接 full join on|using
全连接: 结果集 union 结果集
full join on|using -->全连接 满足直接匹配,不满足 相互补充null ,确保 所有表的记录 都至少出现一次
9.视图
视图是虚拟表
视图:建立在表|结果集|视图上的虚拟表,有以下作用
(1)简化:select 查询语句
(2)重用:封装select语句 命名
(3)隐藏:内部细节
(4)区分:相同数据不同查询
不是所有的账号都有权限创建视图
1)授权
(1)切换到管理员账号sys
(2) grant dba to 账户名; 授权
revoke dba from 账号名; 回收权限
2)创建视图
create or replace view 视图名 as select语句 [with read only];
要求:所有列必须存在名称。
对视图的删除不会删除原有表的数据
drop view 视图名;
10.索引(了解)
索引是数据库的对象之一,是透明的,有没有索引,sql都一样不会改变
大量的数据的查询,如果数据量比较小,如果不是大量做查询,而是大量的执行增删改的操作,反而会降低效率,因为需要维护索引
索引: 提高查询速度的一种手段 -->目录
1)唯一性较好字段适合建立索引
2)大数据量才有效果
3)主键|唯一: 唯一索引
修改: update 表名 set 字段=值 [,…] where 过滤行记录;
创建: create index 索引名 on表名 (字段列表…)
删除: drop index 索引名
11.表设计
满足三范式的规范
表的名称, 字段,类型,要求( 一对多|多对一(主外键) 多对多(中间表)
1)确定表名
2)确定字段名 类型 +约束(主键 外键 非空 默 检查认 唯一)
主键: 唯一标识一条记录(唯一并且非空)
唯一: 唯一
非空:不能为空
默认: 当没给值时使用给定一个默认值
外键:参考其他表(自己)的某个(某些)字段
检查:自定义的规则
DDL 定义语句–>创建表 create 删除表drop 修改alter
1)创建新表
create table 表名(
字段名 类型 约束,
字段名 类型 约束,
字段名 类型 ,
约束;
约束…
)
追加约束
(1)创建表,不添加约束
(2)创建表的同时添加约束 1)默认约束名 优点:简单 缺点:不便于后期维护
2)已有表中拷贝结构
create table 表名 as select 字段列表 from 已有表 where 1!=1;
3)删除表
drop table 表名 cascade constraints
4)创建表
(同时创建约束+默认名称)这种在创建表的同时创建约束并使用默认约束名称的方式,后期不方便排错, 所以不 推荐使用。其主要的优点是简单。
5)创建表
(同时创建约束+指定名称)创建表的同时创建约束并指定约束的名称,后期方便排错,推荐使用
12.约束(了解)
在 oracle 中所有的一切都是对象, 约束也是一个个的对象,除了能创建约束我们还能对约束进行一些其他的操作
1)约束的禁用与启用
ALTER TABLE tb_user disable constraint nn_user_name;
ALTER TABLE tb_user enable constraint nn_user_name;
2)删除约束
alter table 表名 drop constraint uq_user_email cascade;
3)修改约束
非空: alter table 表名 modify (字段名 varchar2(20));
默认: alter table 表名 modify (字段名 default null);
13.主从表
当有主从表关系的两张表
1)删除表
(1)默认先删除从表后删除主表
(2)删除主表并同时删除主外键约束 cascade constraints
2)删除数据
这个主表数据如果没有被从表中的数据引用,可以直接删除
这个主表数据如果已经被从表中的数据引用,需要处理
(1)先删除从表中引用了的数据 再删除主表的这个数据
(2) 添加外键约束的时候 on delete set null,当主表数据被删除时,从表引用这条数据的外键字段值为null
(3) on delete cascade 删除主表数据的时候级联删除从表中引用了的这些数据
3)序列工具
使用工具|程序管理流水号,序列在创建时 没有与表关联 ,在操作数据时 与表关联,帮助我们管理为表中的主键字段添加值使用的
create sequence 序列名 start with 起始值 increment by 步进;
create sequence sq_class_cid start with 200 increment by 1;
(1)currval 当前值
select 序列名.currval from dual
(2)nextval 下一个值
nextval 下一个值,获取最新值
注意:第一次要使用nextval
select 序列名.nextval from dual;
(3)删除
drop sequence 序列名
14.事务
1)事务
事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。使用事务是为了保证数据的安全有效。
2)事务的四个特性:(ACID)
1)原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
2)一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。
3)隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。
4)持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,
也不应该丢失。
3)事务并发
数据库是多个用户(事务)共享的,当多个用户同时访问数据时,那么在这种情况下就叫做并发。
4)并发时的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted (读未提交) | 是 | 是 | 是 |
Read committed (读已提交) | 否 | 是 | 是 |
Repeatable read (可重复读) | 否 | 否 | 是 |
Serializable (可串行读) | 否 | 否 | 否 |
Oracle 默认的隔离级别是 read committed (读已提交)。
(1)读未提交
当前事务可以读取另一个事务未提交的记录,非常危险,因为另一个事务可能完全回滚!
(2)读已提交
保证一个事务修改的数据提交后才能被另外一个事务读取。
(3)可重复读
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读!
(4)序列化
事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
5)并发问题
(1)更新丢失
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
(2)脏读
一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚。
(3)不可重复读
一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
(4)幻读
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
6)事务的开启
开启事务: 执行insert delete update 操作的时候会自动开启事务
7)事务的结束
(1)成功 :
commit ,执行ddl语句 , 执行DCL 语句 , 正常关闭客户端, 自动提交
(2)失败 :
rollback , 非法退出(非正常关闭)
8)delete 删除
delete from 表名 where 条件; 满足条件的删除,如果没有条件,默认删除全部
(1)删除数据
如果当前的表作为主表存在,需要考虑当前要删除的数据是否有被从表引用,如果有,则有三种解决方式
a. 默认先删除从表中引用了数据,再删除主表的这个数据
b. on delete set null
c. on delete cascade
(2)删除表
从表可以直接删除,如果删除的是主表,有两种情况
a. 先删除所有的从表,再删除主表
b. 删除主表的同时删除主从表之间的主外键约束
9)truncate 数据截断
删除所有的数据 不会开启事务 删除数据的时候从结构上进行检查,如果有被从表引用就不允许使用数据截断.
truncate: 截断所有的数据 ,如果截断的是主表,结构不能存在,外键关联截断数据同时,从结构上检查
四.JDBC入门
jdbc: java database connectivity java 与数据库的连接
1.java接口
java 制定标准,不同的数据库厂商实现 接口即可。**java 中提供的接口 java.sql.***包下,常用接口如下
接口名称 | 作用 |
java.sql.Connection | 连接 |
java.sql.Statement | 静态处理块 |
java.sql.PreparedStatement | 预处理块 |
java.sql.ResultSet | 结果集 |
java.sql.ResultSetMetaData | 结果集元信息 |
2.oracle 厂商实现接口(jar)
F:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar 视安装路径而定
3.jdbc 步骤
1、选择快递公司 | 加载驱动(完整路径) |
2、与快递公司建立联系(电话号码 唯一信息) | 建立连接(url 用户名 密码) |
3、快递员 收包裹 | 创建处理块 Statement PreparedStatement |
4、打包 投递 | 执行: execute(ddl) int executeUpdate(dml) ResultSet executeQuery(select) |
5、签收 | 分析结果 :ddl -->没有异常 dml–>0 select–>分析结果集 |
6、打发走人 | 释放资源 |
4.连接
1)准备工作
引入驱动包
构建路径 build path
测试用户是否正确登录
2)建立连接
(1)连接字符串
驱动: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@db 服务器地址:端口:实例
连接 url–>jdbc:oracle:thin:@localhost:1521:orcl
用户名与密码: scott tiger
3)编写测试类
加载驱动
a)硬编码: new oracle.jdbc.driver.OracleDriver();
b)软编码: class.forName(“oracle.jdbc.driver.OracleDriver”)
4)建立连接
Connection con =DriverManager.getConnection(“jdbc:oracle:thin:@locahost:1521:orcl”,“scott”,“tiger”)
5.处理块
1)静态处理块 Statement
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。Statement 对象,用于执行不带参数的简单 SQL 语句。执行静态 SQL 语句并返回它所生成结果的对象。
(1)创建
连接.Connection.createStatement()
(2)执行
ddl -->execute(dd语句) – 通常不会在代码中执行
dml -->executeUpdate(dml语句)
select -->executeQuery(select)
(3)特点
处理 不变的静态的 sql 语句
优点: 直接查看sql ,方便处理错误
缺点:性能不高 拼接 sql 麻烦 可能存在 sql 注入
2)预处理块 PreparedStatement
PreparedStatement 接口继承了 Statement,并与之在两方面有所不同:有人主张,在 JDBC 应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement 代替 Statement.也就是说,在任何时候都不要使用 Statement。
由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
(1)创建
创建: 连接.prepareStatement(sql)
(2)执行
存在? ,先填充参数再执行
ddl -->execute()
dml -->executeUpdate()
select -->executeQuery()
(3)特点
处理 不变的静态的 sql 语句 |可变的 sql 语句 带 ? 的 sql
优点:性能高,方便编写sql 不存在sql注入 安全
缺点:不能直接打印sql语句 不方便处理错误
6.分析
执行完 SQL 语句后可能成功也可能失败,如果成功,有数据则我们很大一部分情况是需要获取查询的结果。数据就是一切
ddl:没有异常就是成功
dml: 结果>0就是成功
select:分析结果集
对于 select 的结果集进行分析,类似于迭代器, 先判断(移动)再获取
next()
getXxx(索引|列名|别名)
7.释放资源
释放资源的原则是 先打开的后关闭, 则我们的顺序一般为: 结果集->处理块->连接
8.JDBC的简单实现
jdbc(java连接数据库)实现的步骤:
- 1.加载驱动(选择数据库)
- 2.获取连接(与数据库建立连接)
- 3.准备sql语句(要执行的sql)
- 4.准备处理块(发送和执行sql语句)
- 5.发送sql语句(发送执行sql)
- 6.获取结果集(执行sql的结果)
- 7.关闭资源
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动(选择数据库)
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获取连接(与数据库建立连接)
//Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "SCOTT", "TIGER");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME =xe)))", "SCOTT", "TIGER");
//3.准备sql语句(要执行的sql)
String sql="select empno,ename from emp where deptno=30"; //注意:sql不要加分号
//4.准备处理块(发送和执行sql语句)
Statement state=conn.createStatement();
//5.发送sql语句(发送执行sql)
ResultSet result=state.executeQuery(sql);
//6.获取结果集(执行sql的结果)+处理
System.out.println(result);
while(result.next()){ //判断是否有下一个条记录,如果有返回true,没有返回false
int num=result.getInt(1);
String name=result.getString("ename");
System.out.println(num+"-->"+name);
}
//7.关闭资源
result.close();
state.close();
conn.close();
}
}