图书行业

首页 » 常识 » 诊断 » 老师看了直说好MYSQLJDBC
TUhjnbcbe - 2023/3/15 9:18:00
白癜风可以冶的吗 http://pf.39.net/bdfyy/bdflx/190522/7157873.html

两万字,博主辛辛苦苦给大家写的,在这里求个三连~~。

JDBC编程

一、JDBC简介二、准备工作三、JDBC五*神掌.导入驱动包,创建DataBas实例四、加入SQL版的数据库4.系统功能汇总4.数据库准备4.构造和数据库相关的实体类4.4封装数据库的相关操作:封装好和数据库建立链接的操作:封装好针对书籍表的增删查改操作.:新增书籍:.:查看所有书籍:.:根据名字查找书籍.4:删除书籍.:借书.还书:封装好针对用户表的增删查改操作4.Opration操作包4..AddOpration4..BorrowOpration4..DlOpration4..4DisplayOpration4..ExitOpration4..FindOpration4..7IOpration4..8RturnOpration4.Main五、最终效果

一、JDBC简介

即JavaDatabasConnctivity,Java和数据库链接。是一种可以执行SQL语句的API。JDBC是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,因此可以用Java编写不同类型的可执行文件

二、准备工作

工欲善其事必先利其器,在开始MYSQLJDBC编程之前,我们做一些准备工作。

编程语言:Java

数据库:MYSQL

数据库驱动包:不同的数据库需要导不同的数据包,并且数据库的版本也需要和驱动包的版本在大版本下相同,小版本可忽略。例如MYSQL用的.x.x版本的那么对应的驱动包也应该是.x.x。我这里为8.xx版本。这里附上链接。

驱动包下载链接

三、JDBC五*神掌

.导入驱动包,创建DataBas实例

、在项目目录中创建一个包,我这里为JDBCtst,并把下载好的驱动包直接拖动到这个包底下即可。接着点击factor就能在包底下看到自己的驱动包了。接着右键点击当前的包,在底下找到addasalibrary。点击ok。这样就算是导驱动包完成了。新建一个Java.class文件。我这里是JDBC09。在这个文件里先创建出main函数出来。然后开始创建DataSourc实例。同时给这个DataScou设置参数,分别是URL,Usr,Password。这里用了向下转型,把父类实例使用一个子类引用指向。还需要把DataSourc转回成MysqlDatasourc才能设置URL,用户名和密码。

DataScou顾名思义就是描述了数据的来源,当我们根据自己的URL,账户名,和密码创建一个datasourc实例时,就为连接数据库做了一步准备工作。

//、创建DataSourc实例DataSourcdataSourc=nwMysqlDataSourc();((MysqlDataSourc)dataSourc).stUrl("jdbc:mysql://7.0.0.:0/java_00?charactrEncoding=utf8usSSL=fals");((MysqlDataSourc)dataSourc).stUsr("root");((MysqlDataSourc)dataSourc).stPassword("");

那问题来了,向下转型这么麻烦,那不转型行不行?答案是完全可以的!但是如果直接写成不写转型的场景,这时如果要更换数据库的话,代码的改动就是非常大的。

、和数据库建立连接。

//、和数据库建立连接Connctionconnction=dataSourc.gtConnction();

、构造SQL语句在JDBC中SQL是一个字符串,要想让数据库识别并执行SQL语句,还需要把这个字符串类型的SQL转成PpaStatmnt对象。这个ppastatmnt对象可以帮我们动态的构造出SQL同时也能进行一些检查。这里我的sql语句为查询学生表的所有信息。

//、构造SQLStringsql="slct*fromstudnt";PpadStatmntstatmnt=connction.ppaStatmnt(sql);

4、执行SQL语句statmnt提供了两个系列的xcut,一个是xcutUpdat,它用来进行增加、删除、修改。返回int表示能影响到多少行。另一个是xcutQury。用于进行查找,我这里是查找,所以用的是Qury。查找还需要一个结果集合sultSt。返回一个结果集,相当一个表格。

//4、执行SQLRsultStsultSt=statmnt.xcutQury();

//遍历结果集合//先取出结果中的每一行,再取出每一行中需要列即可。//这个遍历的代码很像迭代器whil(sultSt.nxt()){intid=sultSt.gtInt("id");Stringnam=sultSt.gtString("nam");Systm.out.println(id+"\t"+nam);}

、释放相关资源

哪些是相关资源?为什么要释放他们?释放资源的时候需要注意什么?相关资源都包含了connction、statmnt、sultSt。如果不关闭像这样的相关资源。就可能会导致资源泄漏。这一点和C语言的malloc很像。如果不关闭连接。当前这个connction对象只有的内存,以及内部持有的sockt文件描述符都难以释放。这时候也会造成类似于内存泄漏的情况。释放资源的顺序需要和创建的顺序相反。我们创建的顺序是connction、statmnt、sultSt。所以关闭顺序就应该如下代码中那样。

