文章目录
JDBC概述
JDBC(Java Database Connectivity)是Java语言提供的一套连接数据库的接口,接口的实现在JDBC中叫做数据库驱动,由各大数据库厂家负责提供。这样的做的原因就是使用者不需要关心底层是如何实现的,实现者也不能告诉你我的数据库底层的实现细节是什么。mysql数据库是开源的,所以它提供的驱动里面包含了源码。用户如果需要Java程序连接它们的数据库产品就需要去对应的数据库官网下载驱动jar包。JDBC的这种设计的方式体现的思想是要针对接口编程,不要针对实现编程,抽象不应该依赖于细节,细节不应该依赖抽象,即依赖倒置原则。
IDEA导入jar包
方式一:
- 将从官网下载的mysql-connector直接解压,复制里面的驱动jar包。
- 在idea你的项目下创建一个lib目录,将复制的驱动jar包粘贴进去。
- 右键选择驱动jar包 --> 选择as Library,驱动jar包成功添加到项目的Libraries中。
方式二:
选择File -->打开Project Structure --> 点击 + 号,创建一个Java的项目库 -->选择想导入的jar包 -->最后点击apply,应用到项目中。
JDBC编程六步
第一步:注册驱动
-
第一种方式:
try{ Driver driver = new com.mysql.cj.jdbc.Driver(); DriverManager.regisertDriver(driver); }catch(SQLException e){ e.printStackTrace(); }
注意:左边的Driver属于java.sql包下的,而右边的Driver则属于com.mysql.cj.jdbc包下的。
-
第二种方式(类加载的方式):
由com.mysql.cj.jdbc.Driver类的源码可知,我们不必创建Driver对象注册驱动,在Driver类加载的时候,就会自动执行静态代码块里的注册驱动方法。因此我们可以这样写:
try{ Class.forName("com.mysql.cj.jdbc.Driver"); }catch(ClassNotFoundException e){ e.printStackTrace(); }
这样写的好处是程序灵活性高,代码没有写死。如果程序想换一个数据库,只需要传递一个数据库的全限定名的字符串就可以了,字符串可以保存在配置文件中,通过资源绑定器ResourceBunlde绑定配置文件获取。这里的代码演示待会儿获取数据库连接对象再进行。
com.mysql.cj.jdbc.Driver类的源码:
public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } }
第二步:获取数据库连接对象
/*
url(uniform resource locator):统一资源定位符,是一种用于指定因特网的万维网上的信息或资源的位置的方法。
URL包括了哪几部分?
协议:常见的有http、https、ftp,连接mysql数据库的协议的名称是jdbc:mysql。
域名或ip地址:连接本机的mysql数据库可以使用localhost或者172.0.0.1。
端口号:mysql是3306,http是80,https是443,ftp是21。
资源名:资源在服务器上的路径。
携带的参数:使用?name1=value1&name2=value2&name3=value3...这种格式。
例如:jdbc:mysql//172.0.0.1/login?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
*/
String url;
String user;
String password;
Connection connection = DriverManager.getConnection(url,user,password);
java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
使用高版本的mysql驱动jar包可能会报以上的错误,低版本不会。
解决方法:
在配置文件中的 连接字符串后面加上?serverTimezone=UTCUTC是统一标准世界时间
完整的连接字符串示例:jdbc:mysql://localhost:3306/hello?serverTimezone=UTC
如果指定使用gmt+8时区,需要写成GMT%2B8,否则可能报解析为空的错误
顺便一提,如果输入中文存在乱码,可以如下设置:
jdbc:mysql://127.0.0.1:3306/hello?useUnicode=true&characterEncoding=UTF-8
当然,为了稳妥,你也可以都写上 如下:
jdbc:mysql://127.0.0.1:3306/hello?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
搞定。
参考:https://blog.csdn.net/weixin_42652696/article/details/83864740
第三步:获取数据库操作对象
//Statement对象专门用于执行sql语句
Statement statement = connection.createStatement();
第四步:执行SQL
String sql = "insert into login(name,psw) values('jack','123')";
//专门用于执行DML语句(insert delete update),返回值是影响数据库记录的条数
int count = statement.executeUpdate(sql);
第五步:处理查询结果集(对于DML语句可以跳过这步)
//ResultSet用于处理JDBC的查询结果集
ResultSet resultSet = statement.executeQuery(sql);
//next()方法用于判断光标当前执行的行是否有数据
while(resultSet.next()){
//按下标取数据,JDBC中所有的下标都是以1开始,这种写法太死了,一般使用按列名取数据。
int id = resultResult.getInt(1);
String name = resultResult.getString(2);
String password = resultResult.getString(3);
System.out.println(id +" "+ name +" "+ password);
//按列名取数据,因为查询语句可以为列名起别名,所以注意是查询结果集里面的名字。除了getInt()、getString()以外还有获取其他指定类型数据的方法。
int id = resultResult.getInt("id");
String name = resultResult.getString("name");
String password = resultResult.getString("psw");
System.out.println(id +" "+ name +" "+ password);
}
封装在ResultSet对象中的数据以以下方式组织
第六步:释放资源
//必须释放创建的与数据库保持连接占用的资源,后创建的先关闭。为了保证程序因出现异常而终止也能正常关闭资源,通常将它们放在finall语句块中
resultSet.close();
statement.close();
connection.close();
完整的编程六步示例
import java.sql.*;
public class TestJDBC01 {
public static void main(String[] args) {
Statement statement