Java与数据库 —— JDBC标准
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标准相关推荐
- 通过Java访问数据库---JDBC
一.JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...
- Java实现数据库jdbc连接测试
若想用java实现数据库连接测试,首先需要添加对应数据库的依赖jar包 代码 public class ConnTest {public static String sqlConn(String da ...
- java操作数据库 jdbc
JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果. Statement(存在sql注入风险) Class.forName("com.mys ...
- 数据库---JDBC
1.1 JDBC概述 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同 ...
- 数据库-jdbc、spring-jdbc、spring-boot-starter-jdbc
1.jdbc JDBC是一种用于执行SQL语句的API,可以为多种关系数据库提供统一访问,它是由一组用Java语言编写的类和接口.是Java访问数据库的标准规范. JDBC是Java提供的一种标准规范 ...
- java derby数据库_使用Apache Derby进行Java数据库开发,第1部分
java derby数据库 JDBC简介 以前,本系列文章通过使用ij工具连接Apache Derby数据库并与之交互来演示了许多数据库概念. 尽管当时可能还不太明显,但是您使用的Java应用程序使用 ...
- MySQL与Java+Python的JDBC操作(代码+解说)
目录 JDBC概述 Java操作 JDBC基础案例 Python操作 每文一语 JDBC概述 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语 ...
- 01-JDBC概念--JDBC(Java Database Connectivity:Java数据库连接):使用jdbc实现Java与数据库MySQL连接
JDBC自学教程–终篇总结: 地址:http://blog.csdn.net/baidu_37107022/article/details/72600018 1.JDBC(Java Database ...
- MySQL~Java的数据库编程:JDBC(JDBC的环境配置以及使用)
目录 JDBC的环境配置 JDBC的使用步骤(Java操作数据库) 建立数据库连接 方式一:DriverManager 方式二:DataSource(数据源/数据库连接池) DataSource与 ...
最新文章
- 嵌入式目标检测--Fast YOLO: A Fast You Only Look Once System for Real-time Embedded Object Detection
- 网络工程师必须具备的素质
- 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解 大牛讲解的
- 高级数据分析师凭什么月薪三万?一文解答你所有困惑
- spring boot单元测试
- win10被微软流氓更新后编译基于visual Studio的web项目报[ArgumentOutOfRangeException: 指定的参数已超出有效值的范围...
- 绝地求生7月5日服务器维护,绝地求生7月5日更新到几点 吃鸡更新维护公告
- ASPNET揭秘笔记之三
- php服务器估算,使用zabbix API估算服务器磁盘空间可用天数
- VS中代码格式及样式的统一处理
- delphi7下实现http的post_ASP.NET Core Web API 实现过程
- connot+connect+mysql+127.0.0.1_无法远程连接 MySQL 的解决方法
- 图文详解YUV420数据格式
- varchar2 汉字长度问题
- journalctl查看服务日志
- Red5 支持https和rtmps
- bae 3.0 mysql_应用引擎BAE3.0介绍及百度BAE3.0支持并发多少
- python中backward是什么意思_python-PyTorch函数中的下划线后缀是什么意思...
- 情人节程序员用HTML网页表白【嫦娥奔月(满屏泡泡)】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- @Cacheable注解