JDBC:是标准库提供的一套API。
环境:JDBC在使用的时候,需要下载并导入对应数据库的驱动包。
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由java.sq1.* ,javax. sq1.*
包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的APl,可以为多种关系数据库提供统一访问。
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。
JDBC驱动包下载地址《《
将这个jar包下载下来,然后直接粘贴进需要的项目当中即可。
在导入jar包的时候不要忘记右键:Add as library,并且要确保新建的目录和src是同一级,但不要放到src里面。
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();
以上两种方式的区别是:
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。JDBC API中主要提供了三种Statement对象。
实际开发中最常用的是PreparedStatement对象,以下对其的总结:
主要掌握两种执行SQL的方法:
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供 了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
操作:往数据库当中插入一条记录
通过JDBC操作数据库,往test数据库当中的student表里面插入一条记录:
1、创建数据源对象,数据源对象就描述了要访问的数据库是啥,在哪。
DataSource dataSource=new MysqlDataSource();//向上转型
每种数据库都会提供对应的类来实现DataSource接口。
上述代码使用到了多态,多态可以认为是封装的更进一步。
封装是把实现细节隐藏起来,让调用者不必考虑细节就能使用,从而降低调用者的使用成本和学习负担。
多态则是把实现类的类型也隐藏起来了,调用者不仅不必考虑细节,而且连它是啥类型都不管了。
DataSource是服务于各种数据库的,MysqlDataSource只是服务于MySQL的。
在MySQL里面,是一个客户端服务器的程序,描述服务器的位置,会使用URL这个概念来表示。
但是有的数据库,比如SQLite,就不是客户端服务器结构的,也就谈不上URL。
DataSource考虑到通用性,就不能把setURL这样的方法给搞过来。
关于耦合性,什么叫耦合:一个大的程序里面包含很多个部分,如果这些部分之间关联性比较强,则耦合度较高。关联性比较弱,耦合度较低。
URL:唯一资源定位符。就是网址。
当前数据库客户端(咱自己写的代码)和服务器都在咱自己的电脑上面。
DataSource描述了在哪里可以找到数据库的数据。URL里面就体现出数据库服务器的位置以及数据库的名字。
((MysqlDataSource)dataSource).setUser("root");//用户名
((MysqlDataSource)dataSource).setPassword("1234");//密码
用户名统一都是root(mysql自带的用户名),密码就是安装数据库的时候设置的密码。
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* @author Susie-Wen
* @version 1.0
* @description:
* @date 2022/8/15 12:43
*/
public class JDBC {
//通过JDBC操作数据库,往数据库里插入一条记录
//往test数据库当中的student表里面插入一条记录:
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();//向上转型
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//用户名
((MysqlDataSource)dataSource).setPassword("123456");//密码
//2、让代码和数据库服务器建立连接
Connection connetcion= dataSource.getConnection();
System.out.println(connetcion);
}
}
运行上述代码,如果没有报错,则说明连接数据库成功了。
//3、构造要执行的SQL语句
String sql="insert into student values(3,'三三')";
PreparedStatement statement=connetcion.prepareStatement(sql);
使用java/C++/Python操作数据库,本质上还是通过SQL。
PreparedStatement:表示一个预处理过的SQL语句对象。
执行方法有两个:executeUpdate,executeQuery。
executeUpdate:对应插入删除修改语句,返回值表示。
executeQuery:对应查询语句,返回值则是返回的临时表数据。
//4、执行SQL
//执行方法有两个:executeUpdate,executeQuery
int n=statement.executeUpdate();
System.out.println("n="+n);
手动释放资源:
statement.close();
connetcion.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;
/**
* @author Susie-Wen
* @version 1.0
* @description:
* @date 2022/8/15 12:43
*/
public class JDBC {
//通过JDBC操作数据库,往数据库里插入一条记录
//往test数据库当中的student表里面插入一条记录:
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();//向上转型
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//用户名
((MysqlDataSource)dataSource).setPassword("123456");//密码
//2、让代码和数据库服务器建立连接
Connection connetcion= dataSource.getConnection();
//[用户输入]:通过用户输入的数据,来确定插入的值
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要插入的学号:");
int id=scanner.nextInt();
System.out.println("请输入要插入的姓名:");
String name=scanner.next();
//3、构造要执行的SQL语句
String sql="insert into student values(" + id +",' "+name+" ' )";
PreparedStatement statement=connetcion.prepareStatement(sql);
System.out.println("statement:"+statement);
//4、执行SQL
//执行方法有两个:executeUpdate,executeQuery
int n=statement.executeUpdate();
System.out.println("n="+n);
//5、完成后,就需要关闭释放相关资源
statement.close();
connetcion.close();
}
}
当前通过字符串拼接的方式,可以让用户输入数据进行插入,但是效果不太好。
1、代码非常乱,尤其是拼的SQL变成啥样,不太直观。
2、不安全,容易引发SQL注入漏洞。
因此,不应该手动拼接SQL,而应该借助PreparedStatement内部提供的SQL拼装机制。
使得代码更简单更直观,会对拼接的内容进行更严格的校验检查,避免SQL注入。
将上述代码进行更改,如下:
public class JDBC {
//通过JDBC操作数据库,往数据库里插入一条记录
//往test数据库当中的student表里面插入一条记录:
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();//向上转型
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//用户名
((MysqlDataSource)dataSource).setPassword("123456");//密码
//2、让代码和数据库服务器建立连接
Connection connetcion= dataSource.getConnection();
//[用户输入]:通过用户输入的数据,来确定插入的值
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要插入的学号:");
int id=scanner.nextInt();
System.out.println("请输入要插入的姓名:");
String name=scanner.next();
//3、构造要执行的SQL语句[构造请求]
//使用?作为占位符,占个位置,后面会替换成其他的值。
String sql="insert into student values(?,?)";
PreparedStatement statement=connetcion.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("statement:"+statement);
//4、执行SQL
//执行方法有两个:executeUpdate,executeQuery
int n=statement.executeUpdate();
System.out.println("n="+n);
//5、完成后,就需要关闭释放相关资源
statement.close();
connetcion.close();
}
}
import java.sql.Connection;
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;
/**
* @author Susie-Wen
* @version 1.0
* @description:
* @date 2022/8/16 8:17
*/
//通过JDBC来修改数据
public class JDBCUpdate {
public static void main(String[] args) throws SQLException {
//1、创建数据源
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//用户名
((MysqlDataSource)dataSource).setPassword("123456");//密码
//2、建立连接
Connection connection=dataSource.getConnection();
//3、构造SQL
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要修改的同学学号:");
int id=scanner.nextInt();
System.out.println("请输入要修改的同学姓名:");
String name=scanner.next();
String sql="update student set name = ? where id = ?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,id);
//4、执行SQL
int n=statement.executeUpdate();
System.out.println("n="+n);
//5、关闭释放资源
statement.close();
connection.close();
}
}
在实际开发当中,很少会直接使用JDBC,代码比较啰嗦。在实际开发当中会用到一些库/框架,来简化这里的数据库操作。(MyBatis)
各种库和框架本质上也就是针对JDBC又进行的封装。
public class JDBCDelete {
public static void main(String[] args) throws SQLException {
//1、创建数据源
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//用户名
((MysqlDataSource)dataSource).setPassword("123456");//密码
//2、建立连接
Connection connection=dataSource.getConnection();
//3、构造SQL
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要删除的同学学号:");
int id=scanner.nextInt();
String sql="delete from student where id = ?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,id);
//4、执行SQL
int n=statement.executeUpdate();
System.out.println("n="+n);
//5、关闭释放资源
statement.close();
connection.close();
}
}
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
//1、创建数据源
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");//用户名
((MysqlDataSource)dataSource).setPassword("123456");//密码
//2、建立连接
Connection connection=dataSource.getConnection();
//3、构造SQL
String sql="select * from student";
PreparedStatement statement=connection.prepareStatement(sql);
//4、执行SQL
ResultSet resultSet=statement.executeQuery();
//5、遍历结果集合
while(resultSet.next()){
//每次循环,就能够获取到resultSet中的一行,进一步的就可以拿到每一列
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
System.out.println("id="+id+",name="+name);
}
//6、关闭释放资源
resultSet.close();
statement.close();
connection.close();
}
}