JDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成
Sun公司、数据库厂商、程序员三方关系:
SUN公司是规范制定者,制定了规范JDBC(连接数据库规范)
DriverManager类 作用:管理各种不同的JDBC驱动
Connection接口
Statement接口和PreparedStatement接口
ResultSet接口
数据库厂商微软、甲骨文等分别提供实现JDBC接口的驱动jar包,程序员学习JDBC规范来应用这些jar包里的类。
1:加载一个Driver驱动
2:创建数据库连接(Connection)
3:创建SQL命令发送器Statement
4:通过Statement发送SQL命令并得到结果
5:处理结果(select语句)
6:处理返回值
7:关闭数据库资源ResultSet Statement Connection
创建模块/项目 导入jar包
例:
public Book SelectBookByid(String id) {
Book book=new Book();
Connection con=null;
PreparedStatement ps=null;
ResultSet resultSet=null;
try{
//1手动加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得链接对象//jdbc表示链接数据库的技术。//mysal选择表示数据库语言
String url="jdbc:mysql://127.0.0.1:3306/bookmanager?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
String username="root";
String password="root";
con= DriverManager.getConnection(url,username,password);
System.out.println(con);//con是null;
//3编写sql命令:
String sql="select * from book14 where bid=?";
//4获得执行对象
ps=con.prepareStatement(sql);
ps.setString(1,id);
//5执行命令,返回执行结果
resultSet=ps.executeQuery();//executeQuery:用来执行查询语句
//6处理返回值
while (resultSet.next()){
book.setbId(resultSet.getString(1));
book.setbName(resultSet.getString(2));
book.setStatus(resultSet.getInt(3));
book.setLendDate(resultSet.getString(4));
book.setLendCount(resultSet.getInt(5));
}} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try{
if (resultSet != null) {
resultSet.close();
}
//7关闭链接资源
if (ps!=null){
ps.close();
}
if (ps!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
return book;
}
MySQL8中数据库连接的四个参数有两个发生了变化:
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mydb?
useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
或者String url = ".......serverTimezone=GMT%2B8";
错误1:
Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc2.Driver
原因:没有添加jar包或者com.mysql.jdbc2.Driver路径错误
错误2:
Exception in thread "main" java.sql.SQLException:
No suitable driver found for jbdc:mysql://127.0.0.1:3306/stumgr
原因:url错误
错误3:
Exception in thread "main" java.sql.SQLException:
Access denied for user 'root'@'localhost' (using password: YES)
原因:用户名或者密码错误
错误4:
Exception in thread "main" com.mysql.jdbc.exceptions
.jdbc4.MySQLIntegrityConstraintViolationException:Duplicate entry '90' for key 'PRIMARY'
原因:主键冲突
错误5:
Public Key Retrieval is not allowed
原因: 如果用户使用 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启
在jdbc连接添加上参数allowPublicKeyRetrieval=true即可,注意参数间用&