对JDBC的使用理解
JDBC,即Java连接数据库,是java针对数据库操作的一套API,使用JDBC对数据库进行操作时分为以下几步:
1.加载数据库驱动类
Class.forName("com.mysql.jdbc.Driver");
2.获取数据库连接
要能连接到数据库,就需要知道数据库的用户名 user,密码 password,以及url,url定义了连接数据库时的协议,子协议,数据库来源信息,mysql的url链接一般为:
jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=gbk; 这里,jdbc就是链接数据库的协议,mysql为子协议,后面为数据库的地址以及相应的数据库。
知道以上信息后就可以连接到一个数据库了,使用DriverManager的getConnection(String url,String user,String password) 可获取Connection对象,该对象代表一个数据库的链接,通过该链接,可以向数据库发送及执行sql语句。
3.定义sql语句;
4.创建发送及执行sql语句的对象
这里JDBC提供了三个类,用于向数据库发送及执行sql语句,分别为 Statement,PreparedStatement,CallableStatement。
a. Statement:用于发送及执行简单的sql语句,也就是执行静态的sql语句(相应参数在sql语句里写死的,没有使用占位符),获取方式:Statement sta=con.creatStatement();
b. PreparedStatement:执行动态的sql语句,能够对sql语句进行预编译,获取方式为:PreparedStatement pre=con.preparedStatement(sql);,所谓预编译,就是在获取PreparedStatement对象的时候就已经将sql语句发送到数据库完成了预编译,只不过这个时候的sql语句中要传入的相应参数是使用占位符?来表示的。在后面执行sql语句的时候会将相应参数设置好传进来直接执行,由于是提前已经编译好了,这条预编译的sql语句能够在将来的查询中重用,所以如果是对同一语句的重复操作,这种方式sql的执行效率要比Statement的高一些,由于PreparedStatement第一次执行的消耗是很高的,它的性能是体现在后面的重复执行的。比如,要使用PreparedStatement的方式执行一条记录的查询时,JDBC驱动会发送一个网络请求到数据库预编译这个查询,在具体执行查询语句的时候又会发送一次执行的请求,前后一共是进行了两次网络请求。而Statement由于不会发送预编译的请求,只是在执行sql语句的时候发送一次请求,只会产生一次网络请求。所以,对于执行一次的sql语句使用Statement的方式,对于一条sql语句需要多次执行,使用PreparedStatement.
同时,使用PreparedStatement还能防sql注入,为什么呢?接下来我们分析
使用Statement时,sql语句是把直接拼装而成的String字符串发送到数据库进行执行,如:String sql="select * from table where name= '" +varname +"'" and password='" + varpassword+"'"; 如果此时,如果有人把“ ;drop table tablename ”作为varpassword传进来,则:sql语句就变成了:"select * from table where name= '" +varname +"'" and password='" + varpassword+"'";drop table tablename;,这样有可能就会成功执行,导致数据库被删除。
但如果使用PreparedStatement时,上面的sql语句就可以写成:String sql="select * from table where name= ?and password=?;此时参数就是使用占位符?来表示的,这条语句在PreparedStatement pre=con.preparedStatement(sql)时会提前被预编译,后期再通过pre.setString(1,varname)这种方式给sql语句中传入参数时,就无法和原来的sql语句发生任何匹配的关系了,这样就能有效防止sql注入了,而如果使用普通的statement,有可能要对drop等进行过滤,无法防止sql注入。
c.CallableStatement:用来执行数据库存储过程,CallableStatement cstmt= con.prepareCall("{CALL demo(?,?)}");
5. 执行sql语句
Statement接口提供了三种执行sql语句的方法:executeQuery、executeUpdate和execute.
a. ResultSet executeQuery(String sql):用于执行数据库查询的sql语句,返回一个结果集对象。
b. int executeUpdate(String sql):用于执行insert,update或delete以及sql DDL语句。
c. execute(String sql),用于执行返回多个结果集。
6. 遍历结果集,获取查询结果。
7. 关闭JDBC对象资源。
对JDBC的使用理解的更多相关文章
- Java SE学习【三】——JDBC
最近学到了数据库与java的jdbc方面,还有个DAO模式,写一下自己的理解,后期有什么不对的再改. 一.数据库三范式的理解 记得以前上课时,也上了一学期的“数据库系统原理”,给我们上课的老师算是渣渣 ...
- Spring DAO vs Spring ORM vs Spring JDBC
Pat 的疑惑 最近关注于 Spring 提供的数据访问技术,对于 Spring 相关的这几个项目有何不同我不是太明白: Spring-DAO (http://docs.spring.io/sprin ...
- Jmeter使用入门
修改时间 修改内容 修改人 2016.3.12 创建 刘永志 2016.6.18 完成 刘永志 Jmeter简介 Jmeter的基本概念 百度百科: Apache JMeter是Apache组织开发的 ...
- 跟开涛老师学shiro -- 身份验证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
- Mybatis第一篇【介绍、快速入门、工作流程】
什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- Mybatis入门看这一篇就够了
什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- Jmeter 测试工具
Jmeter的基本概念 百度百科: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可 ...
- Jmeter安装和启动和使用
一.安装配置JDK 1.下载安装jdk,地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.配置JDK环境变 ...
- 理解JDBC和JNDI
下面的英文是我找过来的,因为是英文所以不敢翻译出来误导别人,但是它描述的确实恰到好处,比所谓网上的JNDI和JDBC云云的解释要精辟很多,如果遇到不认识的单词,用有道吧~~:) The Java Na ...
随机推荐
- 算法实战-OJ之旅
算法虽然不是特别简单,但没有你想象中的那么难. Sort Array By Parity easy AC-17ms. 按照<算法导论>排序一章的一些概念,第二种可以称为是原址的(in-pl ...
- 使用抽象工厂反射获取不到Dal层对象,未能加载文件或程序集......
Put aside the fog and see the essence 解决问题之前,要明白问题为什么会出现 我相信能点开这篇帖子的人,都是具有探索精神的人,因为,只有心存疑问才会搜索 如果只想单 ...
- [原创实践]redhat linux 5.3搭建Nexus
1:下载安装JDK,配置好环境变量(JAVA_HOME等) 下载linux下64位的jdk-7u45-linux-x64.tar.gz(百度网盘下载,官网的jdk-7u51-linux-x64.tar ...
- 史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式
1.概述 通过前两篇 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 文章对SignalR的介绍, ...
- java后端开发面经 数据库相关
小姐姐:怎么理解感情中的付出和回报? 你答:有这样一个故事,讲的是一个小男孩和一个小女孩,这个小男孩呢,用很多好玩石头,而这个小女孩呢,有好多好吃的糖果,有一天,他们相互约定:小男孩用所有的石头交互小 ...
- 用原生JS实现AJAX和JSONP
前端开发在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的.其实,原生 ...
- 【原】iOS查找私有API
喜接新项目往往预示的会出一堆问题.解决问题的同时往往也就是学到更多东西的时候,这也许就是学习到新东西最直接最快速的方法吧! 小编经过努力,新项目终于过测试了,可是被苹果大大给拒了,好苦啊,最近的审核真 ...
- React单页面应用使用antd的锚点跳转失效
首先在react项目中引用antd的锚点 import {Anchor} from 'antd';const { Link } = Anchor; <Anchor> <Link hr ...
- Java进程故障排查
故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...
- GIT和SVN教程
各种版本控制工具的简单比较 特性 CVS SVN GIT 并发修改 支持 支持 支持 并发提交 不支持 支持 支持 历史轨迹 不支持更名 支持更名 支持更名 分布式 不支持 不支持 支持 SVN SV ...