JDBC学习心得

1 JDBC原理

1.1 JDBC标准

1.1.1 JDBC含义

JDBC(Java Database Connectivity):是Java提供的一个标准接口,即访问数据库的通用API。

【个人见解】:
  • Java希望用统一的方式来访问不同的数据库,以实现与具体数据库无关的Java操作界面;
  • 不同的数据库厂商根据各自数据库的特点去实现这些接口
JDBC学习心得_第1张图片

1.1.2 JDBC接口及数据库厂商实现

JDBC中定义了一些接口:
1、驱动管理:
  • DriverManager(加载数据库驱动)
2、连接接口:
  • Connection   (建立连接)
  • DatabasemetaData
3、语句对象接口:(用于执行sql语句,告诉数据库我想要干嘛!)
  • Statement
  • PreparedStatement
  • CallableStatement
4、结果集接口:
  • ResultSet  (仅当使用select时,才会使用)
  • ResultSetMetaData

1.1.3 JDBC工作原理

  1. 加载驱动,建立连接(通过DriverManager,获取Connection)
  2. 创建语句对象(通过Connection,创建Statement,用于执行SQL语句)
  3. 执行SQL语句
  4. 处理结果集(仅执行select语句时,会产生ResultSet)
  5. 关闭连接
JDBC学习心得_第2张图片

package day01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/*
 * 测试使用JDBC连接oracle数据库
 */
