JDBC由来与描述

  • 没有JDBC前
开发者想操作数据库,必须需要了解每个数据库对应的数据库驱动程序API,由于每个数据库驱动程序的API都不同,所以当需要迁移数据库时,根本不平滑,需要大量修改与重写
  • 有了JDBC后
Sum公司也知道问题之后,就提出一种约束 —— JDBC规范,让所有数据库厂商都按照这个JDBC规范来开发数据库驱动程序,以便于Java程序能用统一方式操作不同的数据库,数据库迁移变成可行
  • JDBC描述
JDBC是一种Java web的规范,需要具体开发者(数据库厂商)来实现

JDBC常用四大API

  • DriverManager
作用:
1、注册驱动
Class.forName("com.jdbc.mysql.Driver");2、获取连接
Connection conn = DriverManager.getConnection();
  • Connection
作用:
1、创建执行SQL语句的对象(3种)
Statement createStatement()    // 执行SQL语句
PreparedStatement prepareStatement()   // 预编译SQL并执行
CallableStatement prepareCall()    // 执行SQL存储过程2、进行事务管理
setAutoCommit(boolean b)
commit()
rollback()
  • Statement
作用:
1、执行SQL语句
boolean execute(String sql)   // 执行SQL语句,执行select就返回true,否则返回false
ResultSet executeQuery(String sql)     // 执行SQL中的select语句
int executeUpdate(String sql)          // 执行SQL中的insert/update/delete语句2、执行批量SQL语句
addBatch(String sql)    // 添加到批量处理
executeBatch()          // 执行批量处理
clearBatch()            // 清空批量处理
  • ResultSet
(select语句)查询结果的集合
作用:获取到查询的结果
next()           //判断是否有下一条数据
getXXX()         //根据数据类型获取查询记录的数据
getObject()      //通用获取数据方法

JDBC资源释放

释放原则:晚创建,早释放;资源稀有,不释放很快会阻塞

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from user");rs.close();
stmt.close();
conn.close();

JDBC CURD操作

  • 增加
