j14Model层的开发:高级JDBC练习.ppt

上传人:tia****nde 文档编号:11496704 上传时间:2020-04-25 格式:PPT 页数:31 大小:3.05MB
返回 下载 相关 举报
j14Model层的开发:高级JDBC练习.ppt_第1页
第1页 / 共31页
j14Model层的开发:高级JDBC练习.ppt_第2页
第2页 / 共31页
j14Model层的开发:高级JDBC练习.ppt_第3页
第3页 / 共31页
点击查看更多>>
资源描述
第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有什么优点?,数据库的配置,关于数据库的配置把配置信息写在代码中把配置信息存储在db.properties文件中,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(/db.properties);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(db.properties);tryload(is);catch(Exceptione)e.printStackTrace();,应该是“/db.properties,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=conn.createStatement();rs=stmt.executeQuery(sqlValue);result=ResultSupport.toResult(rs);catch(Exceptione)finallyrs.close();stmt.close();returnresult;,把ResultSet转换为Result,操作ResultSet时,必须与数据库连接,而Result不用,SQLCommandBean.java,Result的使用,从Result中读取数据,Resultresult=sqlCommandBean.executeQuery();if(result=null|result.getRowCount()=0)System.out.println(没有书籍!);elsefor(inti=0;iresult.getRowCount();i+)Maprow=result.getRows()i;BookBeanbook=newBookBean();book.setTitle(String)row.get(title);/设置其它属性值titlesList.add(book);,TitleBean3.java,每行数据对应一个Map,在Map中根据字段名取出值,把封装好的对象,保存在List中,演示示例4:TitleBean3.java,自定义异常小结,为什么要自定义异常?请实现一个数据库连接失败的自定义异常,总结,为什么使用JNDI?到目前为止连接数据库有几种方式?说明从.properties文件中读取数据的步骤?为什么需要自定义异常?,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!