zoukankan      html  css  js  c++  java
  • JDBC知识点笔记

    1:编程步骤

    2:CallableStatement


    2011
    1023

    22:49

    就是用来调用数据库里面的存储过程。

    计算机生成了可选文字: pu七11〔,tatl。,old扣alnlstrlngl]arq,)thr川口.匕xceptlon《
Cl",.for扮己面旧咤”oracle。〕dbc.dr立v它r.沉acleDriver,】浮
Connec吧10nConn一Drlver万ano口er。口e七C。。抢ec七2001一」dbc:O【acle
cst,t=co助.preparecall(工(calip(,,,,
:仁hln:0192.168.0.1:1521:3XT一,,一,cott","'lger一);
2,,,)'.);
c曰L助t·regl,teroutp已r扫以。e仁er13,r夕pes。王扮全盆乙万只):
c昌七功七·reql,teroutpar七u.e七er‘弓,伪p已,,Z扮空刃乙E只)二
c,t加t.,e七Int11,3lJ
cst功t·SetInt12,今)言
cst功亡.3e七Int(4,5,:
c,七功t·executel)牛
sy,七e.。0.七。printlolc,t加t.Oe匕Ln七(3),浮
syste功·Out·prlnLin(c,〔m〔·geclnt(4)】;
c,t功亡·close《):
conn。clo,el!二

    registerOutParameter表明输出参数,指定类型以及第几个?号。

    三 批处理 Batch

    四 Transaction


    2011
    1023

    22:54

    要么同时完成,要么同时不完成。

    首先把setAutoCommitfalse),这样就不自动提交了。

    最后执行commit()

    然后setAutoCommittrue

    上面都是从conn调用的。

    计算机生成了可选文字: .'..、矛...二,..曰..,.碑、
