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; //可以使垃圾回收中更早的被回收
					}
				}
			}