JDBC全解(个人见解,不成熟地方还请谅解和补充,O(∩_∩)O谢谢!)

一、Java Database Connectivity(JDBC):
- JDBC能使Java访问数据库,是Java访问数据库的解决方案(*).

1.SUN发明了java,规定了JDBC接口.
2.SUN提供了一个接口DriverManager(驱动管理器)继承JDBC接口.
3.DM接口创建"Driver驱动"实现类由数据库厂商提供的.


1)JDBC工作过程:
1.注册驱动(加载JDBC,实现在DM中自动注册,只需注册一次),告诉DriverManager要使用哪一套驱动实现类.
2.由Connection接口实现了连接数据库的功能(创建连接).
3.Connection创建Statement接口能执行SQL语句.
4.Statement提供3种SQL执行语句:
executeQuery()查询DQL;
executeUpdate()增删改DML;
execute()一般执行DDL(不常用)等方法,处理结果集.
5.关闭连接对象,释放资源;否则连接消耗越来越少,数据库会崩溃.

- 使用properties配置简单参数是Java经典的用法.

注:
maven自动导入包,maven从服务器上搜包,将包下载到maven上.
maven服务器:
1.maven中央库
2.maven中国镜像库(阿里云)
3.达内maven服务器 maven.tedu.cn

src/main/java包:放入正式代码.
src/main/resourse包:放入配置文件
src/test/java包:放入测试代码
src/test/resourse包:放入测试配置文件

正式情况下,会导入正式代码,测试代码会被丢弃.




2)JUnit测试方法:
1.JUnit可以让类中的每个方法单独执行.
2.对方法的要求
 - 方法是公有的
 - 没有返回值
 - 没有参数
 - 前面必须写@Test注解
3.JUnit用来测试,而测试代码在正式WEB项目里不需要,
      会被连同JUnit包一起丢弃,所以JUnit包不用maven导入也可.

JUnit执行方法:
1)Window--Show View--Outline方式执行.
2)包下执行.
3)鼠标点方法名,右键执行.


快捷键:
Ctri+Shift+T  OPen Type工具搜类名.
ctrl + shift + X/y(大写/小写).
Ctrl+t(看其类的父类及其子类)
Window--Show View--Outline(a->z排序)/Ctrl+O看类的大纲
alt+shift+m 将一段代码封装成一个方法


二、数据库连接池(数据源)
1)使用DriverManager(驱动管理器)缺点:
1.每次调用DriverManager都会创建一个新连接,没有复用连接,效率低.
2.他没有控制连接的上限,并发量大的时候可能会导致数据库崩溃.(如:淘宝客户访问服务器时).

2)连接池的作用:
1.它能复用连接,提高效率.
2.它能控制连接的上限,避免数据库崩溃.
(解决上述DriverManager的问题.)

3)常用连接池:(连接池管理连接,池是容纳对象的容器.)
1.DBCP(DataBase connection pool):数据库连接池--Apache DBCP
2.C3P0

4)连接池的工作原理:(其底层原理看不到)
- 所谓数据库连接池,可以看错:在用户和数据库之间创建一个"池",这个池中有若干个连接对象,
 当用户仙姑要连接数据库,就要先从连接池中获取连接对象,然后操作数据库;
- 一旦连接池中连接对象被拿光了,下一个想要操作数据库的用户就要等待其他用户释放连接对象,
 等其他对象把连接对象放回连接池中,这时候等候的该用户才能获取连接对象,访问数据库.
 
1.创建连接池对象的时候,连接池会自动创建即初始化一批连接以供使用(可配:具体数量批可以配置设定,较灵活),并标记为空闲状态.
2.当调用它获取一个连接时,它会返回一个连接,并标记为占用态.
3.当归还连接池,连接池会将其内部数据清空,并标记为空闲态.
4.当连接池发现连接快不够用时(可配),它会在创建一批连接(可配).
5.当占用连接达到上限(可配)时,连接池会让新用户等待.
6.当高峰期过后,连接池会自动关闭一批(可配)连接.

5)如何使用连接池:
1.sum规定了连接池接口DataSource,不同厂商可以自己实现.
2.DBCP提供了实现类BasicDataSource.


三、DBUtil连接池
- properties中加2连接池参数:
1.initsize:初始化连接池数量(创建连接池时就创建的了解对象的数量).
2.maxsize:最大连接数(之后可再创建连接对象,但有上限,超过上限的用户需要等待).
连接池只需要一个,在static中创建并读取properties参数.


Maven服务器配置地址:
window-Preference-Maven-User Settings-settings.xml文件.


四、Statement和PreparedStatement
1)它们的联系
1.它们都能执行SQL.
2.PreparedStatement extends Statement.
2)它们的区别
1.Statement适合执行静态(无参数)的SQL,事先没有进行预编译,参数写死.
2.PreparedStatement适合执行动态(有参数)的SQL,PS有能力执行带?的SQL,会将SQL进行预编译,
当SQL语句重复执行时,数据库会调用以前预编译好的SQL语句,PS性能更佳;
能对传入参数进行强制类型转换.

