参考文章:

http://blog.csdn.net/wang379275614/article/details/23393335

概念
  JDBC-数据库连接,是由一些类和接口构成的API,是J2SE的一部分,有java.sql、javax.sql包组成。下面看一下JDBC API与应用程序和数据库驱动及数据库之间的关系:

可以看出JDBC是Sun公司为应用程序与数据库驱动之间提供的一组接口(规范)。数据库驱动是实现数据库操作的类,它并不由sun公司来实现,而是由具体的公司来根据sun提供的规范(JDBC)来制作。

操作数据库的步骤(以mySql为例)
  1. 注册驱动
   常用的有3种方式:
   1)      直接注册驱动:
   DriverManager.registerDriver(com.mysql.jdbc.Driver);这种方式要求程序首先要引入驱动包,否则无法通过编译。而且它可能会造成DriverManager中产生两个一样的驱动,并对具体的驱动类产生依赖,所以不推荐使用。
   2)      键值对方式:
   System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);同时注册多个驱动则用冒号隔开。这种方式如果事先不引入驱动包的情况下能通过编译(因为操作的都为字符串,运行时肯定不行啦),所以虽然不会对具体的驱动类产生依赖,但注册不太方便,所以很少使用。
   3)      Class.forName方式(类似反射):
   Class.forName(“com.mysql.jdbc.Driver”); Class.forName函数的作用是根据类的名字将类装载到虚拟机中(并未实例化);这种方式也不会对具体的驱动类产生依赖,而且使用很方便,所以推荐使用。
  2. 建立连接
   Connection conn=DriverManager.getConnection(url,uid,pwd);
   url格式:JDBC:子协议:子名称//主机名:端口/数据库名?key=value&…
       例如:jdbc:mysql://localhost:8086/jdbc;uid和pwd也可以用key=value的方式告诉数据库。
            其它参数:如,userUnicode=true&characterEncoding=gbk
  3. 创建执行sql语句的对象
   这里有两个对象可以使用:Statement、PreparedStatement对象
   一般来说有参数的sql操作都用PreparedStatement对象,因为它有防止sql注入等优点。两者的区别这里不多介绍,创建语句:(假设conn为数据库连接对象)
   Statement st=conn.createStatement();
   PreparedStatement ps=conn.prepareStatement(strSql);
   可以看出在创建PreparedStatement对象时即需要指明要执行的sql语句,因为它会对sql语句进行预处理,例如进行一些防止sql注入的字符过滤等;而Statement则在执行sql动作时才指明sql语句。
  4. 执行语句(CURD)
   查询:st.executeQuery(strSql);或者ps. executeQuery();
   非查询(增、删、改):st.executeUpdate(strSql);或ps.executeUpdate();
  5. 处理执行结果
   查询:返回值用ResultSet接收,例:ResultSet rs=st.executeQuery(strsql)
   非查询(增、删、改):返回值为int
  6. 释放资源
   依次释放ResultSet、Statement(或PreparedStatement)、Connection对象,释放顺序与创建顺序相反(类似“栈”结构)
   注意,Connection是非常稀有的资源,用完必须马上释放,它的使用原则是尽量晚的创建,尽量早的释放,以减少占用资源的时间

JDBC 访问DB的体系结构分为两类
   1)2层:客户-数据库
   2)3层:客户-中间层(WebLogicServer)-数据库

使用3层的JDBC体系结构访问数据,首先要安装WebLogicServer,然后在它上面配置一个连接池(Connection Pool)和一个数据源(Data Source)

浅析Statement、PreparedStatement、CallableStatement

Statement

Statement 对象用于执行不带参数的简单 SQL 语句

Statement每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.但存在sql注入风险

PreparedStatement:

该 PreparedStatement接口继承Statement

PreparedStatement 对象用于执行带或不带参数的预编译 SQL 语句

PreparedStatement是预编译执行的。在执行可变参数的一条SQL时,PreparedStatement要比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率高。安全性更好,有效防止SQL注入的问题。对于多次重复执行的语句,使用PreparedStatement效率会更高一点。执行SQL语句是可以带参数的,并支持批量执行SQL。由于采用了Cache机制,则预编译的语句,就会放在Cache中,下次执行相同的SQL语句时,则可以直接从Cache中取出来。

CallableStatement:

该CallableStatement接口继承PreparedStatement

CallableStatement 对象用于执行对数据库已存储过程的调用

最新文章

  1. ios 快速审核
  2. 面向对象Part4
  3. Xcode使错误停在出错代码上
  4. C++中指针常量和常量指针的区别
  5. 配置Git Extension免密码发布代码到CSDN
  6. GEOS库 介绍 (转)
  7. POJ 3045
  8. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(7)
  9. bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
  10. 在CAD中怎么画圆形视口的详细说明
  11. 【JS模式】单体模式
  12. Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯
  13. Vue单页面骨架屏实践
  14. Why Helm? - 每天5分钟玩转 Docker 容器技术(160)
  15. TVTK库的安装
  16. 利用QPainter绘制散点图
  17. YAML的使用
  18. HOJ 2226&POJ2688 Cleaning Robot(BFS+TSP(状态压缩DP))
  19. linux第五周
  20. Java项目的结构

热门文章

  1. 异步编程的类型系统:promise & future & closure & observable----异步编程类型的结构和操作
  2. Markdown温故知新(3):六个实用扩展语法
  3. because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checkin
  4. 基于vue+springboot+docker网站搭建【四】安装nginx
  5. MySql数据库 timeout超时报警的解决方法
  6. 206--Reverse A Singly Linked List
  7. AB PLC简述
  8. ACM模板(转载)
  9. MATLAB之心形图绘制
  10. udp,select超时和recvfrom收不到数据原因