什么是JDBC
JDBC是java database connectivity的缩写,是SUN公司提供的一套操作数据库的标准规范。
JDBC提供了一些操作数据库的API,开发者可以在java中使用这些API操作数据库,实现对表中数据的增删改查操作,JDBC相当于Java和数据库之间的一座桥梁。
SUN公司制定了JDBC标准,各大数据库厂商会提供数据库驱动实现这个标准,这样java才可以通过JDBC来操作实现标准的数据库。如果将JDBC看做是接口的话,数据库厂商提供的数据库驱动就是这个接口的实现类。各个数据库厂商会将 各自的数据库驱动打成jar包对外发布,开发者在使用时需要下载与当前数据库匹配的数据库匹配的数据库驱动jar包。
JDBC规范让java程序和数据库驱动实现了松耦合,使切换不同的数据库变得更加简单。
JDBC的四个核心接口
- DriverManager:用于注册驱动并创建符合该驱动的数据库的连接。
- Connection:表示与数据库创建的连接对象,即一个connection对应一个会话,相当于在mysql workbench中打开一个连接。
- Statement:操作数据库sql语句的对象,有两个实现类:Statement和PreparedStatement(常用)。
- ResultSet:从数据库中查询的结果集。
使用JDBC开发的准备工作
JDBC规范在Jdk中的:
java.sql;
javax.sql;
这两个包下面,**不过这里面都是接口,**要想使用JDBC的话,需要下载相关的数据库驱动jar包
使用JDBC编程的步骤
JDBC的编程步骤:
(1)加载数据库驱动 class.forName(“DriverName”); DriverName就是数据库驱动类所对应的字符串。
(2)通过DriverManager获取数据库连接。
DrivereManager中提供了一个getConnectionn()方法来获取数据库连接,获取方式如下:
connection conn = DriverManager.getConnection(String url,String user,String pwd)
(3) 通过Connection对象获取Statement对象。
①createStatement():创建基本的Statement对象
②prepareStatement(String Sql):根据传递的SQL语句创建PreparedStatement对象
(4)使用Statement执行SQL语句。
所有的Statement都有如下三种执行SQL语句的方法。
①execute(String sql):用于执行任意的sql语句z
②executeQuery(String sql):用于执行查询语句,返回一个ResultSet结果集对象
③executeUpdate(String sql):主要用于执行DML(s数据操作语言)和DDL(数据定义语言)语句。
执行DML语句(Insert、UPDATE或Delete)时,会返回受SQL语句影响的行数,执行DDL(CREATE、ALTER)语句返回0.
(5)操作ResultSet结果集。如果执行SQL语句时查询语句,执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果。
程序可以通过操作该ResultSet对象来取出查询结果。
(6)关闭连接,释放资源。
每次操作数据库结束后都要关闭数据库连接,释放资源,以重复利用资源。需要注意的是,通常资源的关闭顺序与打开顺序相反,顺序是
ResultSet、Statement(或Preparedtatement)和Connection。
为了保证在异常情况下也能关闭资源,需要在 try…catch…的finally代码块中统一关闭资源
代码实例
注意不同驱动版本的写法,有的要加上时区,根据报错信息仔细查找原因!!!
//注册驱动 ,反射
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接 Connection,这一步必须加时区
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/monkey1024?serverTimezone=GMT%2B8", "root", "monkey1024");
//得到执行sql语句的对象Stament
Statement smt = conn.createStatement();
//执行sql语句,并返回结果
ResultSet rs = smt.executeQuery("select id,name,password from t_user");
//处理结果
while(rs.next()) {a
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("name"));
System.out.println(rs.getObject("password"));
System.out.println("---------");
}
//关闭connection
rs.close();
smt.close();
conn.close();
倘若在“执行sql语句,并返回结果”这一步报出了异常,那程序就会停止,这样就导致后面关闭资源相关的代码无法执行,但在报异常之前,conn和stmt已经创建好了,没有正确关闭,为了解决这个问题,可以将关闭资源代码的部分放到finally语句块中。
注意上面的这种方法是一种思路!!!合理使用finally方法!!
preparedStatement
PreparedStatement是一个接口,它继承了Statement,该接口有以下几个优点:
- 性能Statement高,会把sql预编译
- 可以解决sql注入问题
在sql语句中,使用?作为占位符来替代要传入的内容,通过调用PreparedStatement的setString等方法将要传入的内容作为参数传递过去!