预编译:用?为占位符,每次只需动态传参;而不至于将语句写死,而导致每次都要重写该SQL语句.
内部强制类型转换:设置参数时,setString,但传入数据库时是int值.
3)Statement工作原理
Connection创建Statement对象;
先检查SQL,数据库再将SQL编译成计划,然后执行计划,最后返回给Statement.
1.编译比较耗时(需生成class文件)
2.计划会保存在DB上
3.相同SQL会复用计划
注:要尽量复用计划.
Statement创建对象后:
e.g.
selet * from emp where empno = 1
selet * from emp where empno = 2
2个逻辑相同,仅仅是参数不同的SQL,数据库依然会创建2个计划,效率偏低.
Statement这样执行SQL效率偏低.

4)PreparedStatement工作原理
Connection创建PreparedStatement对象;
先检查SQL,数据库再将SQL编译成计划;
执行时,可以不写死.将来再赋值
selet * from emp where empno =? ->1
selet * from emp where empno =? ->2
PS有能力执行带?的SQL,并且在数据库执行计划时,再次传入SQL所需的条件.
从而达到计划被复用的目的,提高了效率.
所以它适合执行动态SQL.
(PreparedStatement插入数据时,数据表中的指针首先指向最后一条数据之后,等待用户分别设置里面内容后,
执行SQL语句)

5)使用Statement执行SQL,不能写?,需要直接拼入条件,容易被人钻空子.
 数据库有一个原则:一旦将SQL编译为计划,则在执行此计划时,无论参数是多少,都不会改变计划的本意.

五、结果集(读取表的结构)
1)结果集ResultSet遍历原理:
ResultSet内部有指针,实际上就是变量.
该变量指向哪一行数据,就可以通过get方法获取改行数据.
(指针默认指向第一行之上,每次调next()方法都移动一行,调取下一行数据;
最终指针指向最后一行之下,next()返回false,循环结束.)

2)ResultSetMetaData(结果集元数据)
元:根本、本质.
元数据:数据的本质(对数据的概括/描述)
结果集元数据:对结果集进行描述的数据,包含多少列,列名,列类型等(读取了表的结构).


3)可滚动结果集(实际用不到)
简单了解,几乎不用.


六、JDBC中的事务管理
1)自动管理
1.JDBC会自动管理事务.
2.每次调用executeUpdate()时,JDBC会自动commit.

若业务中只包含一次DML操作,自动管理事务即可.

2)手动管理
1.取消自动管理事务:conn.setAutoCommit(false);
2.手动提交:conn.commit();
3.手动回滚:conn.rollback();

若业务中包含多次DML操作,需要手动管理事务.

3)什么是事务?
满足如下特点的数据库访问:(4大特性)
1.原子性:事务是一个完整的过程,要么都成功,要么都失败.
2.一致性:事务访问前后的数据要一致,即收支平衡.
3.隔离性:事务访问过程中的数据不能被别人访问.
4.持久性:事务一旦完成,就永久有效.

大部分数据库都支持事务,上述4点完整的构成了事务.


七、JDBC高级编程
1)批量insert(添加数据)
通常导入功能需要用到批量添加数据.
必须SQL相同的数据才能一起批量添加.

PreparedStatement:
addBatch():将数据暂存到PS上.
executeBatch():将PS上的数据全部提交发送给数据库.
clearBatch():清空PS上的数据,以便下一轮再处理.

八、获取自动生成的主键
1)使用场景
1.用户和英雄是1对多的关系,通过主外键关联.
2.需先增加用户,然后再给用户增加英雄,而后者需获取英雄主键.
2)反查ID(麻烦)
insert into values(seq.nextval,?,?)

3)单独执行序列
select seq.nextval from dual -> id 
insert into user values(?,?,?)

4)让ps获取生成的ID(最佳)
详见案例.

九、分页
1)假分页(内存分页,工作中不会用到)
第1次查询某表是从数据库中查询所有数据,将数据存入内存(即存入对象中)
第N次(第2次开始)查询则从内存中取数,而不再访问数据库了
第1次查询巨慢,以后查询较快,耗内存.
> 只适合数据量很小的小项目(数据量多会浪费内存)

2)真分页(物理分页,工作中常用)
每次查询某表都是查询一页数据(分页SQL)
每次查询速度都较快,不耗内存(每次内存就8-10条);
> 适合任何项目

3)oracle分页SQL

select * from (
 select e.*, rownum r from (
   select * from emps_zzq order by empno
 ) e
) where r between 11 and 20;

4)分页条件
本页最大行 = page*size
本页最小行 = (page-1)*size+1




十、数据的封装
封装的方法:(接口、工厂之后讲)
实现类DAO (Data Access Object):数据访问对象
是建立在数据库和业务层之间,封装所有对数据库的访问.(以便复用)
> 用集合封装数据不直观

数据(实体)对象:entity/pojo/po/vo.
算法(逻辑):增、改、删、查询.
> 算法DAO访问DB数据库,返回的数据集rs封装到数据实体对象中.
(rs返回一次后,会清空.)





补充:JDBC中的日期类型
java.sql.Date 年月日 (而java.util.Date 年月日时分秒毫秒)
java.sql.Time 时分秒
java.sql.Timestamp 年月日时分秒
上述日期都继承于java.util.Date.



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值