JDBC概念
Java DataBase Connectivity(Java数据库连接技术)
它是将Java与SQL结合且独立于特定的数据库系统的应用程序编程接口(API-它是一种可用于执行SQL语句的JavaAPI,即由一组用Java语言编写的类与接口所组成)
JDBC设计的目的
它是一种规范,设计出来的主要目的是为了让各个数据库开发商为Java程序员提供标准的数据访问类和接口,使得独立于DBMS的Java应用程序的开发成为可能(数据库改变,驱动程序跟着改变,但是应用程序不变)
Java设计规范接口,各大数据库产商遵守规范实现,Java程序员不需要考虑实现细节,只需要调用API即可
JDBC组成
JDBC API (统一的应用接口)
JDBC Driver Manager(驱动程序管理器)
JDBC 数据库驱动程序 驱动本质就是一个Java类,这个类实现了JavaAPI定义的接口
一般情况下,在应用程序中进行数据库连接,调用JDBC接口,首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用
这里所谓的驱动,其实就是实现了java.sql.Driver接口的类。如oracle的驱动类是 oracle.jdbc.driver.OracleDriver.class(此类可以在oracle提供的JDBC jar包中找到),此类实现了java.sql.Driver接口。由于驱动本质上还是一个class,将驱动加载到内存和加载普通的class原理是一样的:使用Class.forName(“driverName”)。以下是将常用的数据库驱动加载到内存中的代码:
//加载Oracle数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//加载SQL Server数据库驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//加载MySQL 数据库驱动
Class.forName("com.mysql.jdbc.Driver");
static {
Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
try {
if (defaultDriver == null) {
//创建一个OracleDriver实例,然后注册到DriverManager中
Driver defaultDriver = new OracleDriver();
DriverManager.registerDriver(defaultDriver);
}
} catch (RuntimeException localRuntimeException) {
} catch (SQLException localSQLException) {
}
mysql的jdbc的连接
package com.sxt.oracle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/*
* useSSL=true:程序与数据库之间进行数据的交互传输的过程中需要加密的方式
* useUnicode=true&characterEncoding=UTF-8:程序与数据库之间互相编码和解码
*/
public class TestMysq0l {
//程序需要数据库的连接的地址的信息
public static String URL = "jdbc:mysql://localhost:3306/demo?useSSL=true&useUnicode=true&characterEncoding=UTF-8";
//驱动的全名称
public static String DRIVER = "com.mysql.jdbc.Driver";
//用户
public static String USER = "root";
//密码
public static String PASSWORD = "1234";
//静态代码块加载驱动信息
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
用程序给数据库插入一条数据
package com.sxt.oracle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestMysql02 {
//程序需要连接的数据库的地址信息
public static String URL = "jdbc:mysql://localhost:3306/demo?useSSL=true&useUnicode=true&characterEncoding=UTF-8";
//连接驱动的全名称
public static String DRIVER = "com.mysql.jdbc.Driver";
//用户名
public static String USER = "root";
//密码
public static String PASSWORD = "1234";
//加载驱动信息
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
// 取得连接对象
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 定义出sql语句
String sql = "INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)"
+ "VALUES(1002,'李四','总裁',7788,NOW(),19600.00,3000.00,10)";
// 通过连接对象创建发送sql语句的对象
PreparedStatement pst = conn.prepareStatement(sql);
// 发送sql语句
int row = pst.executeUpdate();
System.out.println("插入了" + row + "行数据");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
定义取得和关闭连接的工具类,即是将取得连接和关闭连接的代码封装到一个工具类中
public class ConnectionUtils {
private static String URL = "jdbc:mysql://localhost:3306/demo?useSSL=true&useUnicode=true&characterEncoding=UTF-8";
private static String DRIVER = "com.mysql.jdbc.Driver";
private static String USER = "root";
private static String PASSWORD = "1234";
static {
try {
Class.forName(DRIVER);// 将"com.mysql.jdbc.Driver"类的Class对象加载到运行时程序区
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 取得连接对象
*
* @return
*/
public static Connection getConnection() {
try {
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭连接
*
* @param conn 通过外界传入连接对象进行关闭连接
*/
public static void close(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
通过连接工具类插入数据的程序示例如下:
package com.sxt.connectionutils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Statement;
/*
* 增加数据:
* 取得数据库连接,连接的类型是Connection类型,如果要操作数据还需使用该对象取得另一个对象发送sql语句的对象,
* 要取得这个发送sql语句的对象需要使用带Connection的一些方法
*
*/
public class TestMysql2 {
public static void main(String[] args) {
try {
if (insertEmp()) {
System.out.println("插入数据成功");
} else {
System.out.println("插入数据失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 增加雇员的信息的方法
* @return 如果插入雇员的数据成功返回true,否则返回false
* @throws SQLException
*/
public static boolean insertEmp() throws SQLException {
// 取得连接对象
Connection conn = ConnectionUtils.getConnection();
// 定义出sql语句
String sql = "INSERT INTO emp(ename,job,mgr,hiredate,sal,comm,deptno)"
+ "VALUES('王五','总经理',7789,NOW(),13000.00,5000.00,10)";
//取得发送sql语句的对象
PreparedStatement pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// 执行sql语句
int row = pst.executeUpdate();
//取得自动增长的主键值
ResultSet rst = pst.getGeneratedKeys();
if (rst.next()) {
System.out.println(rst.getInt(1));
}
ConnectionUtils.close(conn);
return row > 0;
}
}