JDBC

一、JDBC概述

在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。

JDBC_第1张图片

(一)、 JDBC概念

JDBC(Java Data Base Connectivity) 是 Java 访问数据库的标准规范.是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范

(二)、 JDBC原理

JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

(三)、 JDBC好处

  • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
  • 可随时替换底层数据库,访问数据库的Java代码基本不变
    以后编写操作数据库的代码只需要面向JDBC(接口),操作哪儿个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。如下图就是MySQL驱动包
    在这里插入图片描述

二、JDBC快速入门

(一)、 数据准备

 -- 创建 jdbc_user表 
CREATE TABLE jdbc_user (
  id INT PRIMARY KEY AUTO_INCREMENT ,
  username VARCHAR(50),
  PASSWORD VARCHAR(50),
  birthday DATE
);
-- 添加数据
INSERT INTO jdbc_user (username, PASSWORD,birthday) 
VALUES
('admin1', '123','1991/12/24'), 
('admin2','123','1995/12/24'),
('test1', '123','1998/12/24'),
('test2', '123','2000/12/24');

(二)、 Mysql 驱动包

引用驱动包
JDBC_第2张图片

(三)、 API使用

注册驱动
JDBC_第3张图片

	public static void main(String[] args) throws ClassNotFoundException { 
		//1.注册驱动   注册驱动(jar 8以下)
		// forName 方法执行将类进行初始化 
		Class.forName("com.mysql.jdbc.Driver"); 
	}

注:5.1以后版本需要带.cj 会默认自动注册

Class.forName(com.mysql.cj.jdbc.Driver);

查询MySQL提供的Driver类,看它是如何实现的,源码如下:
JDBC_第4张图片

在该类中的静态代码块中已经执行了 DriverManager 对象的 registerDriver() 方法进行驱动的注册了,那么我们只需要加载 Driver 类,该静态代码块就会执行。而 Class.forName(“com.mysql.jdbc.Driver”); 就可以加载 Driver 类。

获得连接
Connection 接口,代表一个连接对象 ,具体的实现类由数据库的厂商实现
使用 DriverManager类的静态方法,getConnection可以获取数据库的连接
JDBC_第5张图片

url

jdbc:mysql://localhost:3306/db4?characterEncoding=UTF-8&&useSSL = false
?useSSL = false

第一部分是协议 jdbc,这是固定的;
第二部分是子协议,就是数据库名称,连接mysql数据库,第二部分当然是mysql了;
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及要使用的数据库名称组成。

代码示例

public static void main(String[] args) throws Exception { 
//1.注册驱动 
Class.forName("com.mysql.jdbc.Driver"); 
//2.获取连接 url,用户名, 密码 
String url = "jdbc:mysql://localhost:3306/db4"; 
Connection con = DriverManager.getConnection(url, "root", "123456");

//com.mysql.jdbc.JDBC4Connection@2e3fc542 
System.out.println(con); 
}

获取语句执行平台

通过Connection 的 createStatement方法 获取sql语句执行对象
在这里插入图片描述

Statement : 代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态SQL语句并返回它所生成结果的对象。
Statement类常用方法 说明
int executeUpdate(String sql); 执行insert update delete语句.返回int类型,代表受影响的行数
ResultSet executeQuery(Stringsql); 执行select语句, 返回ResultSet结果集对象

public static void main(String[] args) throws Exception { 
//1.注册驱动 
Class.forName("com.mysql.jdbc.Driver"); 
//2.获取连接 url,用户名, 密码 
String url = "jdbc:mysql://localhost:3306/db4"; 
Connection con = DriverManager.getConnection(url, "root", "123456"); 
//3.获取 Statement对象
Statement statement = con.createStatement(); 
//4.执行创建表操作 
String sql = "create table test01(id int, name varchar(20),age int);"; 
//5.增删改操作 使用executeUpdate,增加一张表 
int i = statement.executeUpdate(sql); 
//6.返回值是受影响的函数 
System.out.println(i); 
//7.关闭流 
statement.close(); 
con.close(); 
} 

处理结果集
只有在进行查询操作的时候, 才会处理结果集