conn一DrIverH。皿aer.口.七CO朋ec七J如(一jdbc:oracle:thin:e127.0.0.1:1521:S嚣T,,",co七t'.,.七iaer");
口月.刀啥..J啥..口
口曰-
。onn.aet几utoCa比.1七(tal.el浮
,t功t.con刀.creates亡ateoen七IIJ
,t.t二ddBotch(一in,ertin七adeptZvalue,151,
,t加t,addDa七Ch(.In,ert10tadep七2value,(52,
st加t.曰ddsa仁ch(.InsertintodeptZvalue,153,
,t功t·executeBatc五():
conn·co".!i七哎);
conn.,etAu仁OCO。如It《true)牛
,。atctt(ClassNotround!xceptiane)屯
e.prl公ts七ackTrace():
》〔atch:SOL艺xceptione加峨
500',
5D0',
SDO',
h性ha')
h台h日’)
h已ha’卜
e。prlntstackTrace()二
try
(
It(conn
{
一。山)I
CDnn.
COnn.
rollback《》二
,et么utoCO州.it(true):
乡〔孟toh(SQLExCep仁lonell《
el.printst性ckTrac已峨)姿
)
含ttna」Jy《
try毛
j丈(,t功t'.null)
,t扣t.clo,e心);
It【COnnl'nul」)
COnn·close():
含c.tch〔SQLExcep七:one)(
e。print5L0ckTrace(,不
}

    五 处理可移动的结果集

    六 存储访问大段文本数据

    varchar最大255个。

    如果非常大的,那么可以用TEXT类型。

    计算机生成了可选文字: stotlcvoldcreate()throwsSQLExcep廿on,IOExcep廿on{
Connectionconn=null:
prepa陀ds比tementps,null:
Resultsetrs=null;
try{
/l2.建立连接
conn=JdbcUtils.ge瓦加nnec口沙n():
/lconn=JdbcUtilssing.getlnstance().getConnection():
/I3.创建语句
Stringsql=''insertin比clob_tes试big_text)values(?)'':
ps=conn.preparestatemen议sql):
Filefile=newFile("srclc可itcas切dbcljdbcUtilsjava''):
Readerreader=newBufferedReade城newFileReader(file)):
ps.SetCharacterst阳am(1,reader,(int)file.length()):
/l4.执行语句
Inti=pg.executeUpdate(sql〕;
reader.Close();
System.ou亡println("i="+i):
1finolly{
JdbcUdls.刀苍峨rs,ps,conn):
}

    reader是访问字符流的,stream是访问字节流的。

    上面这种方式可以把文件放到数据库里面去。

    当然,应该还把reader.close()。

    然后从数据库里面读出来,写到根目录下的文件中去。

    计算机生成了可选文字: 112.建立连接
conn==JdbcU匕ls.ge瓦为nnec沈减);
11conn=JdbcUhlssing.getlnstance().getConnec匕on():
113.创建语句
st=conn.creates比tement():
114.执行语句
rs=st·execut8Query(''selectbig_text斤omclob_test"):
115.处理结果
Whlle(佑.nex议))Tl
Clobclob=咫.getClob(1):
Readerreader==clob.getCharacterstream();
11reader一rs.口e七Characte6七ream(1);
Filefile==newFile('JdbUtils_bak.java"):
Writorwriter二newBufferedwrite城newFilewrite城file)):
chor【」buff=newch。叮1024」:
for(Inti=0:(i=reader.read(bum)>0:){
wri七er.write(bu民0,i):
)
writer.close();
reader.close();
}l
)finally{
JdbcUtils.刀苍以rs,st,conn):
)

    七 读取存储其它类型(图片等)


    2011
    1030

    22:32

    想要把图片或者其它存储到数据库里面去。

    把图片放到数据库字段上去,应该怎么做?

    MySQL中字段类型设置为BLOB。在SQL Server中设置为image类型。

    计算机生成了可选文字: stdtlcvoldCreate()throwsSQLExceptlon.IOEXCeptlon{
Connectlonconn=null:
PreparedS怕tementps,null:
Resul6et阳=null:
try{
112.建立连接
conn=JdbcUtils.卯丈口加neC沈州);
11conn=JdbcUtilssing.getlnstance().getConnection():
113.创建语句
Stringsql=',insertintoblob_tes议big_bit)values(?)'':
ps二conn.prepa阳Statement(sql):
Fileflle==newFile('"IMG_0002jpg"):
,"puts,ream'”一”"WB"ffered'npu甲tream,"ewF''e'"putstream'"'",''
ps.setBinarystream〔1,in,(Int)nle.length()):
/lps.setstring(l,入):
114.执行语句
inti==ps.executeUpdate():
in.close():
System.ou亡println("i=''+i):

    就是如此,把reader换成了stream而已。

    当然,数据库的字段的类型也要换

    如何读取?

    计算机生成了可选文字: l,‘。兴E止乙之上吏欠
conn==JdbcUtils.ge瓦bnneC跳以):
11conn=JdbcU七ilssing.getlnstance().getConnection():
113.创建语句
st=COnn.CFeatestatement():
114.执行语句
rs,st.executeQue以”selectbig_bit斤omblob--test,'):
115.处理结果
Whlle(咫.next()){
11Blobblob=伟.getBlob(1):
11Inputstreamin=blob.getBinarystream():
Inpu巧treamin=阳.getBinarystream(1);
Filefile=newFile(''IMG_0002_bakjpg''):
Qutputstreamout=newBu代息阳dou中u污tream(newFileoutputstream(file)):
byte【】bu比=newb叭e【1024】:
for(Inti=0:(i=in.陀ad(bu团)
out.Write(buff,0.1);
}
out.close():
in.close();
}
)findlly{
JdbcUtils.刀苍以rs.st,conn):
>0:){
I

    要想要把文件展示出来,肯定要找到放在那里去,就是File那一行的目的。






    例如:布尔型?

    如果没有碰到的类型,去看

    计算机生成了可选文字: 妇C,ec介。,,
压.M声QLconne。。月。日c
二.M声QLconrect。用ET
,.M声QL功、ds,司。。l叼。
丁妇M声QLCOnnect。/J
*.c,.ct。,Jvo.、
田.c,,。。/JIn。。葫,
月C,,ct。/JE.m内:
二妇C,、c。。,JpD日cjRefe,e、e
目D『.v./D麟.ou『ceC知:Na侧URLS,咐二
习Josc阴Im灿哪Ienla腼N,,
月Java.JDBC.dM,SOLTJ,e,
习U:。。Cha,川e,Set:,du,o由
月COnrecti闪Se。,e吵U:hgSSL
荀U:叭aM韶tel巧妇馆Re比cat幻n洲thR即I‘从Ic
习M却pngM户日L匕rlolNun.Der'to》议L,砚峨es
压.c,.ct。/JN以。。闭T.讲
王嗯c,,ct。,Js印俐.
+.州声QLConred.泪刚
幻C的宁健兄101尸HP

    mysql中的文档去找,Java中有一个Types类型和数据库中的类型或许并不一样。

    计算机生成了可选文字: MySQLTypestaJavaTyPesforResultsetgetobjecto.
MySQLTypeNam.
R.tUrnValUeof
GetCol】.IU、ClasgN司mP
RetUmed盆马J盆Y盆C!盆马马
BIT(1》吸new旧My5QL-50)
"iT(>11(n已四InMySQL-
5.D)
TINYINT
BIT
毖口皿选盆皿民口入
BIT
bytel]
TINYINT
B00LBO〕LEA劲
5别成LLIUT
祠EDll」洲INT[(胭)]
柯EDll」训INT
[UN51GNEDI
[甘扮SIGNED]
!1a'a.ian。.。。。ie.计thecon行aurationarooe内t
】〕a,a·lan叮·几nte叮.r'I'IUL
{SeeTi,丫i,T,aboveas,esearea.'asesforT工,:
}java.ian,.tnte,e二(re。ard.ess.fu闪s.oN000r.
}…j。:二于aZt,一‘n,·,一‘UNS,G咋电:伙1·:·L·

    第一行,如果数据库里面的类型是1位的bit类型,就对应着Java中的boolean类型。

    八 注意点

    计算机生成了可选文字: /l4.执行语句
rs=st.executeQue以’"selectbig_bit斤omblob_test,'):
115.处理结果工
while(rs.nex议)){
/lBlobblob=rs.getBlob(1):
11IflDUtS比eamifl=blob.QetBinarVStream(卜
Inpu伪〔reamIn,咫.ge〔匕Inaryb了eam叹11);

    里面的参数名字,指的是从数据库里面查出来的第一列。

    ResultSet这种类型的数据是不能够返回的,因为一旦conn这个链接,相当于桥关闭了,货物是无法取得的。

    九 DAO

    DAO

    20111031

    22:14

    计算机生成了可选文字: 表示层
二
二
二
二
},.基于~的JsP、S"et、struts、Webwork、}
二
二
}sPring~MVC等;{
二
二
}2.基于富客户端的S前lg、S孵等(',ii叩):}
用接口隔离,用Domain或DTO传递数据
.---一~~~~~一
业务逻辑层
Pojo(s日Mce,Man嗯er)、Domain、S,SSionEJB、
:Spnng
用接口隔离,用DOmain或D却传递数据
数据访问层
用BC、LBatis、Hibernate、JDO、助tityBean
...............……

    Domain指的是领域对象。

    DAO就是数据访问对象的缩写,如果有一个类user,属性有名字年龄等等,一个接口userDao

    计算机生成了可选文字: publicInterfdceUserDao{
publicvoidaddUse以Useruser):
publicUsergetUse城intuserld):
publlcUsernndUser(StringloginName,Stringpassword):
publlcvoldupdate(Useruser):
publicvoiddelete(Useruser):!
}

    计算机生成了可选文字: publlcclossUserDaojdbclrnplilnplementsUserDao{
publicvoidaddUse城Useruser){
Connectionconn=null:
PreparedS怕tementps=null;
Resul6et阳=null;
try{
conn=JdbcUtils.夕曰瓦力刀nectj'O以):
号tri",sql="inser住)n钾“se以”a少e,bi比hday,money)val"es(?,?·?)",
IDS=Coflfl.pfepan3b〔a〔sm6fltlsql):
ps.setstring(1,user.getName());
ps.setDate(2,newjava.sql.Date(user.getBirthday().getTime())):
ps.setFloa找3,user.getMone州):
ps.executeUpdate():
}cdtch(SQLExceptione){
/l
)findlly{
JdbcU廿15.刀苍以rs,ps,conn):
}

    计算机生成了可选文字: 曰母
