一.相关概念介绍

  1.1.数据库驱动

  这里驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商对JDBC接口的实现,即对Connection,ResultSet,Statement等接口的实现类的jar文件。如下所示:

  

  1.2.JDBC介绍

  SUN公司为了简化,统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库。如下图所示:

  

  JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成。组成JDBC的2个包:java.sql(如Connection,ResultSet,Statement);javax.sql,这两个包是由JDK提供的。

  开发JDBC应用需要以上两个包的支持以外,还需要导入JDBC的数据库实现(即数据库驱动,这个主要是由数据库厂商提供和开发的),如sqljdbc4-4.0.jar;mysql-connector-java-5.0.8-bin.jar等。

二.常用接口

  2.1.Driver接口

  Driver接口由JDBC提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的数据库驱动,因此装载方法也会有所不同。如:

  装载mysql驱动:Class.forName("com.mysql.jdbc.Driver");

  装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

  装载sqlserver驱动:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

  总结:此接口我们一般不使用,都是不通的厂商驱动实现类去实现JDK的java.sql包中的Driver接口。下面以mysql的驱动类:com.mysql.jdbc.Driver来看一下源码:

  

  从这里可以看出,mysql的驱动类Driver实现了JDBC定义的接口Driver。然后静态代码块中将此驱动注册到DriverManager类中。后面会详细聊一下这部分。

  2.2.Connection接口

  Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。

  连接mysql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");

  连接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

  连接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

  常用方法:

  createStatement():创建向数据库发送sql的statement。

  如:Connection conn = DriverManager.getConnection(url,user,password);

    Statement stmt = conn.createStatement();

    ResultSet rs = stmt.executeQuery(sql);

  prepareStatement(sql):创建向数据库发送预编译sql的prepareStatement对象。

  如:String sql = "insert into user(name,pwd) values(?,?);

    Connection conn = DriverManager.getConnection(url,user,password);

    PrepareStatement ps = conn.prepareStatement(sql);

    ps.setString(1,"tom");

    ps.setString(2,"123456");

    ResultSet rs = ps.executeQuery();

  prepareCall(sql):创建执行存储过程的callableStatement对象。

  如:String execSql = "call SMSP_ListDevices(?,#PageIndex#,1000,'',0,'{#key#}')"

    Connection conn = DriverManager.getConnection(url,user,password);

    CallableStatement call = conn.prepareCall("{"+execSql+"}",ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

    call.registerOutParameter(outParamName,Types.BIGINT);

    ResultSet rs = call.execute();

  setAutoCommit(boolean autoCommit):设置事务是否自动提交

  commit():在连接上提交事务。

  rollback():在连接上回滚事务。

  2.3.Statement接口

  用于执行静态sql语句并返回它所生成结果的对象。

  三种Statement类型的接口

  Statement:由conn.createStatement()创建,用于发送简单的SQL语句(不带参数)。

  PrepareStatement:继承自Statement接口,由conn.prepareStatement()创建,用于发送含有一个或多个参数的SQL语句。PrepareStatement对象比Statement对象的效率更高,并且可以防止SQL中注入,所以我们一般使      PrepareStatement。

  CallableStatement:继承自PrepareStatement接口,由conn.prepareCall()创建,用于调用存储过程。

  Statement常用的方法:

  execute(String sql):运行语句,返回是否有结果集。

  executeQuery(String sql):运行select语句,返回RequestSet结果集。

  executeUpdate(String sql):运行insert/update./delete操作,返回影响的行数。

  addBatch(String sql):把多条sql语句放到一个批处理中。

  2.4.ResultSet接口

  ResultSet提供检索不同类型字段的方法,常用的有:

  getString(int index),getString(String columnName):获得在数据库里varchar,char等类型的数据对象。

  getFloat(int index),getFloat(String columnName):获得在数据库里Float类型的数据对象。

  getDate(int index),getDate(String columnName):获得在数据库里Date类型的数据。

  getBoolean(int index),getBoolean(String columnName):获得在数据库里Boolean类型的数据。

  getObject(int index),getObject(String columnName):获得数据库里任意类型的数据。

  ResultSet还提供了对结果集进行滚动的方法:

  next():移动到下一行。

  previous():移动到前一行。

  absolute(int row):移动到指定行。

  beforeFirst():移动到ResultSet的最前面。

  afterLast():移动到ResultSet的最后面。

  使用后依次关闭的对象及连接是:ResultSet->Statement->Connection。(实际中跟申明的顺序相反)

三.使用JDBC的步骤

  加载JDBC驱动程序→建立数据库连接Connection→创建执行SQl的语句Statement→处理执行结果Result→释放资源。

  3.1.注册驱动(只做一次)

  方式一:Class.forName("com.mysql.jdbc.Driver");

  推荐使用这种方式,不会对具体的驱动类产生依赖。

  方式二:DriverMaager.registerDriver("com.mysql.jdbc.Driver");

  会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

  3.2.建立连接

  Connection conn = DriverManager.getConnection(url,user,password);

  url用于标识数据库的位置,通过url地址告诉JDBC连接的是哪个数据库,url写法:

  

  其他参数如:useUnicode=true&characterEncoding=utf8等。

  3.3.创建执行SQL语句的Statement

  

  存在sql注入的危险,如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录。那么建议用下面这种写法较合适:

  

  PreparedStatement有效的防止sql注入(SQl语句在程序运行前已经进行了预编译,当运行时动态的把参数传给PreparedStatement时,及时参数里有敏感字符如:“or 1=1”,数据库也会作为一个字段的属性值来处理而不会作为一个SQL指令)

  3.4.处理执行结果

  ResultSet rs = ps.executeQuery();

  while(rs.next()){

    rs.getString("col_name");

    rs.getInt(1);

    //...

  }

  3.5.释放资源

  

四.事物(ACID特点,隔离级别,提交commit,回滚rollback)

  3.1.事物的基本概念

  一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。

  事物开始于:连接到数据库上,并执行一条DML语句(INSERT,DELETE或UPDATE)。前一个事物结束后,又输入了另外一条DML语句。

  事务结束于:

  执行commit或rollback语句。

  执行一条DDL语句(data definition language:主要的命令有CREATE、ALTER、DROP等),例如CREATE TABLE语句;在这种情况下,会自动执行commit语句。

  执行一条DCL语句(Data Control Language:是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句),例如GRANT语句;在这种情况下,会自动执行commit语句。

  断开与数据库的连接。

  执行一条DML(data manipulation language:它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。)语句,该语句失败了;在这种情况下,会为这个无效的DML语句执行      rollback语句。

  3.2.事务的四大特点(ACID)

  ✔atomicity(原子性)

  表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。

  ✔consistency(一致性)

  表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态。

  ✔isolation(隔离性)

  事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是修改它之后的状态,事务不会查看中间状态的数据。

  ✔durability(持久性)

  持久性事务完成之后,他对系统的影响是永久性的。

  3.3.事务的隔离级别

  ✔读取未提交

  ✔读取已提交

  ✔可重复读

  ✔序列化

  关于JDBC的的一些实战例子,我将放在JDBC详解(二)http://www.cnblogs.com/vanl/p/7495864.html里面来描述。

JDBC详解(一)的更多相关文章

  1. Spring4 JDBC详解

    Spring4 JDBC详解 在之前的Spring4 IOC详解 的文章中,并没有介绍使用外部属性的知识点.现在利用配置c3p0连接池的契机来一起学习.本章内容主要有两个部分:配置c3p0(重点)和 ...

  2. JDBC详解系列(二)之加载驱动

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)---   在JDBC详解系列(一)之流程中 ...

  3. JDBC详解系列(三)之建立连接(DriverManager.getConnection)

      在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...

  4. Java基础-面向接口编程-JDBC详解

    Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...

  5. JDBC详解1

    JDBC详解1 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中u ...

  6. JDBC详解系列(一)之流程

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- JDBC概述   使用JDBC也挺长 ...

  7. jdbc详解(一)

    JDBC简介 l 数据库驱动 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC l JDBC 全称为: Java Data Base Connectivity ...

  8. JDBC 详解

    工作原理流程:装载驱动程序---->获得数据库连接---->使用Statement或PreparedStatement执行SQL语句----> 返回执行的结果---->关闭相关 ...

  9. JDBC 详解(转载)

    原文链接:http://blog.csdn.net/cai_xingyun/article/details/41482835 什么是JDBC? Java语言访问数据库的一种规范,是一套API JDBC ...