public class JDBCDemo {
	public static void main(String[] args) {
		//连接数据库一定会用到IO,用到IO一定要捕获异常
		try{
			//1、加载驱动
			/*
			 * 当报错:java.lang.ClassNotFoundException时,表明项目中没有导入数据库驱动jar包;
			 * 若导入后还报这个错,大部分原因是驱动方式书写错误/jar包倒错了
			 */
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2、通过DriverManager获取Connection
			/*
			 * 【注意】:导入的包都是在java.sql.*下
			 * 三个参数:url、username、password
			 * 根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
			 * 
			 * oracle--url格式:jdbc:oracle:thin:@::
			 * mySql--url格式:jdbc:mysql://:/
			 */
			Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");
			
			//3、通过Connection对象创建Statement,执行SQL语句(这里需要导入java.sql.Statement包)
			Statement stmt=conn.createStatement();
			/*
			 * 执行sql语句--根据执行的sql语句的不同,这里边调用的方法也不同:
			 * 1、boolean flag=stmt.execute(sql); //执行DDL语句(create...),返回结果,表示是否执行成功
			 * 2、ResultSet rs=stmt.executeQuery(sql); //执行DQL语句(select...),返回结果,表示结果集
			 * 3、int flag=stmt.executeUpdate(sql); //执行DML(增删改...),返回int值,表示这条语句执行后影响了多少条数据
			 */
			/*
			 * 通过Statement执行查询语句:
			 * 查询emp表中的信息--select empno,ename,sal,deptno from emp;
			 */
			String sql="select empno,ename,sal,deptno from EMP";
			System.out.println(sql);//打桩,输出sql,用于检查拼写是否有错误
			ResultSet rs=stmt.executeQuery(sql);
			
			//4、接收返回结果集,常用处理方式:遍历/判断是否有结果(登录)
			/*
			 * 指针最初在行首,next()方法在行间移动,getXXX()方法--用于获取字段的内容
			 */
			while(rs.next()){
				System.out.println(rs.getInt("empno")+","+rs.getString("ename")+","+rs.getDouble("sal")+","+rs.getInt("deptno"));
			}
			
			//5、关闭连接
			conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}


1.2 数据库厂商实现

1.2.1 Oracle实现

驱动:ojdbc6.jar、ojdbc14.jar(开发时,需要将下载的驱动类加载到项目中,并通过项目右键-build path)

1.2.2 MySQL实现

驱动:mysql-connector-java-5.0.4-bin.jar(不同版本可能不同名称,同样需要加载到项目中)

2 JDBC基础编程

2.1 连接管理

       由于各个公司需要连接的数据库可能不同,所以会导致更改数据库连接的操作,但是更改原代码的成本是很大的,所以这里就介绍一下“连接管理”的知识:

第一步:通过 向连接工具类 获取连接

【个人见解】:在工程中,通常编写一个访问数据库的工具类(DBUtil),之后所有的访问数据库的操作,都从该工具类中获取连接。

实现该工具类的两种方式:
  • 直接把数据配置写在工具类中;
  • 把数据库配置写在一个 .properties 属性文件中,让该工具类读取属性文件,逐行获取数据库参数;(一般使用第二种)
第二步:创建 .properties 属性文件

#驱动类名
driver=oracle.jdbc.driver.OracleDriver
#数据库的路径
url=jdbc:oracle:thin:@localhost:1521:orcl
#访问数据库的用户名
user=scott
#访问数据库的密码
psw=scott

第三步:构建 DBUtil工具类

package day01;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

/*
 * 使用配置文件来配置JDBC连接数据库
 * 该类,用来管理数据库的连接
 */
public class DBUtil {
	//静态块,特点:只有在该类被JVM加载时,才会被调用,但也仅仅被调用一次
	static{
		try{
			//读取配置文件中的信息
			Properties prop=new Properties();
			
			//固定写法,路径:以src为当前根目录,没有一个统一的标准,一般我们放在当前类的src下,这样找到类就可以找到该配置文件了
			InputStream is=DBUtil.class.getClassLoader().getResourceAsStream("day01/config.properties");
			prop.load(is);
			
			is.close();
			System.out.println("读取配置文件成功");
			
			//获取配置文件信息
			String driver=prop.getProperty("driver");
			url=prop.getProperty("url");
			user=prop.getProperty("user");
			psw=prop.getProperty("psw");
			
			//注册驱动
			Class.forName(driver);
			/*
			 * 获取连接不能在这边进行,因为DBUtil类的作用是用于管理连接的工具类,该怎么连,连哪个数据库这个类不用管
			 */
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
	/*
	 * 获取一个连接,外界调用
	 * @return
	 */
	public static Connection getConnection() throws Exception{
		try{
//			Thread t=Thread.currentThread();
//			System.out.println("执行getConnection方法的线程是:"+t);
			/*
			 * 通过DriverManager创建一个数据库的连接,并返回
			 */
			Connection conn=DriverManager.getConnection(url,user,psw);
			/*
			 * ThreadLocal的set方法,将当前线程作为key,将给定的值作为value存入内部的map中保存
			 */
			tl.set(conn);
			return conn;
			
		}catch(Exception e){
			e.printStackTrace();
			throw e;//抛出异常,通知调用者这边出错了
		}
	}
	
	/*
	 * 关闭给定的连接
	 */
	public static void closeConnection(){
		try{
//			Thread t=Thread.currentThread();
//			System.out.println("执行closeConnection方法的线程是:"+t);
			
			Connection conn=tl.get();//只是拿到数据,并没有从里边删除
			
			if(conn!=null){
				conn.close();
				tl.remove();//将之前用过的删除掉
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}



第四步:获取工具类

package day01;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

/*
 * 通过DBUtil类获取连接,并执行sql
 */
public class JDBCDemo3 {
	public static void main(String[] args) {
		try{
//			Thread t=Thread.currentThread();
//			System.out.println("执行当期main方法的线程是:"+t);
			
			Connection conn=DBUtil.getConnection();
			System.out.println("数据库已连接");
			
			Statement state=conn.createStatement();
			
			String sql="select * from EMP";
			
			ResultSet rs=state.executeQuery(sql);
			
			while(rs.next()){
				System.out.println("empno:"+rs.getString("empno")+" "+"ename:"+rs.getString("ename")+" "+
						"sal:"+rs.getString("sal")+" "+"deptno:"+rs.getString("deptno"));
			}
			
			/*
			 * 结果集使用完毕后,应当关闭,释放资源;
			 * 但是若Statement关闭了,那么rs也会自动关闭
			 */
			rs.close();
			
			//当不再通过Statement执行其他sql时,我们应当及时关闭Statement,以释放JDBC与数据库的资源占用
			state.close();
			
			//使用后,关闭连接
			DBUtil.closeConnection();
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

2.2 连接池

2.2.1 为什么要使用连接池














你可能感兴趣的:(JDBC学习心得)