什么是JDBC?
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
Java提供访问数据库的规范(一套类和接口)称为JDBC,而生产厂商提供规范的实现类称为驱动。
JDBC是接口,驱动是接口的实现
JDBC的使用步骤
导包等过程不赘述,以下为使用步骤
import java.sql.*;
/*
1. 注册驱动: 告知JVM 即将使用哪种数据库
2. 建立连接 和MySQL之间建立TCP连接,保证可靠传输
3. 获得语句执行平台:通过连接对象 获得sql 语句的执行者对象
4. 执行sql语句: 通过执行者对象 来执行sql 语句 获取执行后的结果
5. 处理结果:如果有结果才进行处理,例如执行查询语句,对结果集合进行处理
6. 释放资源(例如TCP连接) 调用一堆close();
*/
public class JDBCDemo {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//1.注册驱动 利用反射机制加载类即可 Driver类中的static代码块 会自动注册新的驱动注释掉的方法会向JVM注册两次,浪费资源
// DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
// 2.与数据库建立连接
String url = "jdbc:mysql://localhost:3306/mybase";
String name = "root";
String password = "123";
Connection con = DriverManager.getConnection(url,name,password);
// 3.通过连接得到执行sql语句的对象
Statement stat = con.createStatement();
// 4.通过stat 对象执行 sql语句
String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES('飞机杯',200,'玩具');";
int row = stat.executeUpdate(sql);
System.out.println(row);
// 5.处理结果
// 6.释放资源,一系列的close()
stat.close();
con.close();
}
}
1.执行SQL语句的两种不同类 Statement 和 PreparedStatement
第1种 Statement 类
// 3.通过连接得到执行sql语句的对象,sql 为所要执行的SQL语句的字符串形式
String sql = "select 8 from sort;";
Statement stat = con.createStatement();
stat.executeUpdate(sql);//sql为跟新操作
stat.excuteQuery(sql);//sql为查询操作,会返回 ResultSet 接口的实现类的对象,可以进行遍历等操作
这种方式每次都会向数据库发送SQL语句,数据库进行编译。如果经常使用,会造成多次编译,浪费资源。
第2种 PreparedStatement 类
PreparedStatement 是Statement 的子类,它是预编译的SQL语句的抽象表示。使用PreparedStatement 相较于Statement 主要有两个优点
- 避免了不必要的多次编译,减少了数据库的负担
- 可以避免SQL注入问题
为了解决注入问题,PreparedStatement在SQL语句中通过使用占位符?来代替常量字段值,setXXX( parameterIndex, )方法来填充字段值,取代掉占位符,形成完整的可执行的SQL语句。parameterIndex为?的下标
在设定的参数的以下示例中, con表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
此外,对于数据库的配置通常采用XXXX.properties文件来进行配置,这样修改更加方便,而不是直接将配置型写在源代码中。
package jdbcutils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
/*
driverClass 数据库驱动类名
url 数据库连接地址
name 登录名
password 密码
以上配置信息写在 database.properties文件中
*/
public class JDBCUtiles {
private static Connection con ;
private static String driverClass, name, password,url;
static {
try {
loadConfig();
Class.forName(driverClass);
con = DriverManager.getConnection(url,name,password);
}catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void loadConfig() throws IOException {
InputStream in =
JDBCUtiles.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(in);
driverClass = pro.getProperty("driverClass");
name = pro.getProperty("name");
password = pro.getProperty("password");
url = pro.getProperty("url");
}
public static Connection getConnection() {
return con;
}
}