一,数据库驱动
1.什么是数据库驱动
不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了java的驱动包mysql-connector-java,要基于java操作MySQL即需要该驱动包;同样的要基于java操作Oracle数据库则需要Oracle的数据库驱动包.
2.数据库驱动的下载
方法一:去相对应的数据库的官网去下载相对应编程语言的驱动包,但是每种数据库的官网较为复杂,不易下载,不推荐;
方法二:Maven Repository: Search/Browse/Explore (mvnrepository.com),通过该网站(也叫中央仓库)去下载各种数据库的驱动包,以基于java操作MySQL数据库的数据驱动包为例:
注意:.jar是一个java格式的压缩包,其中有很多的.class文件.
二,JDBC
1.什么是JDBC
JDBC又叫数据库连接,是一种用于执行SQL语句的API,它为java开发人员操作数据库提供了一个标准的API,可以为多种关系型数据库提供统一访问.通俗的来说,JDBC将基于java操作不同数据库这种行为设定了一个统一的标准,这个标准就是将每个数据库提供的API统一成了一套,但是java操作不同数据库的时候,只需要安装相应的驱动包即可;画图详解如下:
2.JDBC工作实例
以插入操作为例:
1.准备数据库驱动包,并将项目添加到依赖中
在项目中创建文件夹lib,并将刚刚下载的依赖包mysql-connector-java-5.1.47.jar复制到lib中,再配置该jar包到本项目的依赖中,此时idea就可以解析出.jar包里的内容了.
2.创建数据源
使用JDBC往数据库中插入一个记录需要提前准备好数据库和数据表,假设这里的数据库名为java,数据表名为student.
jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false;
jdbc:mysql:这个url是给jdbc中的mysql来使用的(url是指唯一资源地址符,描述了互联网上的唯一的一个资源的位置);
127.0.0.1:数据库服务器所在的IP地址;
3306:mysql的端口号,安装的时候没有配置的情况下默认是3306;
java:数据库名;
characterEncoding=utf8:描述了请求的字符编码方式,一般都是设成utf8;
useSSL=false:加密功能,一般设置成false表示关闭加密功能,除非数据库很重要才需要加密.
3.和数据库建立网络连接
建立连接的目的是为了明确知道哪个客户端和哪个服务器之间进行通信.
4.构造一个SQL语句,来完成插入操作
注意:
sql语句要搭配PreparedStatement对象一起使用,定义一个String类型的sql字符串仅仅描述了sql是啥样的,真正的执行还是靠PreparedStatement对象,PreparedStatement背后做了很多事情,会对SQL语句进行一些预处理(如对于法进行解析);
用占位符进行替换的时候需要使用setXXX方法来设置参数,参数是从1开始而不是0.
5.执行SQL语句
注意:
针对增删改,使用 executeUpdate 来执行
针对查,使用 executeQuery 来执行(需要使用结果集合ResultSet对象来接收)
6.断开和数据库的连接,释放必要资源
断开连接的规则:先创建的资源后释放
7.完整代码
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 JDBCInsertDemo {
public static void main(String[] args) throws SQLException {
//使用 jdbc 往数据库中插入一个记录
//需要提前准备好数据库(java)和数据表(student)
//1. 创建数据源,描述数据库服务器在哪
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("输入自己的数据库密码");
//2. 和数据库建立网络连接 (写的 jdbc 代码本质上是实现一个 mysql 客户端,要通过网络忽然服务器进行通信)
Connection connection = 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(1,'张三')";
String sql = "insert into student values(?,?)";
//jdbc 中还需要搭配一个特定的对象来描述这里的 sql 的情况
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("sql: " + statement);
//4. 执行 SQL语句(控制客户端给服务器发送请求)
//针对增删改,使用 executeUpdate 来执行
//针对查,使用 executeQuery 来执行
//返回结果的含义是这个操作影响到几行
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
//5. 断开和数据库的连接,并且释放必要的资源
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.ResultSet;
import java.sql.SQLException;
public class JDBCSelectDemo {
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("输入自己的数据库密码");
Connection connection = dataSource.getConnection();
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//结果集合
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
//next 相当于移动一下光标,光标指向下一行,然后移动到结尾,就返回false
//使用 getXX 方法获取到每一列
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + ": " + name);
}
resultSet.close();
statement.close();
connection.close();
}
}
注意:
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问;
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当
前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()
方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环.