j14Model层的开发:高级JDBC练习.ppt_第1页
j14Model层的开发:高级JDBC练习.ppt_第2页
j14Model层的开发:高级JDBC练习.ppt_第3页
j14Model层的开发:高级JDBC练习.ppt_第4页
j14Model层的开发:高级JDBC练习.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第14讲,Model层的开发:高级JDBC练习,回顾,为什么使用MVC设计模式?MVC设计模式各部分对应的组件是什么?MVC各部分间是如何协作的?,本讲问题,什么是JNDI?如何理解连接池?如何理解DAO类?,本讲任务,修改E-Book电子书店系统增加通过JNDI查找数据源的功能,会使用JNDI获取数据源理解数据库连接池会读取基于属性文件的数据库配置信息掌握通用的DAO类会使用自定义异常,本讲目标,MVC的Model层,1、如何理解MVC中的Model?,MVC设计模式模型-Model视图-View控制器-Controller,MVC对象,控制器,模型,视图,?,JSP,Servlet,Model层主要是进行业务逻辑处理、访问数据库和封装数据,企业级开发对Model层的要求,企业级开发需要稳健和高效的数据访问层完成对数据库的CRUD操作能够处理数据库发生的各种错误可以灵活的修改配置提供方便使用的工具高性能,数据库,请求,响应,操作,结果,要求高效、稳健的数据访问层,打开连接,操作数据库,关闭连接,多次重复操作,传统的JDBC已经无法满足需求,那怎么办呢?,数据库连接池,普通电话-建立连接,等待回应热线电话-已建立连接,连接,已连接,开始通话,开始通话,已连接,直接通话,连接中,流程框架图表示使用规范,连接池中的连接,数据库,想要获得连接,返回一个连接,返回一个已连接好的空闲连接,应用程序从连接池中获得连接,连接池是由容器提供的,用来管理池中连接对象,应用程序,连接池,数据源简介,数据源(DataSource)javax.sql.DataSource接口负责建立与数据库的连接从Tomcat的数据源获得连接把连接保存在连接池中,应用程序,Connection1,Connection2,Connection3,数据库,想要获得连接,返回一个连接,连接池,连接池中的连接对象是由谁创建的呢?,JNDI介绍,如何获得DataSource对象数据源由Tomcat提供,不能在程序中创建实例使用JNDI获得DataSource引用什么是JNDIJNDI(JavaNamingandDirectoryInterface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的APIjavax.namming.Context接口的lookup()方法,应用程序,jdbc/s1,jdbc/s2,数据源,数据源名称,Connection,context.lookup(jdbc/s1),使用JNDI获取连接对象,importjavax.naming.Context;importjavax.naming.InitialContext;importjavax.naming.NamingException;importjavax.sql.DataSource;publicclassTitlesBeanpublicListgetTitles()tryContextic=newInitialContext();DataSourcesource=(DataSource)ic.lookup(java:comp/env/jdbc/books);Connectionconnection=source.getConnection();titlesQuery=connection.prepareStatement(SELECT*FROMtitles);ResultSetresults=titlesQuery.executeQuery();/为BookBean对象的属性赋值,并添加到titlesList中catch(SQLExceptionexception)exception.printStackTrace();catch(NamingExceptionnamingException)namingException.printStackTrace();finallycloseConn();,使用JNDI和数据源要导入的包,通过Context、DataSource获取Connection对象,分为两部分java:comp/env为JavaEE默认路径jdbc/books为DataSource名,定义JNDI异常,演示示例1:JNDI的使用TitlesBean.java,JNDI的配置,Tomcat的conf/context.xml中的配置,JNDI的配置,加入数据库驱动文件把数据库驱动的.jar文件,加入到Tomcat的lib中应用程序的web.xml文件的配置在web.xml中配置,jdbc/booksjavax.sql.DataSourceContainer,指定JNDI的名字,与元素中的name一致,指定引用资源的类名,与元素中的type一致,指定管理所引用资源的Manager与元素中的auth一致,常见错误,1、CannotloadJDBCdriverclass,这是什么错误?,通过数据源访问数据库,由于数据源由Tomcat创建并维护,所以必须把JDBC驱动程序拷贝到Tomcat的lib目录下。,代码框图表示使用规范,2、CannotcreateJDBCdriverofclassforconnectURLnull,DataSourcesource=(DataSource)ic.lookup(java:comp/env/jdbc/books);connection=source.getConnection();titlesQuery=connection.prepareStatement(“SELECT*FROMtitles);,要一致,这是什么错误?,TitlesBean.java,context.xml,常见错误,3、NamejdbcisnotboundinthisContext,DataSourcesource=(DataSource)ic.lookup(/jdbc/books);connection=source.getConnection();,这是什么错误?,参数错误,应该是java:comp/env/jdbc/books,JNDI小结,如何配置JNDI?如何通过JNDI获得数据库连接对象?JNDI相比JDBC有什么优点?,数据库的配置,关于数据库的配置把配置信息写在代码中把配置信息存储在perties文件中,privatestaticfinalStringDRIVER_CLASS=com.microsoft.sqlserver.jdbc.SQLServerDriver;privatestaticfinalStringDATABASE_URL=jdbc:sqlserver:/localhost:1433;DatabaseName=books;privatestaticfinalStringDATABASE_USRE=sa;privatestaticfinalStringDATABASE_PASSWORD=;publicstaticConnectiongetConnction()ConnectiondbConnection=null;tryClass.forName(DRIVER_CLASS);dbConnection=DriverManager.getConnection(DATABASE_URL,DATABASE_USRE,DATABASE_PASSWORD);catch(Exceptione)e.printStackTrace();returndbConnection;,数据库的配置信息,如果数据库信息改变,要重新进行编译,程序才能正确执行。,driver=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver:/localhost:1433;DatabaseName=booksuser=sapassword=sa,以键值对的形式存储数据,中间用=分隔,基于属性文件的数据库配置,从属性文件中读取配置信息,publicfinalclassEnvextendsPropertiesprivatestaticEnvinstance;publicstaticEnvgetInstance()if(instance!=null)returninstance;elsemakeInstance();returninstance;privatestaticsynchronizedvoidmakeInstance()if(instance=null)instance=newEnv();privateEnv()InputStreamis=getClass().getResourceAsStream(/perties);tryload(is);is.close();catch(Exceptione)e.printStackTrace();,Java用来操作.properties文件的类,静态方法可以通过类名直接调用,同步方法,在同一时间,只允许一个人调用,保证安全性,把.properties文件内容加裁到对象中,创建ConnectionManager来读取属性信息,/读出配置信息StringdriverClassName=Env.getInstance().getProperty(driver);Stringurl=Env.getInstance().getProperty(url);Stringuser=Env.getInstance().getProperty(user);Stringpassword=Env.getInstance().getProperty(password);其它代码与以前所写的代码一样,Class与Object(2-1),Class总结forName(StringclassName);getResourceAsStream(StringfileName);查找具有给定名称fileName的资源返回InputStream或者null(如果没有找到),应用程序,Class,className,调用Class.forName(className),返回className类的对象,Object,forName,Class与Object(2-2),回顾Object类Object是类层次结构的根类。每个类都继承了Object类。所有对象(包括数组)都具有这个类的方法Object类的常用方法toString()返回该对象的字符串表示equals(Objectobj)判断某个对象是否与此对象“相等”,自定义异常,为什么需要自定义异常,./取得数据库配置信息tryClass.forName(driverClassName);con=DriverManager.getConnection(url,user,password);catch(Exceptionex)thrownewDBAccessException(不能取得数据库连接!);returncon;./操作数据库,publicclassDBAccessExceptionextendsExceptionprotectedThrowablethrowable;publicDBAccessException(Stringmessage)super(message);publicDBAccessException(Stringmessage,Throwablethrowable)super(message);this.throwable=throwable;,让操作人员读懂异常原因,出错信息友好提示,常见错误,属性文件的路径错误,这是什么错误?,privateEnv()InputStreamis=getClass().getResourceAsStream(perties);tryload(is);catch(Exceptione)e.printStackTrace();,应该是“/perties,Env.java,通用的DAO类,publicclassSQLCommandBeanprivateConnectionconn;privateStringsqlValue;privateListvalues;publicvoidsetConnection(Connectionconn)this.conn=conn;publicvoidsetSqlValue(StringsqlValue)this.sqlValue=sqlValue;publicResultexecuteQuery()throwsSQLException./执行查询privatevoidsetValues(PreparedStatementpstmt,Listvalues)throwsSQLException./设定语句的参数,SQLCommandBean.java,通过set方法进行属性的设置,通过setValues()方法,进行SQL参数的设置,在DAO类中对数据库的查询和修改(增、删、改)的操作,演示示例2:SQLCommandBean.java,通用DAO类的测试,/测试类的main方法publicstaticvoidmain(Stringargs)throwsDBAccessException,SQLExceptionSQLCommandBeansqlCommandBean=newSQLCommandBean();sqlCommandBean.setConnection(ConnectionManager.getConnection();Stringsql=SELECT*FROMtitlesWHEREprice?andcopyright?);sqlCommandBean.setSqlValue(sql);Listvalues=newArrayList();values.add(newDouble(60.00);values.add(newInteger(1997);sqlCommandBean.setValues(values);Resultresult=sqlCommandBean.executeQuery();/判断结果是否为null,通过setValues()方法,进行SQL语句中参数的设置,调用DAO类中查询数据的方法,返回Result,TestSQLCommBean.java,DAO的测试类,演示示例3:TestSQLCommBean.java,Result与ResultSet,Result与ResultSet的区别ResultSet是java.sql.ResultSet接口,表示数据库结果集的数据Result是javax.servlet.jsp.jstl.sql.Result接口,用来迭代SQL查询的结果(在JSTL中),publicResultexecuteQuery()throwsSQLExceptiontrystmt=co

温馨提示

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

评论

0/150

提交评论