随机推荐

  1. webpack开发和生产两个环境的配置详解

    一开始在接触webpack 的时候,简直痛不欲生,现在回头看,做个注释,当然参考了很多文章.这是一个关于vue 开发的webpack 架构会列举出来webpack 系列教程Webpack——令人困惑的 ...

  2. iOS中使用RNCryptor对资源文件加密(先加密后拖进项目中)

    概述:IPA 在发布时,业务相关的敏感资源文件以明文的形式存储,由于没有加密保护,这些文件在应用发布后 可能被其他人获取,并结合其他漏洞和手段产生真实攻击.所以我们要 1.在设计.开发阶段,集合业务确 ...

  3. Git基础级介绍

    这篇随笔是在学习了廖雪峰老师的git教程之后写的总结,要看详细的基础级git介绍可以去http://www.liaoxuefeng.com/wiki/0013739516305929606dd1836 ...

  4. Task 6.3 冲刺Two之站立会议1

    今天是二次冲刺的第一天,由于第一阶段已经大概完成了软件的主体功能和框架,我主要看了一下同学们提出的视频和音质的问题,想办法做出了相应的改善.另外我们的功能还是比较单一的,要对主界面进行一定的扩充,所以 ...

  5. 《 Spring1之第二次站立会议(重发)》

    < 第二次站立会议(重发)> 昨天,我把找到的代码和协议资料等相关资料在团队里做了相应的汇报: 今天,我对自己找到的代码进行了相关的了解后,把它们在编译环境中进行了编译以及接着对代码进行逐 ...

  6. C#和.net框架

    第一章C#和.net框架 c#只是.net的一部分,.net不只包含C#.C#是一种程序语言,.net是一个框架/平台 C#和.NET框架 在.NET之前 20世纪90年代,微软平台多数程序员使用VB ...

  7. 第一次spring冲刺第5天

    今天进行讨论基础功能的核心代码方面,还有简单的讨论继续关于界面的美化, 计算生成的答案功能 public class Core {// char[]h={'+','-','*','/'};int re ...

  8. js数组遍历 千万不要使用for...in...

    昨天做个下拉框 扩充了一下数组的方法 Array.prototype.remove = function (val) { var index = this.indexOf(val); if (inde ...

  9. 用css 修改 谷歌浏览器自带的 滚动条样式

    ::-webkit-scrollbar { width: 0.5rem;}/* Track */ ::-webkit-scrollbar-track { -webkit-box-shadow: ins ...

  10. node path模块

    一.在nodejs中path模块时使用频率很高的模块,其中不乏有很多API写得很模糊,但仔细琢磨下来,也不是很难理解. 1.获取文件所在路径 var path = require('path'); v ...