Connection conn = null;
Statement stmt = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 获取执行SQL语句对象stmt = conn.createStatement();// 编写SQLString sql = "insert into user values ("xiaomin","女人",12)";// 执行SQL语句int i = stmt.executeUpdate(sql);if(i > 0){System.out.println("插入成功!");}
}catch(Exception e){e.printStackTrace();
}finally{if(stmt != null){try{stmt .close();}catch(SQLException e){e.printStackTrace();}finally{stmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}
  • 更新
Connection conn = null;
Statement stmt = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 获取执行SQL语句对象stmt = conn.createStatement();// 编写SQLString sql = "update user set name = 'wt'";// 执行SQL语句int i = stmt.executeUpdate(sql);if(i > 0){System.out.println("更新成功!");}
}catch(Exception e){e.printStackTrace();
}finally{if(stmt != null){try{stmt .close();}catch(SQLException e){e.printStackTrace();}finally{stmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}
  • 删除
Connection conn = null;
Statement stmt = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 获取执行SQL语句对象stmt = conn.createStatement();// 编写SQLString sql = "delete from user where id = 3";// 执行SQL语句int i = stmt.executeUpdate(sql);if(i > 0){System.out.println("删除成功!");}
}catch(Exception e){e.printStackTrace();
}finally{if(stmt != null){try{stmt .close();}catch(SQLException e){e.printStackTrace();}finally{stmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}
  • 查询
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 获取执行SQL语句对象stmt = conn.createStatement();// 编写SQLString sql = "select * from user";// 执行SQL语句rs = stmt.executeQuery(sql);if(rs.next()){System.out.print(rs.getString("name"));}
}catch(Exception e){e.printStackTrace();
}finally{if(rs != null){try{rs .close();}catch(SQLException e){e.printStackTrace();}finally{rs = null;}}if(stmt != null){try{stmt .close();}catch(SQLException e){e.printStackTrace();}finally{stmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}

JDBC SQL注入解决方案

开发时,使用 PreparedStatement对象 取代 Statement对象 来执行SQL有效避免SQL注入

  • 增加
Connection conn = null;
PreparedStatement pstmt = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 编写SQLString sql = "insert into user values (?,?,?)";// 获取执行SQL语句对象pstmt = conn.preparedStatement(sql);// 设置参数pstmt.setString(1, "qqq");pstmt.setString(2, "bbb");pstmt.setString(3, "ccc");// 执行SQL语句int i = pstmt.executeUpdate();if(i > 0){System.out.println("插入成功!");}
}catch(Exception e){e.printStackTrace();
}finally{if(pstmt != null){try{pstmt.close();}catch(SQLException e){e.printStackTrace();}finally{pstmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}
  • 更新
Connection conn = null;
PreparedStatement pstmt = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 编写SQLString sql = "update user set name = ?, age = ?, pwd = ? where id = ?";// 获取执行SQL语句对象pstmt = conn.preparedStatement(sql);// 设置参数pstmt.setString(1, "wt");pstmt.setString(2, 15);pstmt.setString(3, "basdcx");pstmt.setString(4, 10);// 执行SQL语句int i = pstmt.executeUpdate();if(i > 0){System.out.println("更新成功!");}
}catch(Exception e){e.printStackTrace();
}finally{if(pstmt != null){try{pstmt.close();}catch(SQLException e){e.printStackTrace();}finally{pstmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}
  • 删除
Connection conn = null;
PreparedStatement pstmt = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 编写SQLString sql = "delete from user where id = ?";// 获取执行SQL语句对象pstmt = conn.preparedStatement(sql);// 设置参数pstmt.setString(1, 16);// 执行SQL语句int i = pstmt.executeUpdate();if(i > 0){System.out.println("删除成功!");}
}catch(Exception e){e.printStackTrace();
}finally{if(pstmt != null){try{pstmt.close();}catch(SQLException e){e.printStackTrace();}finally{pstmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}
  • 查询
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;try{// 注册驱动Class.forName("com.mysql.jdbc.Driver");// 获得连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root");// 编写SQLString sql = "select * from user where sex = ?";// 获取执行SQL语句对象pstmt = conn.preparedStatement(sql);// 设置参数pstmt.setString(1, '男');// 执行SQL语句rs = pstmt.executeQuery();while(rs.next()){System.out.println(rs.getString("name"));}
}catch(Exception e){e.printStackTrace();
}finally{if(rs != null){try{rs.close();}catch(SQLException e){e.printStackTrace();}finally{rs = null;}}if(pstmt != null){try{pstmt.close();}catch(SQLException e){e.printStackTrace();}finally{pstmt = null;}}if(conn != null){try{conn.close();}catch(SQLException e){e.printStackTrace();}finally{conn = null;}}
}

连接池(数据源)JDBC优化技术

数据库连接频繁创建与消耗,在资源使用上是一种浪费

  • 常用连接池
C3P0、HikariCP、Druid、Tomcat、Dbcp
  • 用法(以C3P0为例)
ComboPooledDataSource dataSource = new ComboPooledDataSource();   // 只需一个对象
// 获取连接
Connection conn = dataSource.getConnection();

Java与数据库 —— JDBC标准相关推荐

  1. 通过Java访问数据库---JDBC

    一.JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...

  2. Java实现数据库jdbc连接测试

    若想用java实现数据库连接测试,首先需要添加对应数据库的依赖jar包 代码 public class ConnTest {public static String sqlConn(String da ...

  3. java操作数据库 jdbc

    JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果. Statement(存在sql注入风险) Class.forName("com.mys ...

  4. 数据库---JDBC

    1.1 JDBC概述 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同 ...

  5. 数据库-jdbc、spring-jdbc、spring-boot-starter-jdbc

    1.jdbc JDBC是一种用于执行SQL语句的API,可以为多种关系数据库提供统一访问,它是由一组用Java语言编写的类和接口.是Java访问数据库的标准规范. JDBC是Java提供的一种标准规范 ...

  6. java derby数据库_使用Apache Derby进行Java数据库开发,第1部分

    java derby数据库 JDBC简介 以前,本系列文章通过使用ij工具连接Apache Derby数据库并与之交互来演示了许多数据库概念. 尽管当时可能还不太明显,但是您使用的Java应用程序使用 ...

  7. MySQL与Java+Python的JDBC操作(代码+解说)

    目录 JDBC概述 Java操作 JDBC基础案例 Python操作 每文一语 JDBC概述 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语 ...

  8. 01-JDBC概念--JDBC(Java Database Connectivity:Java数据库连接):使用jdbc实现Java与数据库MySQL连接

    JDBC自学教程–终篇总结: 地址:http://blog.csdn.net/baidu_37107022/article/details/72600018 1.JDBC(Java Database ...

  9. MySQL~Java的数据库编程:JDBC(JDBC的环境配置以及使用)

      目录 JDBC的环境配置 JDBC的使用步骤(Java操作数据库) 建立数据库连接 方式一:DriverManager 方式二:DataSource(数据源/数据库连接池) DataSource与 ...

最新文章

  1. 嵌入式目标检测--Fast YOLO: A Fast You Only Look Once System for Real-time Embedded Object Detection
  2. 网络工程师必须具备的素质
  3. 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解 大牛讲解的
  4. 高级数据分析师凭什么月薪三万?一文解答你所有困惑
  5. spring boot单元测试
  6. win10被微软流氓更新后编译基于visual Studio的web项目报[ArgumentOutOfRangeException: 指定的参数已超出有效值的范围...
  7. 绝地求生7月5日服务器维护,绝地求生7月5日更新到几点 吃鸡更新维护公告
  8. ASPNET揭秘笔记之三
  9. php服务器估算,使用zabbix API估算服务器磁盘空间可用天数
  10. VS中代码格式及样式的统一处理
  11. delphi7下实现http的post_ASP.NET Core Web API 实现过程
  12. connot+connect+mysql+127.0.0.1_无法远程连接 MySQL 的解决方法
  13. 图文详解YUV420数据格式
  14. varchar2 汉字长度问题
  15. journalctl查看服务日志
  16. Red5 支持https和rtmps
  17. bae 3.0 mysql_应用引擎BAE3.0介绍及百度BAE3.0支持并发多少
  18. python中backward是什么意思_python-PyTorch函数中的下划线后缀是什么意思...
  19. 情人节程序员用HTML网页表白【嫦娥奔月(满屏泡泡)】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  20. @Cacheable注解

热门文章

  1. c++界面设计皮肤工具
  2. Log4J 最佳实践之全能配置文件
  3. 在线Javascript压缩工具
  4. 改革春风吹满地,安卓新系统Q上线腾讯WeTest
  5. python第三天学习总结
  6. Raid Level,该如何为Oracle存储选择才好?
  7. 如何不显示地图就获取位置数据?
  8. UNIX高级环境编程 第11、12章 线程同步及属性
  9. nhibernate GetType
  10. 让你的sublime text写C代码 (sublime text 2 配置构建C开发环境)