对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对象资源。
最新文章
- linux 常用命令学习记录
- Ceph Zabbix plugin 插件和模板
- [Spring MVC] - 地址路由使用(一)
- 修改eclipse中settings.xml和默认资源库保存地址
- 获取当前屏幕显示的viewcontroller
- nenu contest2
- 手机摇一摇效果-html5
- Node.js入门实例程序
- Oracle数据库之FORALL与BULK COLLECT语句
- 使用 OpenWrt Image Generator 为 WR703N 路由器定制固件
- Android ADT安装时卡在Calculating requirements and dependencies
- Spark集群搭建_Standalone
- spring学习起步
- java标识字
- redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?
- JS 处理Json数据事例
- Oracle 学习之exists
- spring 事务管理机制
- 后台导入导出Excel
- 转:facebook 开源工具集合
热门文章
- mysql 查询结果显示行号
- Python基础总结之初步认识---class类的继承(下)。第十五天开始(新手可相互督促
- 数据结构之堆栈java版
- Netty学习(九)-Netty编解码技术之Marshalling
- java学习-NIO(五)NIO学习总结以及NIO新特性介绍
- 记一次mysql主从同步因断电产生的不能同步问题 1236 1032
- pythonday01计算机初步认识
- Kafka 系列(五)—— 深入理解 Kafka 副本机制
- virtualenv使用和virtualenvwrapper使用笔记
- DRF (Django REST framework) 中的Request 与 Response