基于MVC的Java Web开发项目5 JDBC数据库访问实现商品显示_第1页
基于MVC的Java Web开发项目5 JDBC数据库访问实现商品显示_第2页
基于MVC的Java Web开发项目5 JDBC数据库访问实现商品显示_第3页
基于MVC的Java Web开发项目5 JDBC数据库访问实现商品显示_第4页
基于MVC的Java Web开发项目5 JDBC数据库访问实现商品显示_第5页
已阅读5页,还剩61页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ED电子商城的数据存放在数据库中,要将商品信息提供给用户查看和选择,则需要从数据库中将商品信息读取出来,本项目将带领读者实现商品的概要显示及详细显示等功能。介绍Java Web开发中对数据库访问基础知识及JDBC应用,实现数据的读取。熟悉JDBC数据访问基础知识。能正确使用JDBC访问数据。能将数据在控制台输出显示任务编号任务名称任务5.1创建JDBC数据库连接任务5.2商品列表信息显示任务5.1 创建JDBC数据库连接对于刚刚开始工作的小J,要先从简单一点的功能上手创建JDBC数据库连接。利用JDBC建立与MySQL数据库连接,若连接成功,则输出digital数据库中商品表product_i

2、nfo的商品编号、商品名称及商品价格相关信息。知识目标:了解JDBC工作原理;掌握JDBC数据库访问的步骤。技能目标:能正确加载数据库驱动程序;能正确建立与数据库的连接;能正确将数据库中数据读出。JDBC是数据库连接技术的简称,提供了连接和访问各种数据库的能力,使用JDBC连接主要步骤为:注册和加载驱动器。与数据库建立连接。发送SQL语句。处理结果。关闭连接。创建包。右击src,在弹出的菜单中选择new-pakage;在弹出的对话框中输入包名。任务准备。创建包及数据库连接程序。新建文件。在新建的包上右击,在弹出的菜单中选择new-class4. 在弹出的对话框中输入SimpleConnecit

3、on,同时选择“public static void main(String args)”如图,点击“finish”,完成文件的创建。任务准备。创建包及数据库连接程序。自动生成代码如下:package com.digitalweb.connection;public class SimpleConnection /* * param args */public static void main(String args) / TODO Auto-generated method stub任务准备。创建包及数据库连接程序。1. 下载JAVA连接MySQL的驱动程序.jar包2. 将第1步中下载的驱

4、动包,复制到WebRoot-WEB-INF-lib文件夹中。注册和加载驱动器。3.打开在步骤一中新建的文件,在main()中添加如下代码,完成驱动器的注册与加载。1. package com.digitalweb.connection;2. import java.sql.*3. public class SimpleConnection 4. /*5. * param args6. */7. public static void main(String args) 8. / TODO Auto-generated method stub9. String driver = com.mysql

5、.jdbc.Driver ;10. try 11. / 1 注册和加载驱动器12. Class.forName(driver); 13. / 2 与数据库建立连接 14. /3.1 创建Statement对象 15. / 3.2 发送SQL语句 16. / 4 处理结果 17. / 5 关闭连接18. catch (Exception e) 19. e.printStackTrace();修改步骤二中的代码,完成数据库连接。代码如下:1. package com.digitalweb.connection;2. import java.sql.*;3. public class SimpleC

6、onnection 4. /*5. * param args6. */7. public static void main(String args) 8. / TODO Auto-generated method stub9. String driver =com.mysql.jdbc.Driver;10. String url = jdbc:mysql:/:3306/digital?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolea

7、n=true;11. String userName = root;12. String pwd = 888888;与数据库建立连接。13. try 14. / 1 注册和加载驱动器15. Class.forName(driver); 16. / 2 与数据库建立连接17. Connection con=DriverManager.getConnection(url,userName,pwd);18. /3.1 创建Statement对象 19. / 3.2 发送SQL语句 20. / 4 处理结果 21. / 5 关闭连接 22. catch (Exception e) 23. e.prin

8、tStackTrace();24. 25. 26.与数据库建立连接。程序说明 :第10行:创建连接字符串。其中是本地机器IP地址,3306为端口号,digital是数据库名;第11行:访问数据库的用户名;第12行:访问数据库的密码;第17行:与数据库建立连接;建立连接后就可以向数据库发送SQL语句了。可以使用Connection接口中的CreateStatement方法创建对象,用于发送SQL。在上述程序段中添加代码后如下所示:package com.digitalweb.connection;import java.sql.*;public class SimpleConnection /*

9、 * param args */public static void main(String args) / TODO Auto-generated method stubString driver =net.sourceforge.jtds.jdbc.Driver;String url = jdbc:mysql:/:3306/digital?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true;String userNam

