一下子搞懂JDBC,看这篇就够了–以MySQL为例。
文章目录
一、什么是JDBC?
JDBC(Java DataBase Connectivity)是Java语言与数据库系统之间的桥梁,通过JDBC可以实现在Java代码中对数据库执行操作。
它由一组用Java语言编写的类和接口组成,是 Java应用程序与各种不同数据库之间进行对话的方法。
简而言之,有了jdbc可以直接由Java程序来控制对数据库系统执行增删改查,而不用在命令控制行中去苦逼的运行了。
二、JDBC的使用步骤
-
导入jar包
很简单,不再详述。已经有小伙伴提供方法,可以点击链接直接去看看。
但是有一点一定要注意:下载的jar包一定要和自己的MySQL版本是匹配的。比如自己电脑上安装的是MySQL5,下载的jar包大版本也得是5。
-
注册JDBC驱动程序
注册驱动程序有两种常用方法
方法1:
//mysql5以及之前的版本需要加载驱动程序进内存 Class.forName("com.mysql.jdbc.Driver") //mysql5以后的注册驱动这句代码可以省略,非要写请写下面的。【因为Driver的地址发生了改变】 Class.forName("com.mysql.cj.jdbc.Driver")
方法2:
DriverManager.registerDriver(new Driver());
其实呢阅读源码发现Driver类里面有个静态方法块,运行了方法二中的代码。
//Driver类中的静态代码块。 static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
-
两种方法的区别:
使用方法二时,程序需要导包操作,也就是在程序开始需要
import com.mysql.cj.jdbc.Driver
这一句代码。而方法一则可以不需要这个导包操作。使用方法二就降低了程序的扩展性。
-
-
获取Connection对象。
//调用DriverManager中的静态方法,获取到Connection对象 Static public Connection getConnection(String url,String username,String password);
上面的url字符串写法因MySQL的版本而异,具体请看下表:
mysql版本 url mysql 8 jdbc:mysql://主机名:3306/数据库名?serverTimezone=UTC mysql 5 jdbc:mysql://主机名:3306/数据库名 而username和password就是登录自己mysql的账号和密码。
-
JDBC执行SQL语句
JDBC执行对象首先需要根据获取到的Connection对象获取到Statement或者 PreparedStatement对象。关于这两个对象的区别,将在后面的各类详解中给出。
//获取到Statement对象 Statement statement = connection.createStatement(); //执行增删改操作,调用executeUpdate方法,返回受影响行数。 int count =statement.executeUpdate("update stu set id=8 where name='张三'"); //执行查询操作,调用executeQuery,返回一个ResultSet结果集。 ResultSet resultSet = statement.executeQuery("select * from stu");
-
关闭资源
statement.close(); connection.close();
整体代码示例:
import java.sql.*;
/**
*演示代码,此代码应用的mysql版本为8.0.26
*jar包版本为8.0.16
*/
public class demo {
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?serverTimezone=UTC","root","root");
//获取执行对象
Statement statement = connection.createStatement();
//执行增删改操作
int count =statement.executeUpdate("update stu set id=8 where name='张三' ");
System.out.println(count);
//执行查询操作
ResultSet resultSet = statement.executeQuery("select * from stu");
//遍历结果集,获取结果
while (resultSet.next()){
System.out.println(resultSet.getInt("id"));
}
//关闭资源
statement.close();
connection.close();
}
}
三、jdbc进阶–上述各个类或接口详解
3.1 DriverManager类–驱动管理对象
这里主要说一下DriverManager中的getConnection方法。getConnection方法有四种重载形式,其中有一种是私有的,我们能够使用另外三种。
//重载形式1【常用】
public getConnection(String url,String username,String password);
//重载形式2,username和password都被封装到一个Properties对象中
public getConnection(String url,Properties info);
//重载形式3
public getConnection(String url);
3.2 Connection接口
Connection接口:获取执行sql语句的对象以及执行事务操作
//jdbc中事务是默认提交的,开启事务则调用下面的方法并参数中传入false
connection.setAutoCommit(false);
//提交事务
connection.commit();
//回滚方法
connection.rollback();
//获取Statement对象
Statement statement1 = connection.createStatement();
//获取PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement(Sring sql);
从上面可以看到,获取到Statement对象的时候没有传入参数,获取到PreparedStatement对象时就已经传入了sql语句。这个区别大吗?这个区别不大。下面继续看。
3.3 Statement接口和PreparedStatement接口
3.3.1 执行单条语句
无论是Statement对象还是PreparedStatement对象,都需要根据传入的sql语句选择合适的方法去处理。如果是增删改语句,则调用executeUpdate
方法,并用int类型的变量去接收返回值,返回值大于0,则说明执行成功;如果是查询语句,则调用executeQuery
方法,用结果集类ResultSet的对象去接收。
3.3.2 批处理
如果有同时执行多条语句的需求,那么批处理的方法你一定得看看。需要注意的是,多条添加的时候,添加到批处理的语句都得是增删改语句。
//Statement对象添加语句
String sql1="update stu set id=1 where name='张三'";
String sql2="update stu set id=9 where name='李四'";
void statement.addBatch(String sql1);
void statement.addBatch(String sql2);
//执行
int[] ints=statement.executeBatch();
/
//PreparedStatement对象添加语句
PreparedStatement preparedStatement = connection.prepareStatement("select * from stu where id=?");
//上面的“?”可以替换为想要的值,根据需要替换的元素数据类型选择合适的方法,index表示第几个问号,从1开始
preparedStatement.setInt(int index,Int num);
preparedStatement.setString(int index,String str);
//执行
preparedStatement.addBatch();
3.3.3 Statement接口和PreparedStatement接口的区别
两者都是用来执行SQL语句的接口,PreparedStatement接口称为预状态通道,在创建对象时就传入了需要执行的SQL语句,其性能较Statement更高。另外,由于PreparedStatement在处理值的时候统一采用了字符串形式进行处理,因此可以防止sql注入攻击。
3.4 ResultSet集合
执行查询语句的返回值。
//基本语法如下
//执行查询语句,获取到ResultSet对象
ResultSet resultSet = preparedStatement.executeQuery();
//遍历集合,获得结果,语法和迭代器类似。
while (resultSet.next()){
System.out.println(resultSet.getString("name"));
}
通过列名获取到列值,在括号中传入列名,根据列的数据类型选择合适的方法,例如我的表的name列是varchar类型,所以用getString方法接收;如果是整数类型,则用getInt方法,使用int类型接收;日期类型数据则用getDate方法接收。
所以呢,如果不知道表的列名以及数据类型,怎么获得到数据呢?
这时候Java为你准备了另一个接口:ResultSetMetaData
。
通过ResultSet集合的getMetaData方法,获取到ResultSetMetaData对象,通过getTableName(int column)
方法传入第几列获得到列名,通过getColumnTypeName(int column)
方法获取到列的数据类型。
不知道表的列名以及数据类型,怎么获得到数据呢?
这时候Java为你准备了另一个接口:ResultSetMetaData
。
通过ResultSet集合的getMetaData方法,获取到ResultSetMetaData对象,通过getTableName(int column)
方法传入第几列获得到列名,通过getColumnTypeName(int column)
方法获取到列的数据类型。