数据访问层与业务逻辑层设计.ppt_第1页
数据访问层与业务逻辑层设计.ppt_第2页
数据访问层与业务逻辑层设计.ppt_第3页
数据访问层与业务逻辑层设计.ppt_第4页
数据访问层与业务逻辑层设计.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第四章 数据访问层与 业务逻辑层设计,本章要点,使用连接池连接数据库及辅助类设计 数据操作程序设计的基本方法 博客网站数据访问类的设计 数据分页的基本方法 存储过程及其应用 大对象存储的基本方法 工厂模式与业务逻辑类设计,4.1 使用连接池连接数据库,数据源与连接池 在数据库的访问中,频繁连接和关闭数据库是非常费时的。一种改进的方法就是使用数据源技术。这种技术是,事先建立了多个数据库连接,并将这些连接保存在连接池(Connect Pool)中,Java程序访问数据库时,只需从连接池中取出空闲状态的数据库连接;当程序访问数据库结束,再将数据库连接放回连接池,这样做可以提高访问数据库的效率。,数据源的核心接口是javax.sql.DataSource。DataSource对象是由服务器提供的,因此不能在程序中采用创建一个实例的方式生成DataSource对象,而需要采用Java的另一个技术JNDI (Java Naming and Directory Interface),来获得DataSource对象的引用。JNDI是一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字相绑定。程序中可以通过这个名字来获得对象的引用。,在GlassFish中建立数据源 在Tomcat中建立数据源 (1)打开blog项目【配置文件】文件夹中的context.xml文件,加入如下代码: ,(2)如果使用数据源连接数据库,可按如下方式编写connect()方法: public static Connection connect() try Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup(“java:comp/env/jdbc/yb“); Connection con = ds.getConnection(); return con; catch (Exception ex) return null; ,案例4-1博客网站的辅助类设计 将常用的操作封装到类中,可以提高代码的重用性,简化程序设计。为此设计一个类MySQLHelper,用于连接MySQL数据库,封装建立连接、关闭结果集、关闭预处理、关闭连接等方法。并设计一个测试类TestMySQLHelperServlet,测试MySQLHelper的使用。连接成功显示如图4-7所示界面,否则显示如图4-8所示界面。,技术要点 在程序中需要采用Java的另一个技术JNDI来获得DataSource对象的引用。Tomcat把DataSource作为一种可以配置的JNDI资源来处理。生成DataSource对象的工厂为mons.dbcp.BasicDataSourceFactory。 在javax.naming包中提供了Context接口,该接口提供了将对象和名字绑定,以及通过名字检索对象的方法。在应用中可以直接使用InitalContext类初始化Context,产生一个上下文对象,然后通过lookup()方法检索数据源对象。 通过JNDI查找数据源,该JNDI为java:comp/jdbc/yb,其中p/env是tomcat固定的,tomcat提供的JNDI绑定都必须加该前缀;JDBC/yb是定义数据源时给数据源起的名字。,4.2 数据的基本操作,数据操作的基本原理 1建立操作对象 操作对象是指能执行SQL语句的对象,如Statement对象、PrepareStatement对象。建立这些对象,需要使用Connection对象。以建立Statement为例,建立的方法为: Statement stmt = con.createStatement(); /con为连接对象 PreparedStatement是SQL预处理类接口,使用其实现类来处理SQL能大大提高系统的执行效率。,2. 执行SQL Statement提供了三种执行SQL语句的方法: ResultSet executeQuery(String sql):执行select语句,返回一个结果集。 int executeUpdate(String sql):执行update、insert、delete 等不需要返回结果集的SQL语句。它返回一个整数,表示执行SQL语句影响的数据行数。 boolean execute(String sql):用于执行多个结果集、多个更新结果(或者两者都有)的SQL语句。它返回一个boolean值。如果第一个结果是ResultSet对象,返回true;如果是整数,就返回false。取结果集时可以与getMoreResultSet、getResultSet和getUpdateCount结合来对结果进行处理。 PreparedStatement也有上述三个方法,但都不带参数,因为在建立PreparedStatement对象时已经指定SQL语句。,3. 获得查询结果 如果SQL语句是查询语句,执行executeQuery()方法返回的是ResultSet对象。 ResultSet对象是一个由查询结果构成的数据表。在ResultSet中隐含着一个数据行指针,可使用如下方法将指针移动到指定的数据行: boolean absolute(int row):将指针移动到结果集对象的某一行。 boolean first():将指针移动到结果集对象的第一行。 boolean next():将指针移动到当前行的下一行。 boolean previous():将指针移动到当前行的前一行。 boolean last():将指针移动到当前行的最后一行。,查询数据 1查询一条记录 如果查询的结果是一条记录(例如,根据主键查询,就是一条记录),需要用if语句判断,并且可把查询的结果存放在一个对象中。 2查询多条记录 如果查询的结果可能有多条记录,这时需要用while循环,把每条记录存成一个对象,并把所有的对象添到一个集合里。,更新数据 1. 添加记录 添加记录的SQL语句格式如下: insert into 表名(字段名列表) values(值列表) 例如,在文章类别数据表中添加一条记录: insert into yb_category(blog_id,category_title) values(2,编程相关); 在Java中,使用PreparedStatement添加记录较方便。基本的步骤是,首先创建一个带参的SQL语句,然后利用连接对象建立PreparedStatement对象,再调用PreparedStatement对象的executeUpdate()方法。该方法返回一个整数,如果大于0表示添加成功,否则添加失败。,2. 修改记录 修改记录的SQL语句格式如下: update 表名 set 字段1 = 字段值1 , 字段2 = 字段值2 where 特定条件 例如,将分类号为3的分类名称修改为“热点话题”: update yb_category set category_title = 热点话题 where category_id=3 在Java中,修改记录与插入记录类似,只是SQL语句不同。,3. 删除记录 删除记录的SQL语句格式如下: delete from 表名 where 特定条件 例如,删除分类号为3的文章分类: delete from yb_category where category_id = 3 删除记录一般以主键作为条件。,案例4-2 博客网站数据访问类的设计 博客网站的各数据访问类的设计模式基本相同,这里先给出YbBlogDao和YbCategoryDao的设计。 技术要点 在blog.dao包中建立YbBlogDao和YbCategoryDao类,YbBlogDao实现IYbBlogDao接口,YbCategoryDao实现IYbCategoryDao接口; 每个操作方法都是先调用MySQLHelper类的connect()方法建立连接,然后建立预处理对象。 通过预处理对象的executeUpdate()方法实现数据更新,通过预处理对象的executeQuery()方法实现数据查询。,4.3 数据分页,按页查询数据 按页查询数据,即不是一次性查出所有数据,而是根据给定的页号和和页的大小查出所需的数据。 1使用查询语句实现分页 对于MySQL数据库,Select语句中的limit选项可以用于分页查询。 con = MySQLHelper.connect(); String sql = “select * from ys_article limit “ + (pageNo-1) * pageSize + “,“ + pageSize; ps = con.prepareStatement(sql); rs = ps.executeQuery(); 对于SqlServer数据库,分页方法与MySQL不同的,查询语句如下: String sql = “select top “ + pageSize + “ * from yb_article where article_id not in (select top “+(pageNo-1)*pageSize+ “ article_id from yb_article“,2. 使用PreparedStatement对象实现分页 在建立PreparedStatement对象时需要指定可滚动游标,然后通过程序来实现分页。参见如下代码: pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = ps.executeQuery(); rs.absolute(pageNo - 1) * pageSize); int i = 0; while (rs.next() ,例4-3 分页工具类及几个数据访问类设计 设计一个类PageList,该类实现了Plist接口,用于存放数据,同时具有分页功能,能够根据记录数、页大小,页号等能够生成页棒。此外,设计博文的数据访问类YbArticleDao,评论的数据访问类YbReviewDao以及相册的数据访问类YbPictureDao。 技术要点 分页工具类命名为PageList,该类实现Plist接口,包含两个属性pageBar和pageNumBar,分别用于存放普通分页棒和数字分页棒。 setPage()传递分页参数(记录总数、页大小、页号,网址),生成分页棒;getPageBar()和getPageNumBar()分别用于返回普通分页棒和数字分页棒。 YbArticleDAO类实现IYbArticleDao接口,YbReviewDao实现IybReviewDao接口,YbPictureDAO类实现IYbPictureDao接口。 数据分页采用MySQL查询语句的limit选项实现。,4.4 使用存储过程,存储过程的定义 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,在数据库应用程序中经常使用存储过程。 在MySQL中定义存储过程的基本格式如下: CREATE PROCEDURE 过程名 (IN|OUT|INOUT 参数名 参数类型,.) BEGIN 有效的SQL语句 END 其中IN、OUT、INOUT的含义: IN:输入参数,用来向过程传递数据。 OUT:输出参数,用来从过程返回数据。 INOUT:既可输入,也可输出。,例如,在MySQL中定义如下存储过程查询在博文表中有博文的分类名: DELIMITER create procedure findCategoryNames() begin select distinct a.category_title from yb_category a,yb_article b where a.category_id=b.category_id; end DELIMITER ;,调用存储过程 在Java中利用CallableStatement对象执行数据库中的存储过程。CallableStatement对象可以通过Connection对象的prepareCall()方法得到,该方法调用中需要用一个转义子句字符串参数。转义子句的语法如下: 没有返回值,没有参数。 call 存储过程名 没有返回值,有参数。 call 存储过程名(?,?,) 有返回值,有参数。 ?=call 存储过程名(?,?) 存储过程的返回值或输出参数需用registerOutParameter(int index,int sqlType)方法登记。,案例4-4 使用存储过程分页查询博文 修改YbArticleDao中的findSome()方法,使其通过调用存储过程查询博文。 技术要点 在MySQL中建立存储过程findArticles,该存储过程同时查出记录和记录总数。 通过Connection对象建立CallableStatement对象。 通过CallableStatement调用存储过程findArticles。 输入参数使用registerOutParameter方法注册。,4.5大对象的存取,大对象存储的基本方法 1. 读取大对象 在JDBC中有两个接口对应数据库中的BLOB和CLOB类型:java.sql.Blob和java.sql.Clob。ResultSet提供了读取BLOB和CLOB类型的方法getBlob()和getClob()。得到Blob或Clob的对象后,再进一步得到数据. 2. 存储大对象 以流的方式保存大对象。PreparedStatement中的两个方法可用来将大对象写入数据库: void setBinaryStream(int parameterIndex,InputStream x,int length):将标准输入流中的二进制数据写入数据库形成BLOB对象。 void setCharactorStream(int parameterIndex,Reader reader,int length):将Reader流中的字符数据写入数据库形成CLOB对象。,案例4-5 设计用户数据访问类YbUserDao 实现用户的数据访问类YbUserDao,用户的照片存储在数据库中。 技术要点 在YbUserDao的实现方法和YbArticleDao类似。 图像的存储采用字节数组的方法保存。,4.6 工厂模式与业务逻辑类设计,属性文件及其读取 属性文件 属性文件是一种特殊的文本文件,其扩展名一般为properties。这种文件由键值对构成,每个键值对的基本格式为: 键名 = 值,读写属性文件 在JAVA的包中,提供了专门用于操作属性文件的类,这个类就是 java.uitl.Properties类。Properties类继承自Hashtable类,采用键值对的存储方式,并有专门的读写方法来读写属性文件。读取属性文件的基本步骤: (1)将将文件读取到Properties类对象中。 Properties prop = new Properties();/属性集合对象 FileInputStream fis = new FileInputStream(“perties“);/属性文件流 prop.load(fis);/将属性文件流装载到Properties对象中 (2)使用Properties类提供的getProp

温馨提示

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

最新文档

评论

0/150

提交评论