对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 ...
随机推荐
- 使用 Docker 生成 Let’s Encrypt 证书
概念 什么是 Container ? https://www.docker.com/resources/what-container https://www.docker.com/why-docker ...
- Go中配置文件读取的几种方式
日常开发中读取配置文件包含以下几种格式: json 格式字符串 K=V 键值对 xml 文件 yml 格式文件 toml 格式文件 前面两种书写简单,解析过程也比较简单.xml形式书写比较累赘,yml ...
- 天气预报APP(2)
之前实现了能够罗列可以罗列出全国所有的省.市.县,然后就是查询全国任意城市的天气信息.查询天气信息使用的是和风天气的api,这个api获得的天气信息是JSON格式的. 使用GSON库解析JSON数据的 ...
- Python3 反射
反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性 hasattr(obj,name) # hasattr(obj, name) # 判断一个对象是否有指定的属性name,返回Tr ...
- 我的C语言学习1
学习是快乐的,尤其是从之前看到一个程序的一头雾水到大致懂了是怎么回事,这个过程是兴奋开心的,让我不断的前进,不能自拔,今天就要结束,总结一下. 1.1-第一个C语言 #include<stdio ...
- 调用链系列(3):如何从零开始捕获body和header
拓展阅读:调用链系列(1):解读UAVStack中的贪吃蛇 调用链系列(2):轻调用链实现 在Java中,HTTP协议的请求/响应模型是由Servlet规范+Servlet容器(如Tomcat)实现的 ...
- 史上最全面 Android逆向培训之__Xposed使用
刚招来个Android,干了半个月辞职了,他走之后,成堆的bug被测了出来,都是这个新人代码都没看懂就开始改的一塌糊涂,还给提交了.实在是让人头疼,清理了一个月多月才把他半个月写的bug清理个差不多. ...
- bat 下 字符串拆分 类似 split 可以使用 for /f delims
@echo offset strin=AA,BB,CC,DDfor /f "tokens=1,2,3,4 delims=, " %%a in ('echo %strin%') do ...
- 管理Windows Server 2008本地用户和组
下面介绍Windows Server 2008本地用户和组的管理包括创建用户.删除用户.重设密码.将用户添加到组.普通用户跟管理员的区别 .用户配置文件包括桌面上文件,桌面背景,桌面上图标,IE设置, ...
- Windows Server 2008利用NTFS管理数据
今天我们学习关于NTFS管理数据 以下是学习的内容NTFS分区和FAT32分区的区别,如何将FAT32分区转化成NTFS分区,FAT 32 不支持大于4G ,NTFS权限设置 ,EFS加密 ,文件夹的 ...