漫谈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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









もうpipは必要ありませんか? pip を効果的にアンインストールする方法を学びましょう!はじめに: pip は Python のパッケージ管理ツールの 1 つで、Python パッケージを簡単にインストール、アップグレード、アンインストールできます。ただし、別のパッケージ管理ツールを使用したい場合や、Python 環境を完全にクリアする必要がある場合など、pip をアンインストールする必要がある場合があります。この記事では、pip を効率的にアンインストールする方法を説明し、具体的なコード例を示します。 1. pip をアンインストールする方法 以下では、pip をアンインストールする 2 つの一般的な方法を紹介します。

matplotlib カラー テーブルの詳細については、特定のコード サンプルが必要です 1. はじめに matplotlib は強力な Python 描画ライブラリであり、さまざまな種類のチャートの作成に使用できる豊富な描画関数とツールのセットを提供します。カラーマップ (カラーマップ) は matplotlib の重要な概念であり、チャートの配色を決定します。 matplotlib カラー テーブルを詳しく学ぶことは、matplotlib の描画機能をよりよく習得し、描画をより便利にするのに役立ちます。

C言語学習の魅力:プログラマーの可能性を引き出す テクノロジーの発展に伴い、コンピュータプログラミングは大きな注目を集めている分野です。数あるプログラミング言語の中でもC言語は常にプログラマーに愛されています。そのシンプルさ、効率性、幅広い用途により、C 言語の学習は、多くの人にとってプログラミングの分野に入る最初のステップとなっています。この記事では、C言語を学ぶ魅力と、C言語を学ぶことでプログラマーの可能性を引き出す方法について解説します。 C言語学習の魅力は、まずその簡単さにあります。他のプログラミング言語と比較すると、C言語は

Pygame をゼロから学ぶ: 完全なインストールと構成チュートリアル、特定のコード例が必要 はじめに: Pygame は、Python プログラミング言語を使用して開発されたオープン ソースのゲーム開発ライブラリであり、豊富な機能とツールを提供し、開発者はさまざまなタイプのゲームを簡単に作成できますゲームの。この記事は、Pygame をゼロから学習するのに役立ち、完全なインストールと構成のチュートリアルと、すぐに始めるための具体的なコード例を提供します。パート1:最初にPythonとPygameをインストールして、確認してください

Word でテキスト コンテンツを編集するときに、数式記号の入力が必要になる場合があります。 Word でルート番号を入力する方法を知らない人もいるので、Xiaomian は私に、Word でルート番号を入力する方法のチュートリアルを友達と共有するように頼みました。それが私の友達に役立つことを願っています。まず、コンピュータで Word ソフトウェアを開き、編集するファイルを開き、ルート記号を挿入する必要がある場所にカーソルを移動します。下の図の例を参照してください。 2. [挿入]を選択し、記号内の[数式]を選択します。下の図の赤丸で示すように: 3. 次に、下の[新しい数式を挿入]を選択します。以下の図の赤丸で示すように: 4. [根号式]を選択し、適切な根号を選択します。下の図の赤丸で示したように、

タイトル: Go言語のmain関数をゼロから学ぶ Go言語はシンプルで効率的なプログラミング言語として開発者に好まれています。 Go 言語では、main 関数はエントリ関数であり、すべての Go プログラムにはプログラムのエントリ ポイントとして main 関数が含まれている必要があります。この記事ではGo言語のmain関数をゼロから学ぶ方法と具体的なコード例を紹介します。 1. まず、Go 言語開発環境をインストールする必要があります。公式ウェブサイト (https://golang.org) にアクセスできます。

本ウェブサイトは8月23日、中国民間航空局と国家発展改革委員会が共同で「国際航空ハブの建設促進に関する指導意見」(以下「指導意見」という)を発表したと報じた。 「指導意見」は、国際航空ハブ建設の全体計画を策定し、機能的位置付け、計画と建設、協調運営、輸送サービスの側面から「3+7+N」国際航空ハブ機能システムの構築を加速する。 、など、国際航空ハブの機能を明確に理解することで、ポジショニングが洗練され、深まりました。 「3」は北京、上海、広州などの国際航空ハブを指し、これらの場所は我が国の対外開放のフロンティアゲートウェイであり、原則として大陸間の接続能力と世界的な放射能力を強化します。 -北京、上海、広州などへの長距離国際線を合理的かつ秩序正しく提供します。 「7」は成都、深セン、重慶、昆明、西安、

pip のインストールを最初から学び、すぐにスキルをマスターしてください。特定のコード例が必要です。 概要: pip は、Python パッケージを簡単にインストール、アップグレード、管理できる Python パッケージ管理ツールです。 Python 開発者にとって、pip の使用スキルを習得することは非常に重要です。この記事では、pip のインストール方法を最初から紹介し、読者が pip の使用法をすぐにマスターできるように、いくつかの実践的なヒントと具体的なコード例を示します。 1. pip のインストール pip を使用する前に、まず pip をインストールする必要があります。ピップ