public static void main(String[] args) throws SQLException { 
//1.注册驱动 可以省略 
//2.获取连接 
String url = "jdbc:mysql://localhost:3306/db4"; 
Connection con = DriverManager.getConnection(url, "root", "123456"); 
//3.获取 Statement对象 
Statement statement = con.createStatement(); 
String sql = "select * from jdbc_user"; 
//执行查询操作,返回的是一个 ResultSet 结果对象 
ResultSet resultSet = statement.executeQuery(sql); 
//4.处理结果集 resultSet 

} 

ResultSet接口
作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。

boolean next()
1、游标向下一行;2、返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
xxx getXxx( String or int)
1、通过列名,参数是 String 类型。返回不同的类型2、通过列号,参数是整数,从1开始。返回不同的类型

public static void main(String[] args) throws SQLException { 
//1.注册驱动 可以省略 
//2.获取连接 
String url = "jdbc:mysql://localhost:3306/db4"; 
Connection con = DriverManager.getConnection(url, "root", "123456"); 
//3.获取 Statement对象 
Statement statement = con.createStatement(); 
String sql = "select * from jdbc_user"; 
//执行查询操作,返回的是一个 ResultSet 结果对象 
ResultSet resultSet = statement.executeQuery(sql); 
//4.处理结果集 // 
//next 方法判断是否还有下一条数据 
// boolean next = resultSet.next(); 
// System.out.println(next);  
//getXXX 方法获取数据 两种方式 
// int id = resultSet.getInt("id");//列名 
// System.out.println(id); 
 int anInt = resultSet.getInt(1);//列号 
// System.out.println(anInt);
//使用while循环 
while(resultSet.next()){ 
	//获取id 
	int id = resultSet.getInt("id"); 
	//获取姓名 
	String username = resultSet.getString("username"); 
	//获取生日 
	Date birthday = resultSet.getDate("birthday"); 
	System.out.println(id + " = " +username + " : " + birthday); 
}
//关闭连接 
resultSet.close(); 
statement.close(); 
con.close(); 
} 

释放资源
需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
释放原则:先开的后关,后开的先关。ResultSet ==> Statement ==> Connection
放在哪个代码块中:finally 块
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先开后关, 先得到的后关闭,后得到的先关闭


public static void main(String[] args) { 
Connection connection = null; 
Statement statement = null; 
ResultSet resultSet = null; 
try {
	//1.注册驱动(省略) 
	//2.获取连接 
	String url = "jdbc:mysql://localhost:3306/db4"; 
	connection = DriverManager.getConnection(url, "root", "123456"); 
	//3.获取 Statement对象 
	statement = connection.createStatement(); 
	String sql = "select * from jdbc_user"; 
	resultSet = statement.executeQuery(sql); 
} catch (SQLException e) { 
	e.printStackTrace(); 
} finally { 
   /**
	* 开启顺序: connection ==> statement => resultSet 
	* 关闭顺序: resultSet ==> statement ==> connection 
	*/ 
	try {
		connection.close(); 
		resultSet.close(); 
		statement.close(); 
	} catch (SQLException e) { 
		e.printStackTrace(); 
	}
} 
} 



流程:

  • 创建工程,导入驱动jar包
    注册驱动(jar 8以下)
 Class.forName("com.mysql.jdbc.Driver");

获取连接

 Connection conn = DriverManager.getConnection(url, username, password);
  • Java代码需要发送SQL给MySQL服务端,就需要先建立连接
    定义SQL语句
 String sql =  “update…” ;

获取执行SQL对象
执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象

 Statement stmt = conn.createStatement();

执行SQL

 stmt.executeUpdate(sql);  
  • 处理返回结果
  • 释放资源

编写代码如下:

/* 1. 注册驱动 */
Class.forName("com.mysql.jdbc.Driver");//8.0 有变化
/* 2. 获取连接 */
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
/* 3. 定义sql */
String sql = "update jdbc_user set password= 20 where username= 'xx'";
/* 4. 获取执行sql的对象 Statement */
Statement stmt = conn.createStatement();
/* 5. 执行sql */
int count = stmt.executeUpdate(sql);//受影响的行数
/* 6. 处理结果 */
System.out.println(count);
/* 7. 释放资源 */
stmt.close();
conn.close();
}

步骤总结

获取驱动(可以省略)
获取连接
获取Statement对象
处理结果集(只在查询时处理)
释放资源

三、JDBC实现增删改查

