漫谈jdbc
本文可作为北京尚学堂jdbc课程的学习笔记; 简介 jdbc是什么东西? jdbc全称(Java Database Connectivity java数据库连接) 它是干什么的? 至于它是干什么的,那就应了那句老话了,说来话长.. 很久很久之前,作为用户,我们有c,c ,java...各种语言,另一方面数据库领
本文可作为北京尚学堂jdbc课程的学习笔记;简介
jdbc是什么东西?jdbc全称(Java Database Connectivity java数据库连接)
它是干什么的?
至于它是干什么的,那就应了那句老话了,说来话长..
很久很久之前,作为用户,我们有c,c ,java...各种语言,另一方面数据库领域Oracle,Mysql,DB2,SQLServer也是种类繁多。
为了方便我们用户的使用各大数据库厂商就就建立了自己的API,如下图

看上去还不错哦。
后来,我们还是觉得麻烦,虽然各个厂商有自己的API,但我Oracle和Myaql毕竟不一样呀!作为客户的我们,并不想学习那么多的API,怎么办?
再加一层呗!

至于odbc是微软出的一套东西,干的事情和jdbc一样,就是屏蔽各个数据库的不同!
看上面的图大家就应该明白,各个数据库厂商会开发自己的jdbc jar包。
至此,我们就不需要管各个数据库的差异问题了。(当然,各个数据库的sql语法还有些微的不同,再后来Hibernate出现了,这里我们先不谈)
我们只用了解一个统一的接口,就能方便的使用各个数据库。