回
cn.健c书t.,d比.dao
国useroao.!ava
cn.权a5七.jd比.dao.盯.!
涵u,roaoJ由d喇.,ava
cn.权书t.jd比.damain
国u,r.lava
份田申困
日曰

    计算机生成了可选文字: publicvoidupdate(Useruser){
Connectionconn=null:
PreparedS怕tementps=null:
ReSUI匕6t咫=null:
try{
conn=JdbcUtils.夕日瓦加刀nect1'O以):
Stringsql=.'updateusersetname==?,birthday=?,money=?whereid=?":
ps=Conn.preparestatement(sql):
ps.sets川ng(1.user.getName()):
ps.setDate(2,newjaVa.sql.Date(user.getsirthday().getTime())):
ps.setFloat(3,user.getMoney()):
ps.setln以4,user·getld()):I

    看来对于PreparedStatement的应用就在于?上面,可以自己设定不同的值。



    DAO工厂模式

    20111031

    22:46

    可以建立配置文件,xml或者properties

    计算机生成了可选文字: e互由少训g改es世ch臼01叹t旦卿竺加d侧叫p
比,。」争
台pac'aae〔x口“er跳
,O,乌,
伪J比ne刀曦
甸!曰每}
!古甲份,]西白甲」勿,剔
。口!l因cRuo,"val因userjava
,令中,
画石面.,v。下万姗Dao*ImP…
国u,'er,c二”va
弓知
叫「瓦*rD而面舫s一cn.而乱:刁d比.力刃而I:.1.T--TsorD。妙北l而示11
爪田困田田国图国国田田田图田回田国口
成兰日J···‘·;:l二图日·曰曰
自以l改―一
曰
Cn.袱a5七.
B白弓e.
】d比
抽va
BlobTes七.java
C沁bT"t.java
CRIJO·】创a
D改eTe喊.沁va
J由CU匕Is.java
因J由cUOI巧卜g·jeVa
国SQLIn,Ct·”va
cn.itc书t.jd比.dao
cn.耽公t.ld比.dao.团币!
国国国团国国国国
国u.心aol山cl喇.java
cn.收c书t.jd比.domain
国use卜
Cn.袱己弓t.
;eva
jd比.哭盯代e
{J{Userser训ce.协va
d袱山向.pro口,t活s

    新建文件,命名,然后后缀改成properties就可以了。文件里面存储的键值对,读取的时候就是根据键读。

    计算机生成了可选文字: 万
publlc
classUserDaoTest{
尸木
木@pdrdllla叮s
灯
publlcstatlcvoldmain(Strinq[]args){l
团窦翔亚显userDao=DaoFacto斗.卯如s妇n州).oetUserDao():
Useruser=newUse城):
user.setBi比hday(newDate()):
user.setName('"daonamel"):
uSer.setMoney(1000.0幻;

    这样的话,就跟接口具体的实现没关系了。

    计算机生成了可选文字: publicclassDaoFactory{
prl拍testotlcDaoFactoryjns怕nce=newDaoFactory():
prl姐饶stotlcUserDaou,胃艺冶。=null:
privateDaoFactory(){
try{
prope由esprop=newProperties():
Inputstreaminstream=newFilelnputstream(newFile(
''srcldaoconng.properties'')):
prop.load(inst陀am):
Stringuse由aoClass=prop.getproperty(''userDaoClass"):
Classclazz=Class.勿汀归功试userDaoClass):
use.吸卯=(UserDao)clazz.neWInstanCe():
System.ou亡println(u犯以照幼:
}cotch(Throwablee){
thrownewExceptionlnlnitializerError(e):
}
}

    这样的话,会报空指针异常,因为userDao这个应该在instance前面定义。

    计算机生成了可选文字: publicclassDaoFactory{
pri拍testdticUserDaou决万刃ao=null:
prl拍testotlcDaoFacto即勿s白nce=newDaoFactory():
1
privdteDaoFacto以){
try{
propertiesprop==newProperties():
Inputstreaminstream=newFilelnputst阳am(newFile(
'srcldaoconng.properties')):
prop.load(instream):
StringuserDaoClass=prop.getProper以”userDaoClass');
Classclazz=Class.左万叭白勿试userDaoClass):
use厂oao=(UserDao)clazz.newlnstance();
Sys帕m.ou亡println(u夕e厂oao):
)cotch(Throwablee){
thrownewExceptionlnlnitializerError(e):
}
)
publicstaticDaoFactorygotlngtance(){
FetllFll加夕扫刀乙e

    这个下面还有一个getUserDao的方法,这样的话,修改配置文件就可以了。

    10:数据库元数据

    11DBCP

    计算机生成了可选文字: 。c肋geExplorer跳0叫IneJUnit
。口11国日ase.]aval勿Jdbcu如15.]a、,l国Myconne由on.]aval国MYoatasource2.]aval国峋。atasource.]ava
db。‘On"g·p『。per,二白巨
妙Jdbc
习产src
国份cn.比cast.jdb:
困毋cn.比cast.Jdbc.daO
田班cn.比cast.Jdbc.dao.Impl
日由cn.ltcast.Jdbc,datasource
图国MyConne比on.Java
田国M丫conneoonHandlor.Ja,'a
困国晰oatasource·Ja、,
国国脚DataSOUrceZ·JaVa
田毋cn.比cast.Jdbc·doma'n
田母cn.比.St.]dbc.semce
一国daoconflg.prope由es
’图dbCPcon6g.propertleS
日公JRESv雍mUbra印[Jdkl.5.0_12]
日口眺肋ferencedLjbraries
圆训‘一002_bak·jpg
国训G一O02.Jpg
里一团Jdbuols--bak.Ja、,a
浮te演
1#连接设置
ZdriverClassNall,e=colll.Illysql.jdbc.Driver
3tu.l=jdbc:n、ysql://localhost:3306/test
4tlserllanle=root
spass、vord=邑团I
6
7#<!一初始化连接一>
6illitialsize=10
9
10#最大连接数量
111lla为入ctive=50
12
13#<!一最大空闲连接~>
141llaXldie=20
15
16#<!一最小空闲连接~>
1了11飞illldle=5
18
19#<!一超时等待时间以毫秒为单位6000毫秒/1000等于60秒->
护罗xwa"=6。”""

    现在开源的DBCP用的比较多,在properties配置文件里可以这么配置。

    计算机生成了可选文字: static{
try{
Class.勿才叭勺me("conl.1llysql.jdbc.Driver");
llmy
t8S0ll1'Ce
=newMyDatasourceZ();
Pr
ope
esprop=,iewProperties();
11prop.setProperty("driverClassNanle'","colll.n飞ysql.jdbc.Driver"');
11prop.setProperty("'user","user"');
11、pt,tstreall、15=JdbcUtils.cl。、s.getClassLoader()
.getReso:lrceAsstrealll('"dbcpcol、fig.properties");
prop.load(15);
刀移健劝taSOur℃e=BasicDatasotlrceFactory.‘厂已ateL冶taSOu,℃以prop);
}catcli(Exceptiol、e){
thro、fne、下ExceptionlnlnitializerError(e);
}
}

    把配置文件load进去,然后可以使用。

  • 相关阅读:
    Ionic2开发环境搭建
    关于在浏览器中测试cordova plugin的注意事项。
    像azure一样桌面显示Windows系统信息
    吐槽下微软
    Hyper-v UBUNTU 12.04 模板设置
    MongoDB整库备份与还原以及单个collection备份、恢复方法
    nginx 配置
    vsftpd配置文件详解
    分享几个免费IP地址查询接口(API)
    黑客帝国效果
  • 原文地址:https://www.cnblogs.com/allenzhaox/p/3201808.html
Copyright © 2011-2022 走看看