JDBC工具类
什么时候自己创建工具类?
如果一个功能经常要用到,我们建议把这个功能做成一个工具类,可以在不同的地方重用。
“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。
工具类包含的内容
可以把几个字符串定义成常量:用户名,密码,URL,驱动类
得到数据库的连接:getConnection()
关闭所有打开的资源:

 /**
  * JDBC 工具类 
  */ 
public class JDBCUtils { 
	//1. 定义字符串常量, 记录获取连接所需要的信息 
	public static final String DRIVERNAME = "com.mysql.jdbc.Driver"; 
	public static final String URL = "jdbc:mysql://localhost:3306/db4?characterEncoding=UTF-8"; 
	public static final String USER = "root"; 
	public static final String PASSWORD = "123456"; 
	//2. 静态代码块, 随着类的加载而加载 
	static{ 
		try {
			//注册驱动 
			Class.forName(DRIVERNAME); 
		} catch (ClassNotFoundException e) { 
			e.printStackTrace(); 
		} 
	}
	//3.获取连接的静态方法 
	public static Connection getConnection(){ 
		try {
			//获取连接对象 
			Connection connection = DriverManager.getConnection(URL, USER, PASSWORD); 
			//返回连接对象 
			return connection; 
		} catch (SQLException e) { 
			e.printStackTrace(); 
			return null; 
		} 
	}
	//关闭资源的方法 
	public static void close(Connection con, Statement st){
		if(con != null && st != null){ 
			try {
				st.close(); 
				con.close(); 
			} catch (SQLException e) { 
				e.printStackTrace(); 
			} 
		} 
	}
	
	public static void close(Connection con, Statement st, ResultSet rs){ 
		if(rs != null){ 
			try {
				rs.close(); 
			} catch (SQLException e) { 
				e.printStackTrace(); 
			} 
		}
		close(con,st); 
	} 
}

(一)、DML操作

插入记录
解决插入中文乱码问题.

jdbc:mysql://localhost:3306/db4?characterEncoding=UTF-8 
characterEncoding=UTF-8 指定字符的编码、解码格式。

代码示例

/** 
 * 插入数据 
 * @throws SQLException 
 */ 
@Test 
public void testInsert() throws SQLException { 
	//1.通过工具类获取连接 
	Connection connection = JDBCUtils.getConnection(); 
	//2.获取Statement 
	Statement statement = connection.createStatement(); 
	//2.1 编写Sql
	String sql = "insert into jdbc_user values(null,'张百万','123','2020/1/1')"; 	
	//2.2 执行Sql 
	int i = statement.executeUpdate(sql); 
	System.out.println(i); 
	//3.关闭流 
	JDBCUtils.close(connection,statement); 
}

(二)、更新记录

/**
 * 修改 id 为1 的用户名为 广坤 
 */ 
 @Test 
 public void testUpdate() throws SQLException { 
 	Connection connection = JDBCUtils.getConnection(); 
 	Statement statement = connection.createStatement(); 
 	String sql = "update jdbc_user set username = '广坤' where id = 1"; 
 	statement.executeUpdate(sql); 
 	JDBCUtils.close(connection,statement); 
 }

(三)、删除记录

/**
 * 删除id 为 3 和 4的记录 
 * @throws SQLException 
 */ 
 @Test 
 public void testDelete() throws SQLException { 
 	Connection connection = JDBCUtils.getConnection(); 
 	Statement statement = connection.createStatement(); 
 	statement.executeUpdate("delete from jdbc_user where id in(3,4)"); 
 	JDBCUtils.close(connection,statement); 
 }

(四)、 DQL操作

查询姓名为张百万的一条记录

public static void main(String[] args) throws SQLException { 
//1.获取连接对象 
Connection connection = JDBCUtils.getConnection(); 
//2.获取Statement对象 
Statement statement = connection.createStatement(); 
String sql = "SELECT * FROM jdbc_user WHERE username = '张百万';"; 
ResultSet resultSet = statement.executeQuery(sql); 
//3.处理结果集 
while(resultSet.next()){ 
//通过列名 获取字段信息 
int id = resultSet.getInt("id"); 
String username = resultSet.getString("username"); 
String password = resultSet.getString("password"); 
String birthday = resultSet.getString("birthday"); 
System.out.println(id+" "+username+" " + password +" " + birthday); 
}
//4.释放资源 
JDBCUtils.close(connection,statement,resultSet); 
}

你可能感兴趣的:(android,java)