//、释放相关资源sultSt.clos();statmnt.clos();connction.clos();

四、加入SQL版的数据库

如果这样就想学会JDBC,我猜你是哈士奇思考小问题。汪想!为了让读者更好的掌握JDBC编程,接下来我将向你演示mysql的图书管理系统。

4.系统功能汇总

图书管理系统:、能够表示每本书的信息。包含书的序号、书名、作者、价格、类型。、能够表示用户信息,这里分为两种,管理员和普通用户、针对以上两种用户提供不同的操作:普通用户:查看书籍列表,查找指定书籍、借阅书籍、归还书籍管理员用户:查看书籍列表、新增书籍、删除书籍、

4.数据库准备

、书籍表:

cattablbook(bookidintprimarykyauto_incmnt,namvarchar(0),authorvarchar(0),--钱是小数但是小数的浮点数在计算机中难以精确存储,float、doubl都是无法精确表示的--dcimal类型可以精确表示小数但是效率大大降低--办法:还是用int但是单位是分而不是元pricint,typvarchar(0),isBrrowdint);

、用户表:

droptablifxistsusr;cattablusr(usrIdintprimarykyauto_incmnt,usrnamvarchar(0),passwordvarchar(0),--isAdmin为时,代表管理员,为0代表普通用户isAdminint);

先插入一些数据:

--插入一些数据insrtintobookvalus(null,西游记,吴承恩,,古典小说,0);insrtintobookvalus(null,三国演义,罗贯中,,古典小说,0);insrtintobookvalus(null,水浒传,施耐庵,,古典小说,0);insrtintobookvalus(null,金瓶梅,兰陵笑笑生,,古典小说,0);--插入一些用户insrtintousrvalus(null,admin,,);insrtintousrvalus(null,zjw,,0);

这样初步数据就算是准备好了。

4.构造和数据库相关的实体类

数据库中的实体:用户,书籍所以在Java代码里也需要对应的用户类,书籍类。

书籍类代码如下:

packagjdbcBook;//使用这个类表示一本书/*+-----------+-------------+------+-----+---------+----------------+

Fild

Typ

Null

Ky

Dfault

Extra

+-----------+-------------+------+-----+---------+----------------+

bookid

int

NO

PRI

NULL

auto_incmnt

nam

varchar(0)

YES

NULL

author

varchar(0)

YES

NULL

pric

int

YES

NULL

typ

varchar(0)

YES

NULL

isBrrowd

int

YES

NULL

+-----------+-------------+------+-----+---------+----------------+*/publicclassbook{privatintbookId;privatStringnam;privatStringauthor;privatintpric;privatStringtyp;privatintisBorrowd;publicintgtBookId(){turnbookId;}publicvoidstBookId(intbookId){this.bookId=bookId;}publicStringgtNam(){turnnam;}publicvoidstNam(Stringnam){this.nam=nam;}publicStringgtAuthor(){turnauthor;}publicvoidstAuthor(Stringauthor){this.author=author;}publicintgtPric(){turnpric;}publicvoidstPric(intpric){this.pric=pric;}publicStringgtTyp(){turntyp;}publicvoidstTyp(Stringtyp){this.typ=typ;}publicintgtIsBrrowd(){turnisBrrowd;}publicvoidstIsBorrowd(intisBorrowd){this.isBorrowd=isBorrowd;}

OvrridpublicStringtoString(){turn"book{"+"bookId="+bookId+",nam="+nam+\+",author="+author+\+",pric="+pric+",typ="+typ+\+",isBrrowd="+isBrrowd+};}}

用户类:

packagjdbcBook;//使用这个类表示用户/*+----------+-------------+------+-----+---------+----------------+

Fild

Typ

Null

Ky

Dfault

Extra

+----------+-------------+------+-----+---------+----------------+

usrId

int

NO

PRI

NULL

auto_incmnt

usrnam

varchar(0)

YES

NULL

password

varchar(0)

YES

NULL

isAdmin

int

YES

NULL

+----------+-------------+------+-----+---------+----------------+*///针对此处的isAdmin,用两个不同的子类来区分//原因是不同的身份,管理员和用户,他们支持的方法是不同的importOprations.IOpration;abstractpublicclassUsr{privatintusrId;privatStringusrNam;privatStringpassword;//包含一个数组,里面存放的就是支持的操作//针对不同用户,分别设置不同操作IOpration[]oprations;//普通用户和管理员看到的菜单也不一样//抽象方法不能有方法体,要求子类重写这个抽象方法//抽象类不能被实例化,只能被继承//如果一个方法是抽象方法,那么它必须存在于抽象类中abstractpublicintmnu();publicintgtUsrId(){turnusrId;}publicvoidstUsrId(intusrId){this.usrId=usrId;}publicStringgtUsrNam(){turnusrNam;}publicvoidstUsrNam(StringusrNam){this.usrNam=usrNam;}publicStringgtPassword(){turnpassword;}publicvoidstPassword(Stringpassword){this.password=password;}

