什么是JDBC编程?
JDBC编程就是用Java代码来操作数据库.JDBC即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API.
JDBC的工作原理
这里的JDBC编程,使用Java代码实现的是数据库的客户端,而像一些主流的数据库,为了方便程序员实现数据库的客户端程序,就会提供一些API接口,称为"数据库SDK",程序员就可以通过这些API接口更加方便的访问数据库服务器;
什么是API呢?API即Application Programming Interface,应用程序接口,它提供了一些函数,方法,或是类来供程序员来调用.由于API是数据库提供的,因此不同的数据库所提供的API就可能不同,为了解决这个问题,Java就提出了一套标准的接口体系,让这些不同数据库的API与这套接口体系进行适配,对于程序员而言,就只需要掌握Java的这套API即可,Java的这套操作数据库的API,就是JDBC;
JDBC的优点
- 开发数据库应用不用限定在特定数据库厂商的API;
- 程序的可移植性大大增强;
- 对各种数据库的差异进行封装,简化了程序员的学习成本;
JDBC的使用
- 准备数据库驱动包;
通过中央仓库(https://mvnrepository.com/)寻找数据库驱动包
选择第一个即可
选择与自己的数据库适配的版本:
然后点击这里进行下载:
然后我们就得到了一个jar包;
复制这个驱动包(不需要手动解压),到这里驱动包就准备完毕了.
- 把jar包导入到Java项目中;
然后我们打开IDEA新建一个Java文件,然后右键我们的文件名新建一个目录:
右键我们的项目名,找到 Add as Library…
不需要更改任何操作,直接ok即可
这样,我们就将这个jar包导入成功了
- 新建一个Java类,就可以进行代码的编写了
插入操作
- 构造数据源;
JDBC中,使用DataSource来描述数据库的位置;
DataSource是一个Interface,不能直接实例化,因此使用MysqlDataSource来实现DataSource;
MysqlDataSource来自于驱动包,因此必须驱动包安装正确;
设置其URL(统一资源定位器/网址),User,Password
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("000000");
通过上述的操作,我们就成功设置了数据库的ip地址,端口号,数据库名即用户登录密码;
这里的密码设置就是我们登录MySQL客户端的登录密码;
- 2.和数据库服务器建立连接;
Connection connection=dataSource.getConnection();
使用dataSource.getConnection()来建立连接;
- 构造SQL语句,JDBC操作数据库(本质仍然是通过SQL来描述数据库操作);
Scanner scanner=new Scanner(System.in);
System.out.println("请输入学号:");
int num=scanner.nextInt();
System.out.println("请输入姓名:");
String name=scanner.next();
// String sql="insert into student values(1,'张三')";
//使用?作为占位符,后续使用statement对象针对?进行替换
String sql="insert into student values(?,?)";
//直接使用String格式的SQL还不行,还需要搭配一个特殊的类;
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,num);
statement.setString(2,name);
System.out.println(statement);
Statement对象主要是将SQL语句发送到数据库中;
- 执行SQL语句 insert
int n=statement.executeUpdate();
System.out.println("n = "+ n);
这里n描述的其实是上面插入操作影响数据库的行数;
executeQuery() 方法执行后返回单个结果集的,通常用于select语句
executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句;
- 断开连接,释放资源
statement.close();
connection.close();
释放资源是要注意后创建的需要先创建;
下面是完整代码:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
//1.使用DataSource描述MySQL服务器的位置;
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("000000");
//2.和数据库服务器建立连接;
Connection connection=dataSource.getConnection();
//System.out.println(connection);
//3.构造SQL语句,JDBC操作数据库,本质仍然是通过SQL来描述数据库操作;
//尝试插入一个操作;
//直接使用String格式的SQL还不行,还需要搭配一个特殊的类;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入学号:");
int num=scanner.nextInt();
System.out.println("请输入姓名:");
String name=scanner.next();
//使用?作为占位符,后续使用statement对象针对?进行替换
String sql="insert into student values(?,?)";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,num);
statement.setString(2,name);
System.out.println(statement);
//4.执行SQL语句 insert,update,delete都是通过executeUpdate来执行的
//select 则是通过 executeQuery来执行的;
//executeUpdate的返回值是一个整数,表示这个操作影响到几行;
int n=statement.executeUpdate();
System.out.println("n = "+ n);
//断开连接,释放资源;
statement.close();
connection.close();
}
}
修改操作
与插入操作十分相似,我们直接看完整代码:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCUpdate {
public static void main(String[] args) throws SQLException {
//构造数据源
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("000000");
//2.和数据库建立连接
Connection connection= dataSource.getConnection();
Scanner scanner =new Scanner(System.in);
System.out.println("输入要修改的学号");
int id=scanner.nextInt();
System.out.println("输入修改后的名字");
String name= scanner.next();
//构造SQL语句
String sql="update student set name = ? where id = ? ";
PreparedStatement statement =connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,id);
System.out.println(statement);
int n=statement.executeUpdate();
System.out.println("n = "+n);
statement.close();
connection.close();
}
}
删除操作
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCDelete {
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("000000");
Connection connection=dataSource.getConnection();
Scanner scanner=new Scanner(System.in);
System.out.println("输入要删除的学生id");
int id=scanner.nextInt();
String sql ="delete from student where id=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,id);
int n=statement.executeUpdate();
System.out.println("n = "+n);
statement.close();
connection.close();
}
}
查询操作
与增删改不同,查询操作需要遍历表,因此查询操作略有不同:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.*;
import java.util.logging.Logger;
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("000000");
//和数据库建立连接
Connection connection=dataSource.getConnection();
//直接查找所有记录,不需要输入条件
String sql="select * from student";
PreparedStatement statement=connection.prepareStatement(sql);
//此处使用executeQuery
//executeUpdate只能返回一个int
//executeQuery返回的是一个ResultSet对象,可以把这个对象视为是一个"临时表"
//resultSet简单的当成一个类似于"迭代器"
ResultSet resultSet=statement.executeQuery();
//遍历临时表
while (resultSet.next()){
int id=resultSet.getInt("id");
//通过getXXX的方法获取指定的列
String name=resultSet.getString("name");
System.out.println(id+":"+name);
}
resultSet.close();
statement.close();
connection.close();
}
}
executeQuery返回的是一个ResultSet对象,可以把这个对象视为是一个"临时表",然后对临时表进行遍历;
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问;
我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环;
resultSet.next(), next如果没有到达末尾,就是返回true继续循环, next如果到达末尾,就返回false结束循环;
至此,MySQL的JDBC编程就是如此啦!