JDBC
概念
首先了解什么是JDBC,当然,JDBC是一种java程序语言,而JDBC程序的作用就是在java程序中连接并管理数据库。在还未学习JDBC前,我们连接数据库大多都是通过控制台,或者专门的管理数据库软件来连接并管理数据库,但是这样的的管理得到的数据都是只能以表的形式展现给我们,我们无法利用得到的数据,更不能在程序中利用得到的数据进行运算。而这时JDBC这一种java语言就完成了java程序连接和管理数据库的作用,JDBC程序可以在我们的java项目中连接数据库,管理书数据库,使用数据库里的数据。
JDBC程序前的准备
java程序通过JDBC连接数据库,而写JDBC程序需要将数据库连接驱动包导入java项目中。每种数据库与不同编程语言的连接驱动不同,每种数据库都会提供对应不同编程语言的连接驱动包,只需去对应数据库官网下载即可。这里以MySql数据库为例下载与java程序连接的驱动包。下载链接:https://www.mysql.com/cn/products/connector/
第一个JDBC程序
项目导入驱动架包后就可以编写我们的第一个JDBC程序1.JDBC程序
public class Jdbc {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try{
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/practise?useUnicode=true&characterEncoding=utf8&useSSL=true";
//用户名
String username = "root";
//密码
String password = "1234";
//连接数据库,此时connection代表数据库,可以完成数据库的操作
connection = DriverManager.getConnection(url,username,password);
//执行的sql语句的对象
statement = connection.createStatement();
//执行sql语句
String sql = "SELECT * FROM users";
//返回几个结果集,封装了所有查询数据
resultSet = statement.executeQuery(sql);
//输出数据
while (resultSet.next()){
System.out.println("name" + resultSet.getString("name"));
}
}catch (SQLException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
//释放资源
try {
if(resultSet != null){
resultSet.close();
}
}catch (SQLException e){
e.printStackTrace();
}
try{
if(statement != null){
statement.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(connection != null){
connection.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
2.对象解析
JDBC程序步骤:
- 加载驱动
- 获得连接
- 获取执行sql语句对象
- 若是查询则需返回结果集
- 释放资源
1)加载驱动
其实我们在加载驱动前需要注册驱动:DriverMansger驱动管理类
通过调用该类的一个方法
但是我们实际开发中不会用该方法来注册驱动,因为在该类的静态代码区中已经调用了该方法注册了驱动,再手动注册驱动则会浪费资源。所以我们在实际开发中使用以下方法来加载驱动。
Class.forName("com.mysql.cj.jdbc.Driver");
2)获得连接
注册驱动后就需要获得连接
connection = DriverManager.getConnection(url,username,password);
通过调用DriverManager类中的getConnection方法获取连接,调用这个方法我们需要传递三个字符串参数url,username,password
URL:
jdbc:mysql://localhost:3306/practise?useUnicode=true&characterEncoding=utf8&useSSL=true
而这个URL又是由什么组成的呢,连接数mysql数据库的URL形式:jebc:mysql://主机地址:端口号/数据库名?参数1&参数2&参数3
主机地址可以是电脑的IP地址,也可以直接写localhost,端口号:mysql的端口号统一为3306,数据库名则是你需要连接的数据库名,而后面的参数则是设置数据库使用的字符集。
Username:
这个参数则是登入数据库时所用的用户名,如果没有更改的话都是root
PassWords:
这个参数则是数据库用户密码
获取连接后,connection就代表了数据库,该对象可以执行数据库的操作,如事务的开始与回滚。
3)获取执行sql语句的对象
获取连接后,就要获取执行sql语句的对象
statement = connection.createStatement();
通过connection的createStatment方法获取执行sql语句的对象statment,该对象可以执行sql语句
4)获取查询的结果集
如果需要执行查询操作,那我们则需要得到一个结果集resultSet
resultSet = statement.executeQuery(sql);
调用statement的executQuery方法返回一个结果集,该方法将结果集封装到一个resultSet对象,最后再通过resultSet对象获取里面的数据
5)资源释放
当JDBC程序结束前,我们需要释放资源
try {
if(resultSet != null){
resultSet.close();
}
}catch (SQLException e){
e.printStackTrace();
}
try{
if(statement != null){
statement.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(connection != null){
connection.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
通过各对象的close方法释放资源。需要注意的是释放资源的顺序,一定是先释放结果集对象resultSet,再释放执行sql语句对象statement,最后释放连接对象connection.
3.ResultSet类相关API
- resultSet.next():该方法判断是否还有下一条记录,若有则查询下一条记录
- resultSet.getInt(String name):该方法返回表中的数据,参数为列名,类似的还有getDouble(),getString()等方法对应获取不同的数据的方法。若不知道数据类型,则可以调用getObject()方法。
4.PreparedStatement类(继承了Statement类) - 我们在实际开发中不会使用Statement类,因为该类很容易发生SQL注入。那什么又是SQL注入呢,所谓SQL注入其中之一就是在我们做登入操作时通过字符串拼接来欺骗数据库,从而做到在不知道密码的情况下完成登入操作。
- 使用PreparedStatement
与Statement类使用不同的是,PrepredStatement类需要先预编译,再传递参数,最后执行SQL语句。
String sql = "insert books(name,price,number) value (?,?,?)";
//预编译
preparedStatement = connection.prepareStatement(sql);
//传递参数
preparedStatement.setString(1,"1234");
preparedStatement.setDouble(2,30);
preparedStatement.setInt(3,20);
//返回结果集,封装了所有查询数据
preparedStatement.executeUpdate() ;
- 执行SQL语句相关API
因为PreparedStatement继承了Statement类,所以执行SQL语句方法基本相同。
1.ResultSet executeQuery():执行DML语句,执行查询操作,返回一个结果集,封装了查询数据。
2.int executeUpdate():执行DDL语句,执行增,删,改的操作,返回更新后记录的条数。
3.boolean excute():可以执行任何sql语句,但不建议使用该方法,该方法效率较低。
4.void addBath():执行多条sql语句,添加sql语句
5.void clearParmeters():执行多条sql语句添加了语句就有清除sql语句这就是执行数据库增删改查的第一个JDBC程序