OvrridpublicStringtoString(){turn"Usr{"+"usrId="+usrId+",usrNam="+usrNam+\+",password="+password+\+};}}

管理员类:

packagjdbcBook;importOprations.*;importjava.util.Scannr;publicclassAdminxtndsUsr{publicAdmin(){this.oprations=nwIOpration[]{nwExitOpration(),nwDisplayOpration(),nwFindOpration(),nwAddOpration(),nwDlOpration(),};}//打印管理员的菜单

Ovrridpublicintmnu(){Systm.out.println("~~~~~~~~~~~~~");Systm.out.println("欢迎欢迎"+this.gtUsrNam()+"管理员用户");Systm.out.println("请选择要进行的操作");Systm.out.println("、查看书籍列表");Systm.out.println("、查看指定书籍");Systm.out.println("、新增书籍");Systm.out.println("4、删除书籍");Systm.out.println("0、退出系统");Scannrscannr=nwScannr(Systm.in);intchoic=scannr.nxtInt();turnchoic;}}

普通用户:

packagjdbcBook;importOprations.*;importjava.util.Scannr;publicclassNormalUsrxtndsUsr{publicNormalUsr(){//初始化OPERATIONSthis.oprations=nwIOpration[]{nwExitOpration(),nwDisplayOpration(),nwFindOpration(),nwBorrowOpration(),nwRturnOpration(),};}//打印普通用户的菜单

Ovrridpublicintmnu(){Systm.out.println("~~~~~~~~~~~~~");Systm.out.println("欢迎欢迎"+this.gtUsrNam());Systm.out.println("请选择要进行的操作");Systm.out.println("、查看书籍列表");Systm.out.println("、查看指定书籍");Systm.out.println("、借阅书籍");Systm.out.println("4、归还书籍");Systm.out.println("0、退出系统");Scannrscannr=nwScannr(Systm.in);intchoic=scannr.nxtInt();turnchoic;}}

上面的代码和我之前写过了纯Java版图书管理系统非常相似,几乎完全相同。不熟悉的同学可以去看看。这里附上链接Java图书管理系统

以上四个类就是图书管理系统的基准类。接下来开始封装数据库的相关操作。

4.4封装数据库的相关操作

从下面开始就和纯Java版本的不同了,现在写一些JDBC相关的代码,让程序通过这些代码,来完成对应数据表的增删查改。实现的具体步骤

:封装好和数据库建立链接的操作

):我们单独的创建一个类DButil来完成这样的操作还记得上面的JBDC五*神掌吗?不记得的话看看下面的代码在熟悉一下。我们期望此处定义的URL,USERNAME,PASSWORD都是常量。所以我们用privat,static,final来修饰他们。防止再修改。

//设置URLprivatstaticfinalStringURL="jdbc:mysql://7.0.0.:0/bookmanagr?charactrEncoding=utf8usSSL=fals";//数据库用户名privatstaticfinalStringUSERNAME="root";//数据库密码privatstaticfinalStringPASSWORD="";

()创建Datasourc实例,在创建之前我们希望它和上面的用户名、密码、URL一样是常量,只被创建一次。所以我们也给它加上static修饰符。

//加上static之后,DataSourc就变成了类属性。和实例无关,只和类相关。//类属性,就是在类被创建出来的时候,才会被创建。//啥时候创建类?类加载阶段,但对于类来说,一个类也只是被加载一次而已。//实例属性是在每个实例被创建出来的时候都会被创建

privatstaticDataSourcdataSourc=nwMysqlDataSourc();

()链接数据库我们期望的是就算不创建DBUtil实例也能直接链接数据库,所以我们不用构造方法的形式链接数据库,而是用静态代码块。

//静态代码块static{((MysqlDataSourc)dataSourc).stUrl(URL);((MysqlDataSourc)dataSourc).stUsr(USERNAME);((MysqlDataSourc)dataSourc).stPassword(PASSWORD);}

在提供一个静态方法来链接

//这个方法也设计成static,这样不用创建DBUtil实例,也能调用这个方法publicstaticConnctiongtConnction()throwsSQLExcption{turndataSourc.gtConnction();}

用完了之后,释放资源。顺序采用后申请,先关闭。

}//释放资源publicvoidclos(Connctionconnction,PpadStatmntstatmnt,RsultStsultSt){if(sultSt!=null){try{sultSt.clos();}catch(SQLExcption){.printStackTrac();}}if(statmnt!=null){try{statmnt.clos();}catch(SQLExcption){.printStackTrac();}}if(connction!=null){try{connction.clos();}catch(SQLExcption){.printStackTrac();}}}

怕大家漏掉哪部分代码,我这里附上完整的代码

import

1
查看完整版本: 老师看了直说好MYSQLJDBC