第一部分:今日技术操作及其概述
* 课堂知识点笔记
*导包都是java.sql包
*配置文件在src上面右键,选择file,是 .properties格式
1.什么是JDBC
*JDBC(Java Data Base Connectivity.java数据库连接)是一种用于执行SQL语句的java API,可以为多种关系数据库
提供统一访问,它由一组用java语言编写的类和接口组成。
2.什么是数据库驱动
*驱动:两个设备(应用)之间通信的桥梁。
3.为什么学习JDBC
*SUN公司提供一套统一的规范(接口)。然后各个数据库生产商提供这套接口的实现。这套接口规范就是JDBC的规范。
4.如何创建项目
*引入jar包(可以在项目下创建一个lib包,把jar包复制到里面,在右键添加到Build path中)
5.JDBC开发步骤
[1]注册驱动
[2]获取数据库连接
[3]获取执行者对象
[4]执行sql语句。并且获取结果集
[5]处理结果集
[6]释放资源
6.JDBC的API详解之DriverManager
*DriverManager是一个驱动管理类
*作用一:注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
*作用二:获得连接
url: 与数据库连接的路径
user: 与数据库连接的用户名
password:与数据库连接的密码
主要关注的是url写法
*jdbc:mysql://localhost:3306/web_test3
jdbc :连接数据库的协议
mysql :是jdbc的子协议
localhost :连接的MySQL数据库服务器的主机地址。(连接是本机就可以写成localhost),如果连接不是本机的,就需要写上连接主机的IP地址。
3306 :MySQL数据库服务器的端口号
web_test3 :数据库名称
7.JDBC的API详解之Connection
*Connection:与数据库连接对象 (连接者)
*作用一:创建执行SQL语句的对象
[1]Statement 执行SQL
[2]PreparedStatement 执行SQL对SQL进行预处理。解决SQL注入漏洞
*作用二:管理事务
8.JDBC的API详解之Statement
*Statement:执行SQL (执行者)
*作用一:执行SQL
?ResultSet executeQuery(String sql); 执行查询(执行select语句)。
int executeUpate(String sql); 执行修改,添加,删除的SQL语句。
*作用二:执行批处理
9.JDBC的API详解之ResultSet
*ResultSet:结果集。(通过select查询,只有查询才能有结果集)
*遍历结果集 rs.next()
10.JDBC的资源释放
*JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement,Connection。
这几个对象中尤其是Connection对象是非常稀有的。这个对象一定要做到尽量晚创建,尽早释放掉。(connection是与数据库的连接)
*将资源释放的代码写入到finally的代码块中。
11.JDBC工具类的抽取
*因为传统JDBC的开发,注册驱动,获得连接,释放资源这些代码都是重复编写的。所以可以将重复的代码提取到一个类中来完成。
12.JDBC的配置信息提取到配置文件 【公共的部分通过工具类给抽取出来了,还需要将JDBC配置信息提取到配置文件中】
*第一种:?属性文件
格式:扩展名是.properties
内容:key=value
*第二种: XML文件
?reWriteBacthedStatements=true 加快运行速度,在配置文件的路径后面加上能够提高运行速度
eg:url=jdbc:mysql://localhost:3306/day23?reWriteBacthedStatements=true
=====老师课堂代码补充=====
[1] JDBC开发步骤———————– 【*面试可能会问到】★★★★★
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; //导包都是sql包
/*
* 回顾原生的JDBC开发步骤
*/
public class JDBCDemo01 {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName(“com.mysql.jdbc.Driver”); //Driver d一定要大写,小写就出错
//2.获取数据库连接
String url = "jdbc:mysql://localhost:3306/day23"; //day23是数据库的名字
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);
//3.获取执行者对象
//Statement stat = con.createStatement(); 存在sql注入攻击的安全隐患
String sql = "SELECT * FROM student"; //--------预处理,student是表名,不是数据库名字
PreparedStatement pst = con.prepareStatement(sql);
//给你的sql语句中?占位符赋值
//pst.setXXX(编号,值);
//4.执行sql语句。并且获取结果集
ResultSet rs = pst.executeQuery();
//5.处理结果集
while(rs.next()) {
System.out.println(rs.getInt("sid") + "\t" + rs.getString("sname") + "\t" + rs.getInt("sage") + "\t" + rs.getDouble("score"));
}
//6.释放资源
con.close();
pst.close();
rs.close();
}
}
[2]JDBC文件配置———————–
driverClass=com.mysql.jdbc.Driver 【不能加双引号】
url=jdbc:mysql://localhost:3306/day23?reWriteBacthedStatements=true
username=root
password=root
[3]JDBC工具类———————————————-
package com.itheima.utils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
//私有构造方法
private JDBCUtils(){}
//声明一些配置文件所需要的成员变量
private static Connection con; // 数据库连接对象
private static String driverClass; // 注册驱动部分
private static String url; // url部分
private static String username; // 用户名
private static String password; // 密码
static { 【静态代码块】
try{
//读取配置文件信息,为成员变量进行赋值
Properties prop = new Properties();
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties"); 【db.properties 配置文件文件名称】
prop.load(is);
driverClass = prop.getProperty("driverClass"); //为成员变量进行赋值,读的是配置文件里面对应的值,通过键获得值
url = prop.getProperty("url"); //要加双引号,如果不加双引号就是上面配置文件的私有成员变量,就不是配置文件里面的键值对的值
username = prop.getProperty("username");
password = prop.getProperty("password");
//注册驱动
Class.forName(driverClass); //driverClass在配置文件中就是=com.mysql.jdbc.Driver,所以这里只需要写driverClass即可
//获取数据库连接
con = DriverManager.getConnection(url, username, password);
}catch(Exception e) {
e.printStackTrace();
}
}
//提供一个公共的静态的方法,用于返回数据库连接对象 -----在static括号外面写
public static Connection getConnection(){ 【上面con被私有了,不能创建对象,只有通过类名调用】
return con; 【便于增删改查,调用con】
}
//提供释放资源的方法 【前固定,后可以变con stat rs】
public static void release(Connection con,Statement stat,ResultSet rs){ 【release方法名,可变】
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
con = null;
}
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
stat = null;
}
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
}
public static void release(Connection con,Statement stat){ 【方法重载,这个是没有结果集的,增删改没有结果集,上面一个是有结果集的】
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
con = null;
}
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
stat = null;
}
}
}
2.JDBC增删改查———————————————-
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.itheima.utils.JDBCUtils;
/*
* 使用工具类完成增删改查的动作
*/
public class JDBCDemo02 {
public static void main(String[] args) {
//insert();
//del();
//update();
//select();
}
//查询的方法
public static void select(){
Connection con = null;
PreparedStatement pst = null; //解决注入漏洞
ResultSet rs = null;
try{
//获取数据库连接 [getConnection()是JDBc工具类中的静态方法]
con = JDBCUtils.getConnection(); //工具类和数据库建立了连接,对于增删改查只需要和工具类建立连接,就是和数据库建立了连接
//获取执行者对象
String sql = "SELECT * FROM student WHERE score > ?"; // 查询分数大于85分的
pst = con.prepareStatement(sql);
//为?号占位符赋值
pst.setDouble(1, 85);
//执行sql语句,并且获取结果集
rs = pst.executeQuery();
//处理结果集
while(rs.next()) {
System.out.println(rs.getInt("sid") + "\t" + rs.getString("sname") + "\t" + rs.getInt("sage") + "\t" + rs.getDouble("score"));
}
}catch(Exception e) {
e.printStackTrace();
}finally{
//释放资源
JDBCUtils.release(con, pst, rs);
}
}
//修改的方法
public static void update(){
Connection con = null;
PreparedStatement pst = null;
try{
//获取数据库连接
con = JDBCUtils.getConnection();
//获取执行者对象
String sql = "UPDATE student SET sage=?,score=? WHERE sid=?";
pst = con.prepareStatement(sql);
//给?号占位符进行赋值
pst.setInt(1, 25); //【第一个占位符?的值,在数据库中改为25岁】
pst.setDouble(2, 100); //【第二个占位符?的值,在数据库中改为100分】
pst.setInt(3, 2); //【第三个占位符?的值,在数据库中改为对id为2的人,对其年龄和分数进行修改】
//执行sql语句
int num = pst.executeUpdate();
if(num > 0) { //数据库中有一个共有几行受到影响,如果>0,表示数据库中的至少一行受到影响,进行修改,就提示修改成功
System.out.println("修改成功");
}
}catch(Exception e) {
e.printStackTrace();
}finally{
//释放资源
JDBCUtils.release(con, pst);
}
}
//删除的方法
public static void del(){
Connection con = null;
PreparedStatement pst = null;
try{ 【try catch处理异常,如果后面出错还可以继续执行,直接抛出异常下面代码就不能继续执行】
//获取数据库连接
con = JDBCUtils.getConnection();
//获取执行者对象
String sql = "DELETE FROM student WHERE sid = ?";
pst = con.prepareStatement(sql);
//给?号占位符进行赋值
pst.setInt(1, 1);
//执行sql语句
int num = pst.executeUpdate();
if(num > 0) {
System.out.println("删除成功");
}
}catch(Exception e) {
e.printStackTrace();
}finally{
//释放资源
JDBCUtils.release(con, pst);
}
}
//插入的方法
public static void insert(){
Connection con = null;
PreparedStatement pst = null;
try{
//获取数据库连接 【前面注册驱动啥的,在工具类中已经创建好了,直接调用即可】
con = JDBCUtils.getConnection();
//获取执行者对象
String sql = "INSERT INTO student VALUES (null,?,?,?)";
pst = con.prepareStatement(sql);
//给?号占位符进行赋值
pst.setString(1, "赵六");
pst.setInt(2, 26);
pst.setDouble(3, 99.5);
//执行sql语句
int num = pst.executeUpdate();
if(num > 0) {
System.out.println("新增成功");
}
}catch(Exception e) {
e.printStackTrace();
}finally{
//释放资源
JDBCUtils.release(con, pst);
}
}
}