10、e = root;String pwd = 888888;String sql=select code,name,num,price from product_info ;发送SQL语句。14.try 15. / 1 注册和加载驱动器16.Class.forName(driver); 17./ 2 与数据库建立连接18.Connection con=DriverManager.getConnection(url,userName,pwd);19./3.1 创建Statement对象20.PreparedStatement psmt = con.prepareStatement(sql);21.

11、/ 3.2 发送SQL语句22.ResultSet rs = psmt.executeQuery();23./ 4 处理结果 24./ 5 关闭连接 25. catch (Exception e) 26.e.printStackTrace();27.28.29.发送SQL语句。程序说明 :第13行:配置SQL语句,查找Product_info表的code,name,num,price信息。第19行:创建Statement对象;第22行:发送SQL语句;执行完查询操作,Statement对象执行完查询操作后,将查询结果以结果集(ResultSet)对象形式返回,可根据用户需求,将数据显示出来。p

12、ackage com.digitalweb.connection;import java.sql.*;public class SimpleConnection /* * param args */public static void main(String args) / TODO Auto-generated method stubString driver =net.sourceforge.jtds.jdbc.Driver;String url = jdbc:mysql:/:3306/digital?useUnicode=true&characterEncoding=u

13、tf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true;String userName = root;String pwd = 888888;String sql=select code,name,num,price from product_info ;处理结果。14.try 15./ 1 注册和加载驱动器16.Class.forName(driver); 17./ 2 与数据库建立连接18.Connection con=DriverManager.getConnection(url,userName,pwd)

