JDBC
JDBC --Java Database Connectivity:Java访问数据库的解决方案。 --解决服务器与数据库交互的问题
--JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。
做浏览器、网页:需学会HTML、CSS、JS 还要学会Servlet,其解决的是浏览器与服务器交互的问题。
Spring框架:提高java继承、JavaSE的效率
SpringMVC、Struts2框架:提高Servlet的效率
MyBatis、Hibernate框架:提高JDBC的效率
jQuery框架:提高HTML、CSS、JS的效率。
一、JDBC
1.什么是JDBC? Sun推出的用来访问数据库的解决方案。
2.要点:
--接口:只有一套、Sun规定的统一接口、是我们学习的重点
--实现类:多套、有数据库厂商实现的、有工具可以自动管理他们。
不同厂商提供的实现类,我们叫做驱动。对于我们以后使用时,只要导入对应的jar包。DriverManager来管理这些Jar(驱动)。
3.JDBC访问数据库的工作过程:
--加载驱动:告诉DriverManager我们要用哪个jar包(驱动)。
--创建连接:调用DriverManager的getConnection方法,获得Connection接口,用于与数据库连接
--通过连接创建Statement:
--写SQL语句,执行SQL语句:
--executeQuery() ->DQL(SELECT)
--executeUpdate() ->DML(INSERT\UPDATE\DELETE)
--execute() ->可以执行任何SQL,但通常用他执行DDL
--关闭连接
**将简单的参数存入properties文件中,是java的经典做法。
4.连接池
#直接使用DriverManager的问题
--它会无节制的创建连接,当连接数达到上限时,数据库会崩溃。
#使用连接池可以解决该问题
--连接池对连接进行管理和限制,避免达到上限;
--连接池中的连接可以复用,从而提高效率。
#常用的连接池:
--DBCP
--C3P0
===============================================================
JDBC 2016.5.25
Statement --->发送SQL给DB
DB:1.检查SQL 2.编译SQL,生成计划 3.运行计划 4.返回结果
结论:
1.生成计划很慢,但相同的SQL可以复用一个计划
2.结构相同但参数不同的SQL,是不同的计划
SELECT * FROM emps WHERE empno=1
SELECT * FROM emps WHERE empno=2
3.Statement不适合执行这样的SQL
只适合执行静态的(无参数)SQL
总结:一般使用Statement执行DDL(CREATE\DROP\ALTER\TRUNCATE)
##PreparedStatement:提升性能,防止注入攻击
select * from emps_zc where deptno=?
PreparedStatement --->第一步:发送SQL给DB ---DB检查SQL--->生成计划
--->第二步:发送参数 ---DB运行计划--->返回结果
结论:
1.允许使用?代表一切参数,使相同结构的SQL可以固定下来
2.访问数据库:
-发送SQL
-发送参数
3.上述两个处理使得计划可以复用,因此效率可以提高
总结:PreparedStatement适合执行动态SQL
##JDBC支持的日期类型
--java.sql.Date(年月日)
--java.sql.Time(时分秒)
--java.sql.Timestamp(年月日时分秒)
上述3个日期类型都继承与java.util.Date
##结果集元数据
#元(Meta)
-根本、本质
#元数据(MetaData)
-数据的本质
-数据的基本信息
-用来描述某数据的数据
#结果集元数据(ResultSetMetaData)
-用来描述结果集的数据
-结果集的基本信息
##JDBC对事务的支持
#1.自动提交(默认)
-JDBC默认支持事务
-执行executeUpdate()时,JDBC会自动commit
#2.手动提交
-con.setAutoCommit(false); //取消自动提交
-con.commit(); //手动提交事务
-con.rollback(); //回滚事务
##事务
#什么是事务?
满足如下特性的数据库访问叫事务
1.原子性:事务是一个完整的过程,要么都成功,要么都失败。
2.一致性:事务前后的数据要一致,即收支平衡(总和不变)
3.隔离性:事务过程中的数据不能被访问
4.持久性:事务一旦达成,就永久有效,不能否认。
##JDBC对分页的支持
#假分页(内存分页)
--首次查询时查出所有数据,存入List,并从List中取出第一页数据返回;
--再次查询时,不再访问数据库,而是直接从List中取出第N页数据返回。
--特点:十分占内存,首次查询巨慢,以后查询很快;
--适用于数据量非常小的小项目
#真分页(物理分页)
--每次查询都使用分页SQL从库中查出一页的数据返回;
--特点:节约内存,每次查询的速度都较快;
--适用于任何项目
page*size 本页最后行
(page-1)*size 上页最后行
(page-1)*size+1 本页第一行
begin = (page-1)*size+1
end = page*size
##JavaBean(补充)
#满足如下规范的类:
1.有package
2.有默认构造器
3.实现序列化接口
4.有get/set方法 (这一点不是必须得)