JDBC
Java Database Connectivity ,Java数据库链接。
它是一种用于执行SQL语句的Java API,是Java中的数据库连接规范,API由java.sql.*,javax.sql.*包中的一些类和接口组成,为Java开发人员操作数据库提供了一个标准的API,可以对多种关系数据库提供统一的访问。
JDBC优势
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限制在特定数据库厂商的API
- 程序的可移植性大大增强
JDBC使用案例
准备数据库驱动包(mvn repository中下载 ),添加到 项目的依赖中(在项目中创建文件夹lib,把依赖包复制到lib 中),配置该jar包到本项目依赖中:右键点击项目Open Module Settings。
1.插入操作
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 main1(String[] args) throws SQLException {
//JDBC 需要通过以下五个步骤完成开发:
//1.创建并初始化一个数据源(数据源:数据的来源)
DataSource dataSource = new MysqlDataSource();//向上转型:父类引用指向子类对象
//等价于:MysqlDataSource dataSource = new MysqlDataSource);
//dataSource.setUrl();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java10?characterEncoding=utf8&useSSL=false");//这个方法是子类特有的,向下转型,把父类引用转回子类引用
//URL:唯一资源定位符 描述网络上的某个资源所在的位置
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.构建SQL语句
String sql = "insert into student value(1,'小马')";
PreparedStatement statement = connection.prepareStatement(sql);
//使用PreparedStatement提前预编译一下SQL
//4.执行SQL语句
int ret = statement.executeUpdate();
System.out.println("ret = "+ret);
//5.释放必要的资源
statement.close();
connection.close();
}
优化后:
//用户动态输入数据
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
//JDBC 需要通过以下五个步骤完成开发:
//1.创建并初始化一个数据源(数据源:数据的来源)
DataSource dataSource = new MysqlDataSource();//向上转型:父类引用指向子类对象
//等价于:MysqlDataSource dataSource = new MysqlDataSource);
//dataSource.setUrl();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java10?characterEncoding=utf8&useSSL=false");//这个方法是子类特有的,向下转型,把父类引用转回子类引用
//URL:唯一资源定位符 描述网络上的某个资源所在的位置
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.构建SQL语句 从控制台读取用户的输入内容
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
System.out.println("请输入学生学号:");
int id = scanner.nextInt();
//4.构建SQL语句
// String sql = "insert into student value("+id+",'"+name+"')";
String sql = "insert into student value(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
//使用PreparedStatement提前预编译一下SQL
//6.执行SQL语句
int ret = statement.executeUpdate();
System.out.println("ret = "+ret);
//6.释放必要的资源
statement.close();
connection.close();
}
2.查询操作
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
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/java10?characterEncoding=utf8&useSSL=false");//这个方法是子类特有的,向下转型,把父类引用转回子类引用
//URL:唯一资源定位符 描述网络上的某个资源所在的位置
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.构建SQL语句
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行SQL语句
ResultSet resultSet = statement.executeQuery();
//遍历结果集合
while(resultSet.next()){
//把resultSet想象成一个表格,同时表格里有个光标,初始情况下光标指向表最上层
//每次调用next,光标往下走一行
//当光标指向某一行的时候,就可以通过getxxx来获取当前行的数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id="+id+",name="+name);
}
}
}
JDBC使用步骤:
1.创建并初始化一个数据源(描述数据库服务器所在位置)
2.和数据库服务器建立连接
3.构建SQL语句
4.执行SQL
5.释放资源(先释放后创建的)
常用:DataSource ——> Connection ——> PreparedStatement ——> ResultSet
面试题:
数据库的两种连接方式及区别:
法一:通过DriverManager(驱动管理类)的静态方法获取
通过反射方式加载驱动包中的类,进一步进行后续操作(代码可读性差,容易产生运行时异常)
法二:通过DataSource(数据源)对象获取
实际应用中会使用DataSource(数据源)对象
区别:
1.DriverManager类来获取Connection连接,无法重复利用,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
2.DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收。
Statement和PreparedStatement的区别:
(Statement对象只要是将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象:Statement PreparedStatement CollableStatement)
Statement:用于执行不带参数的简单SQL语句
PreparedStatement:用于执行带或不带参数的SQL语句,SQL语句会预编译在数据库系统,执行速度快于Statement
( PreparedStatement的优势:提前预编译,效率更高,防止sql注入,更安全)
注:sql注入:拼接字符串时,值可能包含其他sql 语句。
String sql = "insert into student value("+id+",'"+name+drop datanase"')";
两种执行SQL的方法:
executeQuery()方法执行后返回单个结果集 ,通常用于select语句
executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
ResultSet对象:
称为结果集,代表符合SQL语句条件的所有行,通过getXXX方法对行中数据进行访问。通过resultSet.next()方法获得某一条记录,使用while获得所有行。