14、;19./3.1 创建Statement对象20.PreparedStatement psmt = con.prepareStatement(sql);21./ 3.2 发送SQL语句22.ResultSet rs = psmt.executeQuery();23./ 4 处理结果24.while (rs.next() 25.String pcode=rs.getString(code);26.String pname = rs.getString(name);27.int pnum = rs.getInt(num);28.float pprice = rs.getFloat(price);2

15、9.System.out.println(pcode+,t+pname+,t+pnum+,t+pprice);30.31./ 5 关闭连接 32. catch (Exception e) 33.e.printStackTrace();34.35.package com.digitalweb.connection;import java.sql.*;public class SimpleConnection /* * param args */public static void main(String args) / TODO Auto-generated method stubString

16、driver =net.sourceforge.jtds.jdbc.Driver;String url = jdbc:mysql:/:3306/digital?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true;String userName = root;String pwd = 888888;String sql=select code,name,num,price from product_info ;关闭数据连接。

17、访问完成后,关闭数据库连接,释放与连接有关的资源。添加代码:con.close(); 最终完成代码如下:14.try 15./ 1 注册和加载驱动器16.Class.forName(driver); 17./ 2 与数据库建立连接18.Connection con=DriverManager.getConnection(url,userName,pwd);19./3.1 创建Statement对象20.PreparedStatement psmt = con.prepareStatement(sql);21./ 3.2 发送SQL语句22.ResultSet rs = psmt.execute

18、Query();23./ 4 处理结果24.while (rs.next() 25.String pcode=rs.getString(code);26.String pname = rs.getString(name);27.int pnum = rs.getInt(num);28.float pprice = rs.getFloat(price);29.Systm.out.println(pcode+,t+pname+,t+pnum+,t+pprice);30.31./ 5 关闭连接32.con.close();33. catch (Exception e) 34.e.printStack

19、Trace();运行。点击 运行程序,结果如下图所示:1、什么是JDBC数据库访问Java数据库连接(JDBC-Java Data Base Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序。2、JDBC数据访问模型JDBC API既支持数据库访问的两层模型,也支持3层模型。 两层模型。在两层模型中,Java applet或应用程序将直接与数据库进行对

20、话。需要一个JDBC驱动程序来与所访问的特定数据库管理系统进行通讯。用户的SQL语句被送往数据库中,结果将被送回给用户。数据库可以位于另一台计算机上,用户通过网络连接到上面。这就叫做客户机/服务器配置,其中用户的计算机为客户机,提供数据库的计算机为服务器。网络可以是 Intranet(它可将公司职员连接起来),也可以是 Internet。两层模型如图所示。 三层模型。在三层模型中,命令先是被发送到服务的中间层,然后由它将SQL 语句发送给数据库。数据库对 SQL 语句进行处理并将结果送回到中间层,中间层再将结果送回给用户。三层模型很吸引人,因为可用中间层来控制对公司数据的访问和可更新的种类。中

21、间层的另一个好处是,用户可以利用易于使用的高级API,而中间层将把它转换为相应的低级调用。最后,许多情况下三层结构可提供一些性能上的好处。3、DriverManagerDriverManager管理一组 JDBC 驱动程序的基本服务,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager 类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。对于简单的应用程序,一般需要在此类中直接使用的唯一方法是 。正如名称所示,该方法将建立与数据库的连接。JDBC 允许用户调用 DriverManager 的方法 getDriver、g

22、etDrivers 和 registerDriver 及 Driver 的方法 connect。但多数情况下,让 DriverManager 类管理建立连接的细节为上策。DriveManager常用的方法如下:4、Connection对象Connection接口代表与数据库的连接,并拥有创建SQL语句的方法,以完成基本的SQL操作,同时为数据库事务处理提供提交和回滚方法。一个应用程序可与单个数据库有一个或多个连接,也可以与多个数据库有连接。Connection常用方法如下:名 称说 明Close()断开连接,释放Connection对象的数据库和JDBC资源。createStatement()

23、创建一个Statement对象将SQL语句发送到数据库。Commit()用于提交SQL语句,确认从上一次提交/回滚以来进行的所有更改。isClose()用户判断Connection对象是否已经被关闭。Rollback()用于取消SQL语句,取消在当前事务中进行的所有更改prepareCall(sql)创建一个callableStatement对象调用数据库存储过程prepareStatement创建一个preparedStatement对象将参数化的SQL语句发送到数据库5、Statement对象Statement接口用于执行不带参数的简单SQL语句。用来向数据库提交SQL语句并返回SQL语句

24、的执行结果,提交的SQL语句可以是查询语句、修改语句、插入语句、删除语句。Statement接口常用方法如下:名 称说 明Close()释放Statement对象的数据库和JDBC资源。execute(sql)执行给定的SQL语句,该语句可返回多个结果。executeQuery(sql)执行给定的SQL语句,返回单个ResultSet对象。executeUpdate(sql)执行给定的Insert、Update、Delete语句,返回影响的行数。getConnection()获取生成该对象的Connection对象。getFetchSize()获取结果集合的行数,该数是根据此Statement

25、对象生成的ResultSet对象的默认获取大小。getMaxRows()获取由此Statement对象生成的ResultSet对象可以包含的最大行数。6、ResultSet对象ResultSet对象包含了Statement和PreparedStatement的executeQuery方法中SELECT查询的结果集,即符合指定SQL语句中条件的所有行。ResultSet对象提供了许多方法用来操作结果集中的记录指针,同时提供了一套GET方法,提供了对这些数据的访问。ResultSet接口常用方法如下:名 称说 明next()指针从当前位置下移一行。first()将指针移到结果集的第一行。previ

26、ous()将指针移到结果集的上一行。last()将指针移到结果集的最后一行。beforeFirst()将指针移到结果集的开头(第一行之前)。afterLast()将指针移到结果集的末尾(最后一行之后)。isFirst()该方法的作用是检查当前行是否记录集的第一行,如果是返回true, 否则返回falseisLast()该方法的作用是检查当前行是否记录集的最后一行,如果是返回true ,否则返回false。isAfterLast();该方法检查数据库游标是否处于记录集的最后面,如果是返回true ,否则返回false。isBeforeFirst()该方法检查数据库游标是否处于记录集的最前面,如果

27、是返回true ,否则返回false。rowDeleted()如果当前记录集的某行被删除了,那么记录集中将会留出一个空位;调用rowDeleted()方法,如果探测到空位的存在,那么就返回true; 如果没有探测到空位的存在,就返回false 值.rowInserted()如果当前记录集中插入了一个新行,该方法将返回true ,否则返回false。rowUpdated()如果当前记录集的当前行的数据被更新,该方法返回true ,否则返回false。insertRow()该方法将执行插入一个新行到当前记录集的操作。updateRow()该方法将更新当前记录集当前行的数据。deleteRow()该

28、方法将删除当前记录集的当前行。7、PreparedStatement接口PreparedStatement接口是Statement接口的子接口,直接继承并重载了 Statement 的方法。PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。由于 PreparedStatement

29、对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象Prepare

30、dStatement其常用方法如下:名 称说 明execute()在PreparedStatment对象中执行任何SQL语句executeQuery()在PreparedStatement对象中执行SQL查询,并返回该查询生成的结果集。executeUpdate()在PreparedStatement对象中执行SQL语句,该语句必须是INSERT、UPDATE或DELETE语句;或DDL语句。getMetaData()检索包含有关ResultSet对象的列消息的ResultSetMetaData对象,ResultSet对象将在执行此PreparedStatement对象时返回。getParam

31、eterMetadata()检索PreparedStatement对象的参数的编号、类型和属性。setInt(x,y)将第X个参数设置为int值。setString(x,y)将第X个参数设置为String 值。PreparedStatement与Statement比较:PreparedStatementStatement使用范围当执行相似SQL(结构相同,具体值不同)语句的次数比较少;当执行相似SQL语句的次数比较多(例用户登录,频繁操作表)语句一样,只是具体的值不一样,被称为动态SQL。优 点语法简单语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)缺 点使用硬编码效率低,安全性

32、较差执行非相似SQL语句时,速度较慢。原 理硬编码,每次执行时相似SQL都会进行编译。相似SQL只编译一次,减少编译次数。使用示例:PreparedStatement perstmt = con.prepareStatement(insert into user_info (username,password,realName,address,score) values (?,?,?,?);perstmt.setString(1, tom);perstmt.setString(2, 123);perstmt.setString(3, 李明);perstmt.setString(4, 苏工院);

33、pestmt.setInt(5,100);程序说明 :第1行:创建PreparedStatement对象。第2-6行:根据输入参数的SQL类型选用合适的SetXXX方法,如是String类型,则使用setString()进行赋值。任务5.2 商品列表信息显示对于刚刚开始工作的小J,要先从简单一点的功能上手商品列表信息显示用户进入ED电子商城后,在网站的首页上会显示最新入库的四个商品信息,用户可以通过单击“更多”链接查看更多的商品信息,如图所示。知识目标:掌握数据库操作SQL语句;掌握JDBC中实现数据访问的类与接口的作用与常用方法。技能目标:能正确的从数据库取出数据;能正确的封装数据;能正确的

34、在JSP页面显示数据。根据任务概述的情况,商品列表显示功能的实现,涉及到的类包括数据实体层(Product)、数据库访问层(ProductDaoImpl)、控制层(ProductServlet),本任务的重点是数据访问层中数据的显示JDBC事务处理的实现,具体的序列如图所示。数据访问层ProductDaoImpl中的商品显示方法是本任务的重点,将体现JDBC事务处理,主要功能就是读取product_info表中的信息。控制层ProductServlet中调用ProductDaoImpl中的显示方法,将商品信息存放在session中参数传递给商品显示页面。创建商品实体类Product。1.新建文

35、件。右击包,选择菜单new-Class,如图所示。在弹出的对话框中,输入类名Product,完成创建,如图所示。2. 添加Product类的字段,代码如下所示。public class Product private int id;private String code;private String name;private String type;private String brand;private String pic;private int num;private double price;private double sale;private String intro;privat

36、e int status;3. 添加Product类的无参数构造函数。在product类代码段内空白处右击,在弹出的菜单内选择Source-Generate Constructors from Superclass(如图)在弹出的对话框(图)中点击finish,完成无参数构造函数的创建。4. 添加Product类的带参数构造函数。在product类代码段内空白处右击,在弹出的菜单内选择 “Source-Generate Constructors using Fields”(如图),在弹出的对话框中,点击“Select All”按钮,点击“OK”完成带参数构造函数的创建。自动添加如下代码段:pu

37、blic Product(int id, String code, String name, String type, String brand,String pic, int num, double price, double sale, String intro,int status) super();this.id = id;this.code = code; = name;this.type = type;this.brand = brand;this.pic = pic;this.num = num;this.price = price;this.sale = sa

38、le;ro = intro;this.status = status;添加各字段属性。在product类代码段内空白处右击,在弹出的菜单内选择 “Source-Generate Getters and Setters”(如图),在弹出的对话框中,点击“Select All”按钮,点击“OK”完成带字段属性的创建。自动添加如下代码段:public int getId() return id;public void setId(int id) this.id = id;public String getCode() return code;public void setCode(S

39、tring code) this.code = code;13.public String getName() 14. return name;15.16. public void setName(String name) 17. = name;18.19. public String getType() 20. return type;21.22. public void setType(String type) 23. this.type = type;24.25. public String getBrand() 26. return brand;27.28.publ

40、ic void setBrand(String brand) 29. this.brand = brand;30.31. public String getPic() 32. return pic;33.34. public void setPic(String pic) 35. this.pic = pic;36.37. public int getNum() 38. return num;39.40. public void setNum(int num) 41. this.num = num;42.43.public double getPrice() 44. return price;

41、45.46. public void setPrice(double price) 47. this.price = price;48.49. public double getSale() 50. return sale;51.52. public void setSale(double sale) 53. this.sale = sale;54.55. public String getIntro() 56. return intro;57.58. public void setIntro(String intro) 59. ro = intro;60.61. public

42、 int getStatus() 62. return status;63.64. public void setStatus(int status) 65. this.status = status;66.创建商品操作类ProductOpr。新建包。右击左侧的树型项目窗口的“src”,在弹出的菜单中选择“new-Pagkage”,在弹出的对话框中,输入包名,即完成包的创建。用此方法分别创建包,、用来存放实现接口的数据处理类;新建商品管理相关功能接口。右击,选择菜单new-interface,如图所示。在弹出的对话框中,输入类名ProductDao,完成创建。自动生成代码如下:package

43、com.digitalweb.dao;public interface ProductDao 修改上述代码,结果如下:package com.digitalweb.dao;import java.util.List;import com.digitalweb.model.Product;public interface ProductDao public List list();程序说明:第2-3行:引入包;第5行:创建接口方法,显示商品列表信息;3. 新建商品管理处理功能实现类。右击src,在弹出菜单中选择“new-class”,弹出如图5-2-12对话框输入类名ProductDaoImpl

44、,点击“Browse”按钮,在弹出的如图5-2-13显示的对话框的“choose a type”中输入要继承的类名“SuperOpr”,点击“OK”按钮完成添加;选择需要实现的接口类。在如图中的Add按钮 在弹出的对话框的“choose interface”文本框中输入接口类名称“ProductDao”(如图),点击“Ok”完成添加。点击“finish”按钮完成类的创建(如图。)自动生成代码如下:1. package com.digitalweb.impl;2. import java.util.List;3. import com.digitalweb.dao.ProductDao;4. i

45、mport com.digitalweb.dao.SuperOpr;5. import com.digitalweb.model.Product;6. public class ProductDaoImpl extends SuperOpr implements ProductDao 7. public List list() 8. / TODO Auto-generated method stub9. return null;10. 11.程序说明:第6行:显示商品管理接口类实现,继承SuperOpr类;第7-10行:实现商品显示方法代码。4. 完善商品信息列表显示的相关代码。在上述代码的l

46、ist方法中添加代码,实现商品信息显示。完成后代码如下:package com.digitalweb.impl;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import com.digitalweb.dao.ProductDao;import com.digitalweb.dao.SuperOpr;import com.digitalweb.model.Product;8. import com.mysql.jdbc.PreparedStatement;9. public class

47、 ProductDaoImpl extends SuperOpr implements ProductDao 10. public List list() 11. / TODO Auto-generated method stub12. sql = select * from product_info where status = 1;13. ArrayList list = new ArrayList();14. try 15. psmt = (PreparedStatement) con.prepareStatement(sql);16. rs = psmt.executeQuery();

48、17. while (rs.next() 18. Product p = new Product();19. p.setBrand(rs.getString(brand);20. p.setCode(rs.getString(code);21. p.setId(rs.getInt(id);22. p.setIntro(rs.getString(intro););23.p.setName(rs.getString(name);24.p.setNum(rs.getInt(num);25. p.setPic(rs.getString(pic);26. p.setPrice(rs.getDouble(

49、price);27. p.setSale(rs.getDouble(sale);28. p.setStatus(1);29. p.setType(rs.getString(type);30. list.add(p);31.32. catch (SQLException e) 33. / TODO Auto-generated catch block34. e.printStackTrace();35.36. return list;显示商品信息到页面。1. 添加page指令,引入相关包。代码如下:2. 添加脚本,读取商品列表信息。显示商品信息层HTML代码为:1. 2.3. 4.5. 经济高效,超低成本! 四叶草价:6.7.8.促销信息: 直降9.效果图如下:在层代码前添加脚本代码获取商品

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论