目录
JDBC编程的由来
JDBC编程的准备工作
1. 下载数据库驱动包
2. 将jar包作为标准库编辑
3. 编写JDBC代码(需要通过下面几个步骤完成开发)
(1)JDBC编程(在数据库中插入一条记录)
运行结果:
JDBC代码(插入记录)需要注意:
(2)JDBC编程(在数据库中查询多条记录)
执行结果:
前言
JDBC编程的由来
如果是在公司操作数据库,大多数情况都是用代码来操作数据库的,可能每个公司用的数据库都是不一样的,各种数据库,如MySQL,Oracle,SQL Server在进行开发的时候,就会提供一组编程接口(API),这些数据库提供的API是不相同的,此时程序猿就需要学习很多份API,后来Java提出,统一API,由数据库厂商提供一个程序来完成API的转换,对各种数据库原装的API进行封装,再提供成JDBC的形状,再进行学习代码操作数据库时,就学习Java的JDBC这一套api即可。
Java程序猿要想进行数据库的开发,就需要在项目张导入对应的数据库的驱动包才能用Java代码操作数据库。(驱动包是由数据库厂商提供的),可以在maven中央仓库(类似于应用商店)下载。
JDBC编程的准备工作
1. 在maven中央仓库中下载对应版本的数据库驱动包(大版本能匹配即可),maven中央仓库地址:https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0 |
2. 在Java项目中新建包,把对应的驱动包复制到包中。之后右键选择Add as Library(添加为标准库),就是将这个驱动包变成Java标准库提供的,之后就可以直接调用驱动包中的类和方法。 |
3. 编写JDBC代码。 |
1. 下载数据库驱动包
2. 将jar包作为标准库
3. 编写JDBC代码(需要通过下面几个步骤完成开发)
1. 创建并初始化一个数据源(描述数据库服务器在哪) |
2. 和数据库服务器建立连接(和数据库建立连接后才能对里边的数据) |
3. 构造SQL语句(和cmd操作数据库的sql语句一样,只是多了一步预编译sql语句) |
4. 执行SQL语句(是否操作成功数据库中的数据,执行完后在控制台会有提示) |
5. 释放必要的资源(对服务器而言,同一时刻要处理很多个客户端的请求,就需要消耗一定的资源,所以服务器就需要释放不必要的资源),不用了的资源要赶紧释放 |
(1)JDBC编程(在数据库中插入一条记录)
package JDBCLearn;/*
java操作数据库先把这个MySQL提供给Java的api导入到项目中(不用解压缩,jvm会帮我们自动识别)
1.将这个jar压缩包程序导入到jdbc项目,
2.把这个jar包变成Java库(library),之后Java就能识别jar包中的很多的.class文件了
3.编写jdbc代码即可了。*/
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 {
Scanner scanner = new Scanner(System.in);
//JDBC需要通过一下几步来完成开发
//1.创建并初始化一个数据源 数据源:数据从哪里来(描述数据库服务器在哪里)
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java107_2?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("12345");//这几个东西都设置了,才能连接数据库
//以上几行代码只是描述数据源,描述数据库在哪 但是还没有和数据库建立连接
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.从控制台录入用户要插入的数据
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
System.out.println("请输入学生id:");
int id = scanner.nextInt();
//4.构造SQL语句
//这里只是一个字符串语句,就像是一个参数
//String sql = "insert into student values(" + id + ",'"+ name + "')";//但是这种写法非常丑
String sql = "insert into student values(?,?)";//问号就是两个占位符
PreparedStatement statement = connection.prepareStatement(sql);//就是预编译一下给数据库服务器的这个sql指令
//上一行代码的意思就是做一些准备工作,如果直接把sql语句传给数据库服务器,让它去解析我们的指令,这个时候服务器的压力就会大很多
statement.setInt(1,id);//这个是把第一个占位符设置成id
statement.setString(2,name);//这个是把第二个占位符设置成name
//5.执行SQL语句
int ret = statement.executeUpdate();//executeUpdate指的是影响的行数(可以在服务器那端敲语句查看一下)
System.out.println("ret = " + ret);
//这句代码的意思就是把sql语句(预编译过的)发送给数据库服务器,由数据库服务器做出响应
//6.释放必要的资源
statement.close();
connection.close();
}
}
运行结果:
执行代码之前:
执行代码之后:
JDBC代码(插入记录)需要注意:
1. 写的代码不应该直接插入某一条记录,而是让用户从控制台输入,然后插入到数据库,这种写法是更加灵活的(用户是不会写JDBC的代码的,此时插入某一条固定的记录,如果用户需要插入别的记录,此时就需要改代码,这是不现实的)。 |
2. SetUrl,SetUser,SetPassword相当于有了数据库的钥匙,光描述数据库在哪里不够,还要有钥匙才能进入到数据库操作里边的数据。 |
3. 注意释放资源的顺序,如果是先创建的资源(PrepareStatment,Connection,),要最后才能释放;后创建的资源要先释放。(如果先关闭了外面的资源,里面的资源就释放不了了) |
4. 在构造sql语句后要对sql语句进行预编译(构造的sql语句只是一个字符串,之后数据库服务器拿到这个字符串之后是要解析成sql的,之后才能执行,但是如果是很多的客户端都发一个字符串,服务器需要解析的压力就很大,所以先对构造的sql语句进行预编译,先解析成一个真正的sql语句,再发送给服务器,这样才能更合理的利用服务器的资源) |
5. 在执行JDBC代码的时候,要确保Mysql服务器是开启的 (否则编译报错) |
(2)JDBC编程(在数据库中查询多条记录)
package JDBCPractice;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import com.sun.deploy.security.MozillaMyKeyStore;
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/java100?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("12345");
//2.建立连接
Connection connection = dataSource.getConnection();
//3.构造SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行SQL
//executeUpdate返回的是int类型,RsultSet这个集合就像是表一样的结构
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集合
while (resultSet.next()) {
//把resultSet想象成一个表格,同时这个表格中有一个光标,默认指向表格最上方
//每次调用next,此时光标就往下走一行,同时next返回一个true
//当表格遍历完成后,光标指向表格最后了,此时再调用next,就返回false了
//当光标指向某一行的时候,就可以通过getxxx方法来获取这一行里的数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + ", name = " + name);
}
//6.释放资源
resultSet.close();
statement.close();
connection.close();
}
}
JDBC代码(查询记录)需要注意:
1. 整体上和插入记录的代码步骤是一样的,只是多了一步遍历结果的集合。 |
2. ResultSet这个类就像是一张表,查询到的一行一行的数据都放在这个表中,要把这个数据显示在控制台中,就需要遍历这张表,之后把每一行每一列的数据打印出来即可。 |