1 JDBC原理
1.1 JDBC标准
1.1.1 JDBC含义
JDBC(Java Database Connectivity):是Java提供的一个标准接口,即访问数据库的通用API。
【个人见解】:
- Java希望用统一的方式来访问不同的数据库,以实现与具体数据库无关的Java操作界面;
- 不同的数据库厂商根据各自数据库的特点去实现这些接口
1.1.2 JDBC接口及数据库厂商实现
JDBC中定义了一些接口:
1、驱动管理:
- DriverManager(加载数据库驱动)
2、连接接口:
- Connection (建立连接)
- DatabasemetaData
3、语句对象接口:(用于执行sql语句,告诉数据库我想要干嘛!)
- Statement
- PreparedStatement
- CallableStatement
4、结果集接口:
- ResultSet (仅当使用select时,才会使用)
- ResultSetMetaData
1.1.3 JDBC工作原理
- 加载驱动,建立连接(通过DriverManager,获取Connection)
- 创建语句对象(通过Connection,创建Statement,用于执行SQL语句)
- 执行SQL语句
- 处理结果集(仅执行select语句时,会产生ResultSet)
- 关闭连接
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
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();
}
}
}