JDBC
1、JDBC是什么?
Java DataBase Connectivity(Java语言连接数据库)
2、JDBC的本质是什么?
JDBC是SUN公司制定的一套接口(interface)
java.sql.*; (这个软件包下有很多接口。)
接口都有调用者和实现者。
面向接口调用、面向接口写实现类,这都属于面向接口编程。
为什么要面向接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力。
多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
建议:
Animal a = new Cat();
Animal a = new Dog();
// 喂养的方法
public void feed(Animal a){ // 面向父类型编程。
}
不建议:
Dog d = new Dog();
Cat c = new Cat();
思考:为什么SUN制定一套JDBC接口呢?
因为每一个数据库的底层实现原理都不一样。
Oracle数据库有自己的原理。
MySQL数据库也有自己的原理。
MS SqlServer数据库也有自己的原理。
....
每一个数据库产品都有自己独特的实现原理。
JDBC的本质到底是什么?
一套接口。
3、JDBC开发前的准备工作,先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。
classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar
以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。
IDEA有自己的配置方式。
JDBC编程六步(需要背会)
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句(DQL DML....)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
JDBC编程六步的具体代码,需要熟练敲打
/*
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;*/
import java.sql.*;
public class JDBCTest
{
public static void main(String[] args){
//JDBC编程六步
/*
1、注册驱动
2、获取数据库连接
3、获取数据库操作对象
4、执行SQL语句
5、处理查询结果集(只有当第四步的SQL语句是查询语句时才需要进行)
6、释放资源
注意:需要对异常进行捕捉try 。。。catch 或者抛出throws
*/
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
//1、注册驱动
//com.mysql.cj.jdbc.Driver 是mysql厂家编写的,实现了java.sql.Driver接口。
//需要注意的是:下面的两个Driver中有一个包名无法省略,因为如果省略了,java将无法分辨两个Driver
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());//这里就是注册驱动
//2、获取数据库连接
String url="jdbc:mysql://localhost:3306/mysql";
String user="root";
String password="123";
conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);//com.mysql.cj.jdbc.ConnectionImpl@7a36aefa
//3、获取数据库的操作对象
//通过一个连接对象Connection是可以创造多个操作对象的
stmt=conn.createStatement();
//4、执行SQL语句
//String insertSql="insert into c_student(no,name,password) values(50,'张三','ccc')";插入
String updateSql="update c_student set name='小花' , password='ddd' where no=1";
//int count=stmt.executeUpdate(insertSql);
int count=stmt.executeUpdate(updateSql);
//executeUpdate()这个方法的返回值是一个整数
System.out.println(count);
//5、处理查询结果集
String selectSql=" select * from c_student";
rs=stmt.executeQuery(selectSql);
while(rs.next()){
int no=rs.getInt("no");
String name=rs.getString("name");
String password1=rs.getString("password");
System.out.println(no+","+name+","+password);
}
}
catch(SQLException e){
//打印异常信息
e.printStackTrace();
}
finally{
//6、释放资源
//先释放ResultSet结果集,然后释放Statement操作对象,最后释放Connection连接对象
if(rs!=null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(stmt!=null){
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
}
使用资源管理器,读取属性配置文件
配置文件编写
使用预编译的数据库操作对象,解决SQL注入问题
事务
将自动提交机制改成手动提交
Connection中有一个方法,setAutoCommit,返回值为void,有一个参数autoCommit,为真表示启动自动提交模式。为false表示禁用自动提交模式
整个jdbc的事务主要是三行代码,需要背熟
封装jdbc工具类DBUtil
在同一个没有结束的程序中,DBUtil只加载一次
1、注册驱动,使用静态代码块
静态变量与静态代码块都是类加载的时候就开始执行,但是按照自上而下的顺序进行读取
2、获取连接
3、释放资源
如果没有结果集的时候,即sql语句不是进行查询操作时,可以将rs这个参数传一个空值null;因为释放资源时是有判断是否为空的
关于DQL语句的悲观锁
oracle数据库的属性配置文件的编写
查询语句—【整理】:
1.查询命令: from where gourp by having select order by limit
2.查询命令执行优先级
from: 一个查询语句永远最先执行的命令 from;负责将硬盘表文件加载到内存生成临时表
where:循环遍历内存中临时表中数据行,每次定位一个数据行,如果这个数据行满足定位
条件保存到一个全新的临时表
group by : 对临时表中数据行进行分类。将具有相同特征数据行保存到同一个临时表
having: 过滤group by生成的临时表,将不满足条件的临时表从内存删除
select :如果select面对临时表来自于[from,where],select将指定字段所有的内容读取出来保存到一个全新临时表中。如果select面对临时表来自于[group by ,having],select往往面对多个临时表。此时select对某一个临时表字段读取时,只会读取当前字段的第一个行数据。读取内容保存到全新临时表
order by: 对select生成的临时表内容进行排序。将排序后数据行保存到一个全新的临时表
limit: 只存在mysql数据库。对当前临时表指定数据行进行截取
from > where > group by >having > select > order by >limit
3.查询语句特征:
1.查询命令执行时,不会对表中数据进行修改
2.七个查询命令中,除了from命令之外,其他六个查询命令操作临时表都是上一个查询命令生成临时表
3.七个查询命令中,除了having命令之外其他六个查询命令在执行完毕后一定会在内存产生临时表。
4.在某一个查询命令执行完毕后,mysql自动将上一个查询命令生成的临时表 进行删除.在查询语句执行完毕后,用户看到临时表由查询语句中最后执行的查询命令提供
5.细化:
where命令与having命令区别
1.where现在group by 前面,在group by之前执行
2.where执行完毕后,一定会生成临时表。having不会生成临时表,有可能删除已经存在临时表
3.where循环遍历临时表每一个数据行。where后面使用判断条件不能使用聚合函数(count(), sum(),max())
having循环遍历每次遍历是一个临时表。having后面一般都是用聚合函数作为判断条件。
主要的学习任务
1.任务:
掌握互联网通信开发流程(增删改查)
2.学习内容:
1.【重要】掌握互联网通信流程和特征
2.【Servlet规范】:Java文件在互联网通信中地位和作用
3.【JSP规范】: 如何将JAVA中数据与HTML标签写入到用户浏览器上
4.【AJAX】: 控制浏览器发送请求行为和浏览器展示数据行为
5.【jquery】: JavaScript封装版。简化JavaScript操作DOM对象难度
6.【MVC开发模式】:互联网开发时,黄金规则
7.【常识性技能】 ThreadLocal, 代理设计模式------》20000
static理解 反射机制
以上是对动力节点杜老师JDBC相关课程上课的课堂笔记的总结