关于优化SQL里面的图书优化最后附有完整代码和详细解释.docx
《关于优化SQL里面的图书优化最后附有完整代码和详细解释.docx》由会员分享,可在线阅读,更多相关《关于优化SQL里面的图书优化最后附有完整代码和详细解释.docx(17页珍藏版)》请在冰豆网上搜索。
关于优化SQL里面的图书优化最后附有完整代码和详细解释
关于优化SQL里面的图书管理系统(内附完整代码和详解)
首先新增两个功能:
模糊查询和借书还书功能
1.模糊查询和简单查询差不多。
唯一差的就是在查询select*frombiaowherename=like‘<%1姓名%>’;多了百分号。
2.借书功能。
先获取图书的编号,然后给‘是否借出’那一栏赋值“是”,这样用selectcount(*)from去查询的时候就可以返回个1或者0,1说明编号和“是”匹配,就是说编号为“”的图书已经被借走了。
先存储数据然后跳转error.jsp界面让他过几天来借书,如果是0,说明编号和“是”不匹配。
编号一定有,就说明“是”不对,那就只有“否”了。
这样跳转到查询界面取出数据,修改参数就好。
言归正传,开始优化功能。
1.首先是链接数据库的优化,我用的是自己电脑里面的SQL数据库。
所以用户名了密码了都一样,可以用privatestaticfinalString去封装。
比如:
privatestaticfinalStringdriverName="com.mysql.jdbc.Driver";
privatestaticfinalStringuserName="root";
privatestaticfinalStringuserPasswd="123456";
privatestaticfinalStringdbName="xueshenbiao";
privatestaticfinalStringtableName="tongxunlv";
2.连接数据库方面的优化:
publicStatementgetDbStatement(){
Stringurl="jdbc:
mysql:
//localhost/"+dbName+"?
user="+userName+"&password="+userPasswd;
Statementstatement=null;
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
java.sql.Connectionconnection=DriverManager.getConnection(url);
statement=connection.createStatement();
}catch(Exceptione){
e.printStackTrace();
}
returnstatement;
}
publicStatementgetDbStatement()中statement的意思是:
3.查询语句的优化
因为查询语句查询到的是一个单子。
而不是简单的一天数据。
所以要用集合进行包含
PublicListdoQuery(Stringsql<包含所有的数据集合>)
Listqw=newArrayList();
try{
ResultSetrs=getDbStatement().executeQuery(sql);
while(rs.next())//循环操作
{shuxinga=newshuxing();
StringbookNO=rs.getString
(1);
StringbookName=rs.getString
(2);
Stringauthor=rs.getString(3);
Stringpress=rs.getString(4);
Stringisborrow=rs.getString(5);
StringborrowDate=rs.getString(6);
StringbackDate=rs.getString(7);
a.setBookNO(bookNO);
a.setBookName(bookName);
a.setAuthor(author);
a.setPress(press);
a.setIsborrow(isborrow);
a.setBorrowDate(borrowDate);
a.setBackDate(backDate);
qw.add(a);
}
}
catch(Exceptione){
e.printStackTrace();
}
returnqw;
}
ResultSetrs=getDbStatement().executeQuery(sql);意思是:
4.之后是删除修改增加的语句优化,因为他们返回的都是几条几条数据所以用INT进行定义
publicintdoUpdate(Stringsql){
intresult=0;
try{
getDbStatement().executeUpdate(sql);
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
5.修改的时候需要查询需要修改的那条数据的具体内容需要进行单条数据的查询。
和总的差不多。
但是他返回的不是一条不是一个集合。
而是一条完整数据,用shuxing(分装包里面类的名字)去定义
publicshuxingdoApp(Stringsql){
shuxinga1=newshuxing();
try{
ResultSetrs=getDbStatement().executeQuery(sql);
while(rs.next())
{
StringbookNO=rs.getString
(1);
StringbookName=rs.getString
(2);
Stringauthor=rs.getString(3);
Stringpress=rs.getString(4);
Stringisborrow=rs.getString(5);
StringborrowDate=rs.getString(6);
StringbackDate=rs.getString(7);
a1.setBookNO(bookNO);
a1.setBookName(bookName);
a1.setAuthor(author);
a1.setPress(press);
a1.setIsborrow(isborrow);
a1.setBorrowDate(borrowDate);
a1.setBackDate(backDate);
}
}catch(Exceptione){
e.printStackTrace();
}
returna1;
}
4.对于接收的属性的优化
比如要接收什么图书编号了出版社什么的。
每次都写有点麻烦所以就也封装下
因为封装的也是个数据类型所以
publicshuxinggetBook(HttpServletRequestrequest){
//接收book的所有属性参数,并封装,由于参数都是从request中获取,所以以HttpServletRequest作为参数
shuxingbk=newshuxing();
StringbookNO=request.getParameter("bookNO");
bookNO=bookNO==null?
"":
bookNO.trim();
bk.setBookNO(bookNO);//封装图书编号
StringbookName=request.getParameter("bookName");
bookName=bookName==null?
"":
bookName.trim();
bk.setBookName(bookName);//封装图书名称
Stringauthor=request.getParameter("author");
author=author==null?
"":
author.trim();
bk.setAuthor(author);//封装作者
Stringpress=request.getParameter("press");
press=press==null?
"":
press.trim();
bk.setPress(press);//封装出版社
Stringisborrow=request.getParameter("isborrow");
isborrow=isborrow==null?
"":
isborrow.trim();
bk.setIsborrow(isborrow);//封装是否借出
StringborrowDate=request.getParameter("borrowDate");
borrowDate=borrowDate==null?
"":
borrowDate.trim();
bk.setBorrowDate(borrowDate);//封装借出时间
StringbackDate=request.getParameter("backDate");
backDate=backDate==null?
"":
backDate.trim();
bk.setBackDate(backDate);//封装归还时间
returnbk;
}
之所以和之前封装的不同,是因为他封装的是接收的信息,而不是直接原有的信息。
用一个集合BK去包含这些属性。
然后在外面的时候去调用这个BK函数
接着就是servlet的缩写了。
首先用一个集合调出之前封装的东西
1.调出数据库的方法。
Youhuade=newyouhua();
2.调出封装数据的方法。
shuxingbk=getBook(request);
3.方法中多余的删除,在有数据的地方用BK代替,如
Intresult=doADD(bk)原先里面写的是读出来的数据。
现在封装了。
所以就用BK代替。
值得注意的是在进行单条数据查询用来修改的时候,要从之前的方法中调用方法,需要新建一个集合,然后去调用这个方法
youhuayh=newyouhua();
shuxinga1=yh.doApp(sql);
在后面的删除修改方法的SQL语句中,需要用bk.getBookNo()去寻找用户输入的数据,注意的是上面方面中publicintdoAdd(shuxingbk)括号内需要写入BK。
完整代码和详解
Controller包
packagecontroller;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.ArrayList;
importjava.util.List;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importservice.bookService;
importdao.DataBaseDao;
importmodel.book;
publicclassbmanagerextendsHttpServlet{
publicbmanager(){
super();
}
publicvoiddestroy(){
super.destroy();
}
//doPost方法获得请求类型,根据请求类型做出响应并返回到视图层,相当于控制层
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
//封装book,单独写了getBook()方法
bookbk=getBook(request);
//获取行为参数,如果什么都不传,默认是查询操作
StringactionName=request.getParameter("action");
actionName=actionName==null?
"query":
actionName.trim();
System.out.println("动作类型action:
"+actionName);
//实例化调用数据库服务的对象相当于服务层
bookServicebs=newbookService();
//----------------------------查询-------------------------------------------
if(actionName.equals("query")){
System.out.println("执行:
query...");
Listbooklist=bs.getBookList(bk);
request.setAttribute("booklist",booklist);
request.getRequestDispatcher("bookList.jsp").forward(request,response);
}
//----------------------------增加-------------------------------------------
elseif(actionName.equals("add")){
System.out.println("执行:
add...");
intresult=bs.doAddBook(bk);
if(result<=0){
//添加失败
request.setAttribute("errorMsg","图书添加失败!
");
request.getRequestDispatcher("error.jsp").forward(request,response);
}else{
//添加成功
request.getRequestDispatcher("bmanager").forward(request,response);
//注意这里之前我们都是要再做一次查询图书列表然后再跳转到图书列表页,考虑到每个方法
//都要在做完自己的功能之后再要做一次查询功能,比较繁琐,可以直接跳转到
//localhost:
8080/bookManager/bmanager,不传任何参数,那么当servlet接收到请求
//之后,会被默认作为查询操作,调用查询方法,而查询方法正是返回到图书列表页
}
}
//----------------------------to修改-------------------------------------------
elseif(actionName.equals("toEditBook")){
System.out.println("执行:
toEditBook...");
booknewbk=bs.getBookInfo(bk);
request.setAttribute("book",newbk);
request.getRequestDispatcher("Editbook.jsp").forward(request,response);
}
//----------------------------修改-------------------------------------------
elseif(actionName.equals("edit")){
System.out.println("执行:
edit...");
intresult=bs.editBook(bk);
if(result<=0){
//修改失败
request.setAttribute("errorMsg","图书修改失败!
");
request.getRequestDispatcher("error.jsp").forward(request,response);
}else{
//修改成功
request.getRequestDispatcher("bmanager").forward(request,response);
}
}
//----------------------------删除-------------------------------------------
elseif(actionName.equals("delete")){
System.out.println("执行:
delete...");
intresult=bs.deleteBook(bk);
if(result<=0){
//删除失败
request.setAttribute("errorMsg","图书删除失败!
");
request.getRequestDispatcher("error.jsp").forward(request,response);
}else{
//删除成功
request.getRequestDispatcher("bmanager").forward(request,response);
}
}
}
//考虑到增,删,改,查都是围绕图书这一对象进行,那么可以在进入控制层的时候就封装book的所有属性
publicbookgetBook(HttpServletRequestrequest){
//接收book的所有属性参数,并封装,由于参数都是从request中获取,所以以HttpServletRequest作为参数
bookbk=newbook();
StringbookNo=request.getParameter("bookNo");
bookNo=bookNo==null?
"":
bookNo.trim();
bk.setBookNo(bookNo);//封装图书编号
StringbookName=request.getParameter("bookName");
bookName=bookName==null?
"":
bookName.trim();
bk.setBookName(bookName);//封装图书名称
Stringauthor=request.getParameter("author");
author=author==null?
"":
author.trim();
bk.setAuthor(author);//封装作者
Stringpress=request.getParameter("press");
press=press==null?
"":
press.trim();
bk.setPress(press);//封装出版社
Stringisborrow=request.getParameter("isborrow");
isborrow=isborrow==null?
"":
isborrow.trim();
bk.setIsborrow(isborrow);//封装是否借出
StringborrowDate=request.getParameter("borrowDate");
borrowDate=borrowDate==null?
"":
borrowDate.trim();
bk.setBorrowDate(borrowDate);//封装借出时间
StringbackDate=request.getParameter("backDate");
backDate=backDate==null?
"":
backDate.trim();
bk.setBackDate(backDate);//封装归还时间
System.out.println("--------------------book封装完毕------------------");
returnbk;
}
}
bao包
packagedao;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.ResultSetMetaData;
importjava.sql.Statement;
importjava.util.ArrayList;
importjava.util.List;
importmodel.book;
//这个类相当于最数据库层,一切直接操作数据库的代码全部封装在最底层
publicclassDataBaseDao{
//公用的部分可以抽出来
privatestaticfinalStringuserName="root";
privatestaticfinalStringuserPasswd="123456";
privatestaticfinalStringdbName="xueshenbiao";
//这一部分是获取数据库连接statment的代码,因为无论是增,删,改,查操作都要操作数据库,所以获取数据库连接在每个方法里都要重复写,可以单独抽出来
//这就是代码的重复利用
publicStateme