JDBC(Java DataBase Connectivity --java数据库连接)。
以我的理解来说,jdbc 就是用来规范程序与不同数据库连接的一个标准规范。
所以直接开始代码部分
1. 程序连接数据库,前提是需要一个驱动器,所以需要加载数据库驱动。
a.DriverManager.registerDiver(new Driver);//可以使用,但是会出现注册两次驱动的问题
b.Class.forName();//实际常用 注册驱动代码
2. 加载驱动器之后,便是搭建一个程序与数据库之间的桥梁,即 建立连接。
DriverManager.getConnection(url,username,password);
url:代表的是数据库的路径,好比桥梁连接的是哪两个位置。
username、password 就不用多说,就是数据库的用户名和密码。
3. 有了桥梁之后,就需要一个对象来运输程序和数据库之间的数据。 即 创建 Statement对象
connection.createStatement();
4. 然后就是需要用Statement对象来实现对数据库内容的操作,而具体如何操作,需要由SQL语句来决定,同时取出来的数据需要用一个容器对象来存储,即ResultSet 对象
ResultSet resultSet = statement.executeQuery(SQL);
5. 程序对数据进行操作,最后需要将用过的东西关闭,节约内存
resultSet.close();
statement.close();
connection.close();
这就是一个完整的JDBC的流程
下面讲一下我所碰到的问题,因为我装的MySql版本 8. 0
所以我按照上面的流程写好代码之后就出现一系列的问题及解决
1. 之前使用的 Jdbc jar 包不能使用,需要改成 mysql-connector-java-8.0的,可以去https://mvnrepository.com/artifact/mysql/mysql-connector-java查找
2. 连接的驱动 需要由原来的 import com.mysql.jdbc.Driver 改成 import com.mysql.cj.jdbc.Driver;
3. url 参数后面需要加上?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
package com.zhouxin.jdbc.demo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
import com.mysql.cj.jdbc.Driver;
public class JdbcDemo1 {
@Test
public void demo1() {
try {
//加载数据库驱动
DriverManager.registerDriver(new Driver());//该方法会出现注册两次驱动的问题
//所以实际注册驱动代码可以是
//Class.forName("com.mysql.jdbc.driver");
String url ="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
//建立连接
Connection conn = DriverManager.getConnection(url,"root","pwd_970301");
//创建Statement对象
Statement state = conn.createStatement();
String sql = "select * from user" ;
//查询数据库,并返回结果集resultSet
ResultSet resultSet = state.executeQuery(sql);
//遍历结果集
while(resultSet.next()) {
int uid = resultSet.getInt("uid");
String uname = resultSet.getString("username");
String name = resultSet.getString("name");
System.out.println( "用户ID" + uid + "用户账号" + uname + "用户名称" + name);
}
//关闭连接,释放资源
resultSet.close();
state.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
补充:
在上面的代码中释放资源的过程中会出现一个问题。如果在释放资源代码前面出现BUG,那么这个资源释放的代码是不会被执行的,资源没有释放,一定会存在一些问题,所以需要将释放资源的代码放在finally的代码块中,可以无论出现什么问题,释放资源代码被执行。 代码有点多,我们也可以将这资源释放代码整合成一个工具类,来使用。
@Test
public void demo1() {
Connection conn = null;
Statement state = null;
ResultSet resultset = null;
try {
//.....
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(resultset!=null) {
try {
resultset.close();
} catch (SQLException e) {
resultset = null;
}
}
if(state!=null) {
try {
state.close();
} catch (SQLException e) {
state = null;
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
conn = null; //可以使垃圾回收中更早的被回收
}
}
}