目录
1.JDBC概念
JDBC是通过Java代码操作MySQL数据库,数据库编程是需要服务器提供API接口(Application Programming Interface)给程序员进行调用的。
Oracle、MySQL、SQL Server……提供的API各有不同,这样的话学习成本就会很高,苦了程序员,此时Java就出来统一规范了,Java提供了一套数据库API的规范接口,让程序员只要学习Java的API接口就可以调用多种数据库的API接口。Java这套API接口就称为JDBC。
2.驱动包
2.1 下载驱动包
要想在程序中操作MySQL就需要先安装驱动程序(驱动包),并将驱动包引入到项目里。
安装第三方程序包,可以有以下途径:
- 官网
- GitHub
- 中央仓库
官网下载可能会比较麻烦,推荐使用中央仓库进行下载。
中央仓库网址:mvnrepository.com
此处有两个版本,新版本的数据库驱动包第一个里,旧版本的数据库驱动包在第二个里。
我们以MySQL5.7为例,选择的是第二个。进入之后选择5.版本,MySQL是哪个版本就要用哪个版本的驱动包。
此处我们选择5.1.49版本的驱动包。进入之后按jar进行下载。jar包是Java中常见的后缀类型,Java写的程序,有很多的类,一个类又对应一个.class文件,如果要将程序发布给别人,就要把这些.class文件打包成一个.jar包,然后把jar包发给别人。
2.2 将jar包导入项目
如何将jar包导入到项目中呢?分成两步:
1、先把jar复制到项目目录中。
创建一个新目录,目录名可以随便填,一般填lib,因为一般引入的第三方包都会起lib这个名字。
将下载好的jar包复制,然后选中lib目录,直接ctrl v就可以导入了。
2、把该目录标记成库。
此时就成功将jar包导入,就可以使用jar包进行操作代码了。
3.JDBC的使用步骤
先创建一个表,准备对该表进行操作。
3.1 创建DataSource
在Java中创建一个DataSource类“数据源头”,表示数据库服务器所在的位置。
此处的javax.sql就是JDBC对应的包。
第一种方式是先向上转型,再向下转型。这样做的意义是为了这个类名不要扩散到代码的其他地方,后续如果要修改数据库为别的数据库,代码改动比较小,这样就会使MySQL和程序之间的耦合度降低。
第二种方式没有第一种方式的优点,只是代码更简洁。
setUrl();方法中的url是计算机中很重要的概念,表示网络上的位置,通俗来说就是网址。
DataSource光设置url还不够,只是能找到MySQL服务器,还要输入数据库的用户名和密码。这样才能访问到数据库。
root表示“管理员”,MySQL默认的自带用户。密码是数据库密码。
3.2 建立数据库与服务器之间的连接
建立连接是为了给后续的“请求--相应”交互的进行做铺垫。
调用dataSource中的getConnection方法,connection表示“连接”的意思。
此处会抛出一个异常,直接alt+shift+enter将异常加到方法签名上就行了,后面如果执行sql或数据库操作有问题,一般都会出现这个异常。
这个方法的返回值是Connection,此处会出现很多个Connection,要选择下面这个
3.3 构造sql
3.4 执行sql
3.4.1 写操作的sql执行方式
返回值是整数,表示影响到的行数。
3.4.2 读操作的sql执行方式
此时statement.executeQuery()的返回值是ResultSet类型的,这种类型表示的是一张临时表,此时就需要将表遍历打印显示出来。
这张表的遍历时从有效数据的上一个位置开始的,经过next得到有效数据就可以对每一行进行操作了。直到指向空行。
3.5 释放资源,关闭连接
释放顺序是后申请的资源先释放。
4.结果示例及代码
4.1 写操作示例
修改和删除均与下列示例操作相似,此处以插入为例。
示例1:直接在代码中填入sql语句进行插入数据
代码:
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.sql.Statement;
public class Main {
public static void main(String[] args) throws SQLException {
//1、创建DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
// MysqlDataSource dataSource1 = new MysqlDataSource();
// dataSource1.setUrl();
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0000");
//2、建立数据库与服务器之间的连接
Connection connection = dataSource.getConnection();
//3、构造sql
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
//4、把sql语句发给服务器
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5、释放资源,关闭连接
statement.close();
connection.close();
}
}
控制台:
MySQL:
示例2:可供用户自行输入id和name,对表进行插入
代码:
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.sql.Statement;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws SQLException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入学号:");
int id = sc.nextInt();
System.out.println("请输入姓名:");
String name = sc.next();
//1、创建DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
// MysqlDataSource dataSource1 = new MysqlDataSource();
// dataSource1.setUrl();
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0000");
//2、建立数据库与服务器之间的连接
Connection connection = dataSource.getConnection();
//3、构造sql
String sql = "insert into student values("+ id +",'"+ name +"')";
PreparedStatement statement = connection.prepareStatement(sql);
//4、把sql语句发给服务器
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5、释放资源,关闭连接
statement.close();
connection.close();
}
}
控制台:
MySQL:
但是这样的方式不安全,可能会被注入恶意代码遭到攻击。
PreparedStatement提供了另一种方式
示例3:示例2的基础上,使用占位符(?)
代码:
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.sql.Statement;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws SQLException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入学号:");
int id = sc.nextInt();
System.out.println("请输入姓名:");
String name = sc.next();
//1、创建DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
// MysqlDataSource dataSource1 = new MysqlDataSource();
// dataSource1.setUrl();
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0000");
//2、建立数据库与服务器之间的连接
Connection connection = dataSource.getConnection();
//3、构造sql
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
//4、把sql语句发给服务器
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5、释放资源,关闭连接
statement.close();
connection.close();
}
}
控制台:
MySQL:
4.2 读操作示例
示例1:全列查询
代码:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo {
public static void main(String[] args) throws SQLException {
//1、创建DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("0000");
//2、建立连接
Connection connection = dataSource.getConnection();
//3、构造sql
String sql = "select * from student";
Statement statement = connection.createStatement();
//4、执行sql
ResultSet resultSet = statement.executeQuery(sql);
//5、遍历表
while(resultSet.next()){
//针对该行进行操作
//取出每列的数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id:" + id + " name:" + name);
}
//6、关闭连接
statement.close();
resultSet.close();
}
}
控制台:
数据库:
JDBC因为操作太繁琐了,所以一般在工作中不会直接使用,有大佬将JDBC的API进一步封装成数据库操作的框架,比如MyBatis、JPA……这些框架也被称为ORM框架,把数据库的表映射到对象,削弱了上述流程的繁琐性。