JDBC的开发流程是什么?
1、注册驱动 (Class.forName)
2、获得连接(DriverManager.getConnection())
3、获得执行者对象 (通过连接对象获取Statement或者PrepareStatement)
4、获得结果集 (excuseUpdate或者excuseQuery方法后获取ResultSet结果集)
5、结果集处理
6、释放资源(依次关闭连接对象ResultSet/Statement/Connection)总结JDBC的问题:1. 频繁创建数据库连接对象,释放。容易造成系统资源的浪费,从而影响系统性能。企业项目中可以使用
连接池解决这个问题,但是使用jdbc需要自己实现连接池。mybatis内部已经提供了连接池。2. sql语句定义,参数设置,结果集处理存在硬编码。3. 结果集处理存在重复代码,处理麻烦。如果可以映射为java对象会比较方便。
JAVA JDBC常见问题
什么是JDBC,在什么时候会用到它?JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库。
JDBC接口及相关类在java.sql包和javax.sql包 里。我们可以用它来连接数据库,执行SQL查询,存储过程,
并处理返回的结果。JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加简单。有哪些不同类型的JDBC驱动?和数据库进行交互的Java程序分成两个部分,一部分是JDBC的API,实际工作的驱动则是另一部分。JDBC是如何实现Java程序和JDBC驱动的松耦合的?JDBC API使用Java的反射机制来实现Java程序和JDBC驱动的松耦合。什么是JDBC连接,在Java中如何创建一个JDBC连接?JDBC连接是和数据库服务器建立的一个会话。你可以想像成是一个和数据库的Socket连接。创建JDBC连接很简单,只需要两步:A. 注册并加载驱动:使用Class.forName(),驱动类就会注册到DriverManager里面并加载到内存里。
B. 用DriverManager获取连接对象:调用DriverManager.getConnnection()方法并传入数据库连接的URL,
用户名及密码,就能获取到连接对象。Connection con = null;
try{// load the Driver ClassClass.forName("com.mysql.jdbc.Driver");// create the connection nowcon = DriverManager.getConnection("jdbc:mysql://localhost:3306/DBName","username","password");}catch (SQLException e) {System.out.println("Check database is UP and configs are correct");e.printStackTrace();}catch (ClassNotFoundException e) {System.out.println("Please include JDBC MySQL jar in classpath");e.printStackTrace();}
}JDBC的DriverManager是用来做什么的?JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。然后我们会把数据库配置信息
传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库
连接,并返回给调用的程序。在Java程序中,如何获取数据库服务器的相关信息?使用DatabaseMetaData可以获取到服务器的信息。当和数据库的连接成功建立了之后,可以通过
调用getMetaData()方法来获取数据库的元信息。DatabaseMetaData里面有很多方法,通过它们
可以获取到数据库的产品名称,版本号,配置信息等。DatabaseMetaData metaData = con.getMetaData();
String dbProduct = metaData.getDatabaseProductName();JDBC的Statement是什么?Statement是JDBC中用来执行数据库SQL查询语句的接口。通过调用连接对象的getStatement()方法我们
可以生成一个Statement对象。我们可以通过调用它的execute(),executeQuery(),executeUpdate()
方法来执行静态SQL查询。默认情况下,一个Statement同时只能打开一个ResultSet。如果想操作多个ResultSet对象的话,需要创建
多个Statement。Statement接口的所有execute方法开始执行时都默认会关闭当前打开的ResultSet。execute,executeQuery,executeUpdate的区别是什么?1.Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,
这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们
可以通过它的getResultSet方法来获取ResultSet,或者通过getUpdateCount()方法来获取更新的记录
条数。2.Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询
不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传
进来的是insert或者update语句的话,它会抛出错误信息为 “executeQuery method can not be
used for update”的java.util.SQLException。3.Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,
或者 什么也不返回DDL语句。返回值是int类型,如果是DML语句的话,它就是更新的条数,如果是DDL的
话,就返回0。4.只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery
或者executeUpdate方法。JDBC的PreparedStatement是什么?PreparedStatement对象代表的是一个预编译的SQL语句。由于PreparedStatement是预编译的,通过它
可以将对应的SQL语句高效的执行多次。由于PreparedStatement自动对特殊字符转义,避免了SQL注入
攻击,因此应当尽量的使用它。相对于Statement,PreparedStatement的优点是什么?它和Statement相比优点在于:
1.PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义。
2.PreparedStatement可以用来进行动态查询。
3.PreparedStatement执行更快。尤其当你重用它或者使用它的拼量查询接口执行多条语句时。
4.使用PreparedStatement的setter方法更容易写出面向对象的代码,而Statement的话,我们得
拼接字符串来生成查询语句。如果参数太多了,字符串拼接看起来会非常丑陋并且容易出错。PreparedStatement的缺点是什么,怎么解决这个问题?PreparedStatement的一个缺点是,我们不能直接用它来执行in条件语句;需要执行IN条件语句的话,
下面有一些解决方案:
1.分别进行单条查询——这样做性能很差,不推荐。
2.使用存储过程——这取决于数据库的实现,不是所有数据库都支持。
3.使用存储过程——这取决于数据库的实现,不是所有数据库都支持。
4.在PreparedStatement查询中使用NULL值——如果你知道输入变量的最大个数的话,这是个不错的办法,
扩展一下还可以支持无限参数。JDBC的ResultSet是什么?
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。Statement中的setFetchSize和setMaxRows方法有什么用处?
1.setMaxRows可以用来限制返回的数据集的行数。当然通过SQL语句也可以实现这个功能。比如在MySQL中
我们可以用LIMIT条件来设置返回结果的最大行数。
2.假设我们有一条查询返回了100行数据,我们把fetchSize设置成了10,那么数据库驱动每次只会取10条
数据,也就是说得取10次。当每条数据需要处理的时间比较长的时候并且返回数据又非常多的时候,这个
可选的参数就变得非常有用了。JDBC的批处理是什么,有什么好处?
JDBC通过Statement和PreparedStatement中的addBatch和executeBatch方法来支持批处理。批处理比
一条条语句执行的速度要快得多,因为它需要很少的数据库调用.JDBC的事务管理是什么,为什么需要它?
默认情况下,我们创建的数据库连接,是工作在自动提交的模式下的。这意味着只要我们执行完一条查询
语句,就会自动进行提交。有的时候我们希望由一组SQL查询组成一个事务,如果它们都执行OK我们再进行
提交,如果中途出现异常了,我们可以进行回滚。JDBC的DataSource是什么,有什么好处?DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。
1.缓存PreparedStatement以便更快的执行
2.可以设置连接超时时间
3.提供日志记录的功能
4.ResultSet大小的最大阈值设置
5.通过JNDI的支持,可以为servlet容器提供连接池的功能什么是数据库的隔离级别?数据库通过锁来防止脏读,不可重复读(Non-Repeatable Reads)及幻读(Phantom-Read)的问题。JDBC的RowSet是什么,有哪些不同的RowSet?RowSet用于存储查询的数据结果,和ResultSet相比,它更具灵活性。RowSet继承自ResultSet,
因此ResultSet能干的,它们也能,而ResultSet做不到的,它们还是可以。RowSet接口定义在javax.sql
包里。RowSet提供的额外的特性有:
提供了Java Bean的功能,可以通过settter和getter方法来设置和获取属性JDBC里的CLOB和BLOB数据类型分别代表什么?CLOB意思是Character Large OBjects,字符大对象,它是由单字节字符组成的字符串数据,有自己专门的
代码页。这种数据类型适用于存储超长的文本信息,那些可能会超出标准的VARCHAR数据类型长度限制
(上限是32KB)的文本。BLOB是Binary Larget OBject,它是二进制大对象,由二进制数据组成,没有专门的代码页。它能用于
存储超过VARBINARY限制(32KB)的二进制数据。这种数据类型适合存储图片,声音,图形,或者其它业务
程序特定的数据。JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?
当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同时另一个查询读到了这个刚更新
的值。这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能会进行回滚,这样
这个数据就是无效的。数据库的TRANSACTION_READCOMMITTED,TRANSACTION_REPEATABLEREAD,
和TRANSACTION_SERIALIZABLE隔离级别可以防止脏读。JDBC中存在哪些不同类型的锁?乐观锁——只有当更新数据的时候才会锁定记录。
悲观锁——从查询到更新和提交整个过程都会对数据记录进行加锁。不仅如此,一些数据库系统还提供了行锁,表锁等锁机制。DDL和DML语句分别代表什么?DDL(数据定义语言,Data Definition Language)语句用来定义数据库模式。Create,Alter,
Drop, Truncate, Rename都属于DDL语句,一般来说,它们是不返回结果的。DML(数据操作语言,Data Manipulation Language)语句用来操作数据库中的数据。select,insert, update, delete, call等,都属于DML语句。java.util.Date和java.sql.Date有什么区别?
java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。如何把图片或者原始数据插入到数据库中?可以使用BLOB类型将图片或者原始的二进制数据存储到数据库里。什么是幻读,哪种隔离级别可以防止幻读?假设一个事务正根据某个条件进行数据查询,然后另一个事务插入了一行满足这个查询条件的数据。
之后这个事务再次执行了这条查询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,
而这种现象就叫做幻读。什么是JDBC的最佳实践?1.数据库资源是非常昂贵的,用完了应该尽快关闭它。Connection, Statement, ResultSet等JDBC对象
都有close方法,调用它就好了。2.养成在代码中显式关闭掉ResultSet,Statement,Connection的习惯,如果你用的是连接池的话,
连接用完后会放回池里,但是没有关闭的ResultSet和Statement就会造成资源泄漏了。3.在finally块中关闭资源,保证即便出了异常也能正常关闭。4.大量类似的查询应当使用批处理完成。5.尽量使用PreparedStatement而不是Statement,以避免SQL注入,同时还能通过预编译和缓存机制提升执行
的效率。6.如果你要将大量数据读入到ResultSet中,应该合理的设置fetchSize以便提升性能。7.数据库隔离级别越高性能越差,确保你的数据库连接设置的隔离级别是最优的。8.如果在WEB程序中创建数据库连接,最好通过JNDI使用JDBC的数据源,这样可以对连接进行重用。9.如果你需要长时间对ResultSet进行操作的话,尽量使用离线的RowSet。JDBC 编程的步骤?
(1) 注册驱动;
(2) 获取连接对象 Connection;
(3) 创建 Statement 对象;
(4) 运行 SQL 语句;
(5) 处理结果;
(6) 关闭连接释放资源。
JDBC的开发流程是什么?相关推荐
- 基于WADE框架开发流程
基于WADE框架开发流程 步骤一:创建导航栏按钮 在Sidebar.html中,按需求增加下列代码: <li class="open hover workModel"> ...
- SpringMVC+Mybatis框架集成开发基础——项目开发流程——01
项目开发一般流程: 1.描述项目的主要功能及各个模块的功能 2.系统采用的技术方案 3.创建E-R模型图(实体关系模型图,数据库) 4.搭建数据库环境.创建数据库表及表间约束 5.搭建项目 ...
- 瑞吉外卖项目(一)软件开发流程设计及环境搭建
第一章 软件开发整体介绍 软件开发流程 软件开发流程 需求分析:产品原型.需求规格说明书 设计:产品文档,ui界面设计,概要设计,详细设计,数据库设计 编码:项目代码,单元测试 测试:测试用例,测试报 ...
- 【Javaweb】基础开发流程与介绍
本文档写于2022年7月29日,由于个人水平有限,可能存在一些问题,因此仅供参考 @萌狼蓝天 JavaWeb基础开发流程 1.确定系统和功能 在此以"宠物管理系统"为例,要开发一个 ...
- Java微服务开发流程及详细案例
微服务开发流程及详细案例 文章目录 微服务开发流程及详细案例 一. 微服务示例简介 二. IDEA创建父Maven工程及子项目 2.1 使用IDEA创建Maven项目 2.2创建子项目模块 2.3父项 ...
- 简述Web程序开发流程
总体开发流程 分析需求, 列出功能清单或写需求说明书. 设计程序功能, 写功能规格书和技术规格书. 进入开发与测试的迭代. 调试和性能等专项测试. 部署上线 运维 前端开发流程 根据功能规格绘制页面草 ...
- 移动端开发者眼中的前端开发流程变迁与前后端分离
写在最开始 这是一篇面向移动端开发者的科普性文章,从前端开发的最初流程开始,结合示范代码,讨论开发流程的演变过程,希望能覆盖一部分前端开发技术栈,从而对前端开发的相关概念形成初步的认识. 本文会提供一 ...
- node.js的开发流程_Node.js子流程:您需要了解的一切
node.js的开发流程 by Samer Buna 通过Samer Buna Node.js子流程:您需要了解的一切 (Node.js Child Processes: Everything you ...
- 软件开发流程包含哪些内容
2019独角兽企业重金招聘Python工程师标准>>> 能否开发出一个好的软件,关键是看软件开发前期所做的工作,重点是这个软件有没有一个好的 软件开发流程,因为一个好的软件开发流程关 ...
最新文章
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
- 复制初始化和直接初始化
- ASP.NET三层架构之不确定查询参数个数的查询
- ABAP BSP的工具类CL_BSP_UTILITY
- tomcat一闪而过
- Leetcode--174. 地下城游戏
- python keyerror_盘点Python 初学者最容易犯的10大错误!你中招了吗?
- 如何提高写前端的效率?干货,快进!
- 【java】java 并发编程 Condition 源码分析
- 用汇编的眼光看C++(之类继承)
- [Linux 性能检测工具]SAR
- Redis常用数据类型介绍、使用场景及其操作命令
- avast 8.0.1483 许可文件(杀毒软件免费激活)
- testbench文件显示波形_如何编写testbench的总结(非常实用的总结)
- 【Python】基于Python的百度迁徙(2020年10月21日更)
- 基于445端口漏洞的入侵测试
- 一文述说人工智能(AI)发展史,几经沉浮!
- 科技公司要干掉专业媒体?先迈过内容这道大坎
- php-emoji使用微信,微信开发中emoji表情的问题
- 使用HbuilderX 的UNIapp开发app, 打包后定位不能使用的解决方式