JDBC

JDBC

​ Java DataBase Connectivity java与数据库的连接

角色分类

  • 服务器 (db):
    • 1.接收 sql;
    • 2.执行 sql;
    • 3.返回结果
  • 客户端 (java):
    • 1.接收数据;
    • 2.组装sql;
    • 3.发送SQL(与数据库建立联系);
    • 4.分析结果

面向接口编程

  1. java 制定标准 ,不同的数据库厂商实现接口即可。java中提供的接口: java.sql.*; 包下,常用接口如下:

    接口名称作用
    java.sql.Connection连接
    java.sql.Statement静态处理块
    java.sql.PreparedStatement预处理块
    java.sql.ResultSet结果集
    java.sql.ResultSetMetaData结果集元信息(字段名)
  2. oracle 厂商实现接口 (jar):

    安装路径\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar

JDBC流程

  • 准备工作–构建路径:

    • 在项目中建立资源文件夹lib,把ojdbc6放进去,选中这个jar包–build path构建路径,加载内容
  • 连接数据库的基本操作步骤:

    1. 加载驱动 (选择数据库)

    2. 获取连接 (与这个数据库建立连接)

    3. 准备sql

    4. 准备处理块(静态|预处理块)

    5. 发送sql并得到响应 (发送sql到数据库)

    6. 处理数据

    7. 关闭资源

      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      
      public class JDBCDemo01 {
      	public static void main(String[] args) throws ClassNotFoundException, SQLException {
      		//1.加载驱动  (选择数据库)
      		Class.forName("oracle.jdbc.driver.OracleDriver");
      		//2.获取连接  (与这个数据库建立连接)
      		Connection conn=DriverManager.getConnection(
      				"jdbc:oracle:thin:@localhost:1521:xe", 
      				"SCOTT",
      				"TIGER"
      				);
      		//3.准备sql 
      		String sql="select empno,ename from emp";  //sql语句中不用写";"
      		//4.准备处理块(静态,预处理块)
      		Statement state=conn.createStatement();
      		//5.发送sql并得到相应 (发送sql到数据库)
      		ResultSet result=state.executeQuery(sql);
      		//6.处理数据
      		while(result.next()){
      			int empno=result.getInt(1);
      			String ename=result.getString(2);
      			System.out.println(empno+"--->"+ename);
      		}
      		//7.关闭资源
      		result.close();
      		state.close();
      		conn.close();
      	}
      }
      
  • 步骤分析:

    1. 准备工作
      • 引入驱动包
      • 构建路径 build path
      • 测试用户是否正确登录
    2. 建立连接
      • 加载驱动:
        • 驱动:oracle.jdbc.driver.OracleDriver
        • 硬编码:new oracle.jdbc.driver.OracleDriver()
        • 软编码:class.forName(“oracle.jdbc.driver.OracleDriver”) —— 推荐
      • 建立连接:
        • url:jdbc:oracle:thin:@db服务器地址:端口:实例
        • 连接url:jdbc:oracle:thin:@localhost:1521:orcl|xe
        • 用户名与密码:scott = tiger
        • Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@locahost:1521:xe”,“scott”,“tiger”)
    3. 处理块
      • 静态处理块 Statement
        Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。Statement 对象,用于执行不带参数的简单 SQL 语句。执行静态 SQL 语句并返回它所生成结果的对象。
        • 创建 : Connection对象.createStatement()
        • 执行 :
          ddl --> execute(ddl语句) – 通常不会在代码中执行
          dml --> executeUpdate(dml语句)
          select --> executeQuery(select)
        • 特点:处理不变的静态的sql 语句
          优点:直接查看sql,方便处理错误
          缺点:性能不高,拼接 sql 麻烦,可能存在"sql 注入"
      • 预处理块 PreparedStatement
        PreparedStatement 接口继承了 Statement,由于 PreparedStatement 对象已预编译 过,所以其执行速度要快于 Statement对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
        • 创建:Connection对象.prepareStatement(sql)
        • 执行:
          存在"?",先填充参数再执行
          ddl -->execute()
          dml -->executeUpdate()
          select -->executeQuery()
        • 特点:处理 不变的静态的sql 语句 | 可变的sql语句 – 带"?“的 sql语句
          优点:性能高,方便编写sql,不存在"sql 注入”,安全
          缺点:不能直接打印sql语句,不方便处理错误
    4. 分析
      执行完 SQL 语句后可能成功也可能失败,如果成功,有数据,则我们很大一部分情况是需要获取查询的结果。
      • ddl:没有异常就是成功
      • dml:结果 >0 就是成功
      • select:分析结果集
        • 对于 select 的结果集进行分析,类似于迭代器,先判断(移动)再获取:
          • next()
          • getXxx(索引|列名|别名)
    5. 释放资源
      • 原则:先打开的后关闭,所以顺序一般为: 结果集 --> 处理块 --> 连接

优化

  • 异常的捕获与处理

  • 解决硬编码问题(配置资源文件)

    // db.properties(配置资源文件)
    driver=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@localhost:1521:xe
    name=SCOTT
    pwd=TIGER
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class JDBCDemo02 {
    	public static void main(String[] args){
    		Properties pro = new Properties();
    		Connection conn = null;
    		Statement state = null;
    		ResultSet result = null;
    		try {
    			pro.load(Thread.currentThread().
                         getContextClassLoader().
                         getResourceAsStream("db.properties"));
    			//1.加载驱动  (选择数据库)
    			Class.forName(pro.getProperty("driver"));
    			//2.获取连接  (与这个数据库建立连接)
    			conn = DriverManager.getConnection(
    					pro.getProperty("url"), 
    					pro.getProperty("name"),
    					pro.getProperty("pwd"));
    			//3.准备sql 
    			String sql = "select empno,ename from emp";  //sql不能加;,
    			//4.准备处理块(静态,预处理块)
    			state = conn.createStatement();
    			//5.发送sql并得到相应 (发送sql到数据库)
    			result = state.executeQuery(sql);
    			//6.处理数据
    			while(result.next()){
    				int empno=result.getInt(1);
    				String ename=result.getString(2);
    				System.out.println(empno + "-->" + ename);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			//7.关闭资源
    			try {
    				if (result != null) {
    					result.close();
    				}
    				if (state != null) {
    					state.close();
    				}
    				if (conn != null) {
    					conn.close();
    				}
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}		
    	}
    }
    

封装JDBC工具类

  1. 加载驱动

  2. 获取连接

  3. 关闭

    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class DBUtils {
    
    	static Properties pro = new Properties();
    
    	// 加载驱动
    	static {
    		try {
    			pro.load(Thread.currentThread().
                         getContextClassLoader().
                         getResourceAsStream("db.properties"));
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
            // 1.加载驱动 (选择数据库)
    		try {
    			Class.forName(pro.getProperty("driver"));
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    
    	// 获取连接的功能
    	public static Connection getConnection() throws SQLException {
            // 2.获取连接 (与这个数据库建立连接)
    		Connection conn = DriverManager.getConnection(
    								pro.getProperty("url"), 
    								pro.getProperty("name"),
    								pro.getProperty("pwd"));
    		return conn;
    	}
    
    	// 关闭
    	public static void release(ResultSet result, Statement state, Connection conn) {
            // 3.关闭资源
    		try {
    			if (result != null) {
    				result.close();
    			}
    			if (state != null) {
    				state.close();
    			}
    			if (conn != null) {
    				conn.close();
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void release(Statement state, Connection conn) {
    		release(null, state, conn);
    	}
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值