编程步骤
LoadDriver
Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver").newInstance(); new com.mysql.jdbc.Driver();
我们看这个例子
package load; public class LoadTest { public static void main(String[] args) { try { Class.forName("load.Loaded"); System.out.println("*******"); Class.forName("load.Loaded").newInstance(); System.out.println("*****"); new Loaded(); } catch (ClassNotFoundException |IllegalAccessException|InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } package load; public class Loaded { static{ System.out.println("i am static"); } public Loaded(){ System.out.println("i am constructed"); } }
i am static
*******
i am constructed
*****
i am constructed
大家应该明白了
Class.forName("***"); 会加载一个类,返回的结果是Class类型的,在加载过程中,会执行类中的静态语句块;
Class.forName("***").newInstance(); 它其实和new ***()是一样的,当然类只用加载一次,所以上面调用这行代码的时候没有显示i am static
new ***() 这个和上面那个的区别在于,这个方法可以传递参数,构造不同的类,但是上面的newInstance只能构造无参的对象;
在说的通俗一点,jvm要生成一个类
需要两步,加载与实例化!
第一个方式是加载,后面两个既加载,又实例化(当然,如果前面已经加载了,就不用再加载了)
另外,关于这部分源码基本的分析如com.mysql.jdbc.Driver中到底干了什么,我们后面再说,这里就不多讨论了。
获得Connection
DriverManager.getConnection(url,username,password);
三个参数的意思我就不多说了,这里需要我们注意的其实也就一个url,不过大家也不用死记硬背,知道有这么个东西就ok;
获得Statemment;
Statement st=con.creatStatemnent();获得结果集;
首先我们得说明,这里的结果集是用ResultSet来组织的。ResutSet rs=st.executeQuery("select * from admininfo");
遍历结果集:
while (rs.next()) {System.out.println(rs.getString("Filedname"));
}
这里我得说明一点,即使你想取得数据集中的第一条数据,rs.next()这行也必须有。我们可以理解为,初始情况下resultset内部的"游标"在第一条数据前面,我们得next一下能找到下一条数据!
close
一个原则,后建立的对象先关闭。最基本的jdbc
下面的代码,写的比较全,只有一个要求,背下来!不要说,先看看,以后再说,这是基础!应该全文默写!!
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBC_Test2 { public static void main(String[] args) { Connection conn=null; Statement st=null; ResultSet rs=null; String url="jdbc:mysql://localhost:3306/webexample?useUnicode=true&characterEncoding=UTF-8"; String userName="root"; String passWord=""; try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection(url,userName,passWord); st=conn.createStatement(); rs=st.executeQuery("select * from admininfo"); while (rs.next()) { System.out.println(rs.getString("Aname")); } } catch (ClassNotFoundException e) { e.printStackTrace(); //log4j 具体记录 }catch (SQLException e) { e.printStackTrace(); } finally{ try { if (rs!=null) { rs.close(); rs=null; } if (st!=null) { st.close(); st=null; } if (conn!=null) { conn.close(); conn=null; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
几个知识点
PreparedStatement
其实Statement本身已经够用了,不过有点不方便,哪里不方便?看下面的例子:
我想将一条数据插入到数据库中如下
String name="董磊峰"; int id=16; String sql="insert into admininfo (Aname,Aid) values('"+name+"',"+id+") "; st.executeUpdate(sql);
所以有了PreparedStatement,它也是一个接口,继承自Statement。
其用法为
String name="董磊峰2"; int id=18; String sql="insert into admininfo (Aname,Aid) values(?,?)"; PreparedStatement st=conn.prepareStatement(sql); st.setString(1, name); //给第一个栏位注入String型的数值name 这个不是从0开始 st.setInt(2, id); st.execute();
批处理问题
如果我想执行多条sql语句怎么办?使用Statement
String name="董磊峰2"; int id=154; int id2=487; String sql="insert into admininfo (Aname,Aid) values('"+name+"',"+id+") "; String sql2="insert into admininfo (Aname,Aid) values('"+name+"',"+id2+") "; System.out.println(sql); st=conn.createStatement(); st.executeUpdate(sql); st.executeUpdate(sql2);
String name="董磊峰2"; int id=48; String sql="insert into admininfo (Aname,Aid) values(?,?)"; System.out.println(sql); st=conn.prepareStatement(sql); st.setString(1, name); st.setInt(2, id); st.execute(); st=conn.prepareStatement(sql); st.setString(1, name); st.setInt(2, id+1); st.execute();
看新的方法
使用Statement
st=conn.createStatement(); st.addBatch("insert into admininfo (Aname,Aid) values('"+name+"',"+id+") "); st.addBatch("insert into admininfo (Aname,Aid) values('"+name2+"',"+id2+") "); st.executeBatch();
String sql="insert into admininfo (Aname,Aid) values(?,?)"; System.out.println(sql); st=conn.prepareStatement(sql); st.setString(1, name); st.setInt(2, id); st.addBatch(); st.setString(1, name+"ss"); st.setInt(2, id+15); st.addBatch(); st.executeBatch();
Transaction
Transaction我们一般翻译成会话,就是一个不可分割的多条(或一条)sql语句,在一个Transaction中,这些sql语句要么全部执行成功,要么一个也不执行。它有什么用?还用解释么?想想银行。
在jdbc中,默认一个sql语句就是一个transaction。
看看代码
try{ conn.setAutoCommit(false); st=conn.createStatement(); st.addBatch("insert into admininfo (Aname,Aid) values('"+name+"',"+id+") "); st.addBatch("insert into admininfo (Aname,Aid) values('"+name2+"',"+id2+") "); st.executeBatch(); conn.commit(); conn.setAutoCommit(true); //用完了得改回去 }catch(Exception e){ if(conn!=null){ conn.rollBack(); //sql代码撤销 conn.setAutoCommit(true); //还得改回去 } }
可滚动的结果集
String sql="select * from admininfo order by Aid"; st=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); rs=st.executeQuery(sql); /* admininfo 表内容 * Aid Aname 15 dlf 16 董磊峰 18 董磊峰2 48 董磊峰2 49 董磊峰2 55 董磊峰2 154 董磊峰2 155 董磊峰2 487 董磊峰2 1599 董磊峰2ss 2000 董磊峰2 2015 董磊峰2ss 3000 董磊峰2666 8000 董磊峰2hhhh 10001 wyf 10002 zrk */ rs.absolute(4); System.out.println("第4 "+ rs.getInt("Aid")); System.out.println("第几条 "+ rs.getRow()); rs.first(); System.out.println("第一个 "+ rs.getInt("Aid")); rs.last(); System.out.println("最后一个 "+ rs.getInt("Aid")); System.out.println("总数 "+ rs.getRow()); System.out.println("是否最后一个 "+ rs.isLast()); System.out.println("最后结尾 "+ rs.isAfterLast()); rs.next(); System.out.println("最后结尾 "+ rs.isAfterLast());
第4 48
第几条 4
第一个 15
最后一个 10002
总数 16
是否最后一个 true
最后结尾 false
最后结尾 true
看看这些方法的名字还有结果,大家应该能知道方法的作用,不过isAfterLast方法大家估计有点迷惑。
最后一个的后面?
这个方法是判断当前指针是否已经到文件尾,注意:文件尾和最后一条记录是不同的。
比如我们开始读取 ResultSet 时,指针位于文件头,首先需要 rs.next() 执行这个方法,指针移到第一条记录后才可以进行读取。到文件尾也是一样的,读到最后一条记录后,再继续读就到文件尾了,没有记录了,执行 isAfterLast() 方法就返回 true 了。
参考资料
http://blog.163.com/yutao_inx_319/blog/static/207234007201311177482930/ java,ResultSet 类中的isAfterLast()方法
http://www.cnblogs.com/shosky/archive/2011/07/22/2114290.html 三种类加载方式的区别

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

不再需要pip?快来学习如何有效卸载pip!引言:pip是Python的包管理工具之一,它可以方便地安装、升级和卸载Python包。然而,有时候我们可能需要卸载pip,可能是因为我们希望使用其他的包管理工具,或者因为我们需要完全清除Python环境。本文将介绍如何有效地卸载pip,并提供具体的代码示例。一、卸载pip的方法下面将介绍两种常见的卸载pip的方法

深入学习matplotlib颜色表,需要具体代码示例一、引言matplotlib是一个功能强大的Python绘图库,它提供了丰富的绘图函数和工具,可以用于创建各种类型的图表。而颜色表(colormap)是matplotlib中一个重要的概念,它决定了图表的配色方案。深入学习matplotlib颜色表,将帮助我们更好地掌握matplotlib的绘图功能,使绘

学习C语言的魅力:解锁程序员的潜力随着科技的不断发展,计算机编程已经成为了一个备受关注的领域。在众多编程语言中,C语言一直以来都备受程序员的喜爱。它的简单、高效以及广泛应用的特点,使得学习C语言成为了许多人进入编程领域的第一步。本文将讨论学习C语言的魅力,以及如何通过学习C语言来解锁程序员的潜力。首先,学习C语言的魅力在于其简洁性。相比其他编程语言而言,C语

从零开始学习Pygame:完整的安装和配置教程,需要具体代码示例引言:Pygame是一个使用Python编程语言开发的开源游戏开发库,它提供了丰富的功能和工具,使得开发者可以轻松创建各种类型的游戏。本文将带您从零开始学习Pygame,并提供完整的安装和配置教程,以及具体的代码示例,让您快速入门。第一部分:安装Python和Pygame首先,确保您的计算机上已

在word中编辑文字内容时,有时会需要输入公式符号。有的小伙们不知道在word根号输入的方法,小面就让小编跟小伙伴们一起分享下word根号输入的方法教程。希望对小伙伴们有所帮助。首先,打开电脑上的Word软件,然后打开要编辑的文件,并将光标移动到需要插入根号的位置,参考下方的图片示例。2.选择【插入】,再选择符号里的【公式】。如下方的图片红色圈中部分内容所示:3.接着选择下方的【插入新公式】。如下方的图片红色圈中部分内容所示:4.选择【根式】,再选择合适的根号。如下方的图片红色圈中部分内容所示:

标题:从零开始学习Go语言中的main函数Go语言作为一种简洁、高效的编程语言,备受开发者青睐。在Go语言中,main函数是一个入口函数,每个Go程序都必须包含main函数作为程序的入口点。本文将从零开始介绍如何学习Go语言中的main函数,并提供具体的代码示例。一、首先,我们需要安装Go语言的开发环境。可以前往官方网站(https://golang.org

从零开始学习pip安装,快速掌握技巧,需要具体代码示例概述:pip是Python包管理工具,能够方便地安装、升级和管理Python包。对于Python开发者来说,掌握pip的使用技巧是非常重要的。本文将从零开始介绍pip的安装方法,并给出一些实用的技巧和具体的代码示例,帮助读者快速掌握pip的使用。一、安装pip在使用pip之前,首先需要安装pip。pip的

本站8月23日消息,民航局联合国家发展和改革委员会发布《关于推进国际航空枢纽建设的指导意见》(以下简称《指导意见》)。《指导意见》对国际航空枢纽建设进行了整体谋划,从功能定位、规划建设、协同运行、运输服务等方面加快推进“3+7+N”国际航空枢纽功能体系建设,对国际航空枢纽的功能定位进行了细化和深化。“3”是指北京、上海、广州等国际航空枢纽,三地是我国对外开放的前沿门户,将增强其洲际连接能力和全球辐射能力,远程国际航线原则上合理有序向北京、上海、广州等集中。“7”是指成都、深圳、重庆、昆明、西安、
