已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JSP 编程开发技术 郑州大学软件学院 本次课的主要内容 vJDBC驱动程序的类型 JDBC-ODBC桥 部分本地API部分Java驱动程序 JDBC网络纯Java驱动程序 本地协议的纯Java驱动程序 v安装数据库 v下载Mysql JDBC驱动 vJDBC API 加载并注册数据库驱动 建立到数据库的连接 访问数据库 事务处理 可滚动和可更新的结果集 vJDBC数据源和连接池 vMysql对中文的处理 JDBC驱动程序类型 v JDBC驱动程序类型 JDBC-ODBC桥 Java应用程序 JDBC-ODBC桥ODBC层 JDBC API ODBC API 数据库 JDBC驱动程序类型 v JDBC驱动程序类型 部分本地API部分Java驱动程序 Java应用程序 JDBC-ODBC桥 JDBC API 厂商提供 的本地 API 数据库 JDBC驱动程序类型 v JDBC驱动程序类型 JDBC网络纯Java驱动程序 Java应用程序 JDBC驱动程序 本地驱动程序 JDBC API 数据库 应用服务器 JDBC驱动程序类型 v JDBC驱动程序类型 本地协议的纯Java驱动程序 Java应用程序 JDBC驱动程序 JDBC API 安装数据库Mysql v 安装Mysql数据库 推荐安装appserv-win32-2.5.9.zip AppServ 所包含的软件有:Apache、Apache Monitor、PHP、MySQL、PHP-Nuke、 phpMyAdmin 可以直接下载 下载Mysql JDBC驱动 v Mysql-connector-java-5.1.6 /downloads/connector JDBC API v Java程序通过JDBC操作数据库的过程 JDBC API v 一般情况下,使用JDBC访问数据库步骤 1、载入数据库驱动程序 2、与数据库建立连接 3、将SQL语句从Java程序发送到数据库 4、接收并处理从数据库返回的记录集,获取 所需的数据 5、操作结束,关闭连接 JDBC API v JDBC API JDBC API分为两个包:java.sql.*和javax.sql.* java.sql.*包定义了访问数据库的接口和类,是 jdbc2.0之前的东西。 javax.sql.*提供了很多新特性是对java.sql.*的补充 Datasource接口提供了一种可选择性的方式去建立连接 提供了连接池的支持 增加了分布式的事务处理机制 增加了rowset Class.forName(“com.mysql.jdbc.Driver”); Connection conn=DriverManager.getConnection(“jdbc:mysql:/localhost:3306/test”,”root”,”1234”); Statement stmt=conn.createStatement(); Resultset rs=stmt.executeQuery(“select * fron jobs”); JDBC API v加载并注册数据库驱动 Driver接口 java.sql.Driver是所有JDBC驱动程序需要实现的接口,这个接口是提供给数据 库厂商使用的 com.microsoft.jdbc.sqlserver.SQLServerDriver/sql2000 com.microsoft.sqlserverjdbcSQLServerDriver/sql2005 oracle.jdbc.driver.OracleDriver/oracle com.mysql.jdbc.Driver/Mysql Driver接口中提供了一个Connection()方法,用来建立到数据库的连接。 在程序中通过JDBC驱动程序管理器注册每个驱动程序,使用驱动程序管理器 提供的方法来建立数据库连接。而驱动程序管理器的连接方法则调用驱动程 序类的connect()方法建立数据库连接。 Java应用程序 JDBC驱动程序管理器 JDBC驱动程序 数据库 JDBC API v 加载并注册数据库驱动 加载与注册JDBC驱动 Java通过类Class的静态方法forName()载入数据库 驱动器程序 如果载入的是JDBC-ODBC桥驱动,可以直接使用 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”) 如果载入的是纯Jdbc驱动,则根据所连接的数据库的类型 ,使用不同的语句。 如果需要,可以建立一个driver的实例并利用 DriverManager类将其注册到系统中。 try DriverManager.registerDriver(new com.mysql.jdbc.Driver() ; catch(SQLException e) e.printStackTrace() JDBC API v 建立到数据库的连接 java.sql包提供了一个Connection类来管理与数据库的 连接 调用DriverManager类的getConnect()方法建立到数据 库的连接,并返回一个Connection对象 Connection conn=DriverManager.getConnection(“jdbc:mysql:/localhost:3306/te st”,”root”,”1234”); Connection 成员变量 Statement createStatement() PreparedStatement prepareStatement(String sql) boolean getAutoCommit() void setAutoCommit(boolean autoCommit) void commit(0 void rollback(0 void prepareCall(String callname) JDBC API v 访问数据库 访问数据库,实质上就是向数据库发送SQL语句,并获取SQL语 句的执行结果。 执行SQL语句,java.sql包提供了3个接口 Statement:用于执行简单的不含有参数的SQL语句 调用Connection对象的createStatement()方法创建Statement对象 PreparedStatement:用于执行带有IN参数的SQL语句 调用Connection对象的prepareStatement()方法创建PreparedStatement 对象 PreparedStatement对象所代表的SQL语句的参数用?表示,调用 PreparedStatement对象的setXXX()方法设置参数(XXX表示SQL参数的 类型)。setXXX()方法有两个参数,第一个设置SQL语句中参数的索引(从 1开始),第二个参数设置SQL语句中参数的值。 CallableStatement:用于执行SQL的存储过程。 调用Connection对象的prepareCall()方法创建CallableStatement对象 在执行存储过程之前,凡是存储过程中类型为OUT的参数必须注册(通过 CallableStatement对象的registerOutParameter()方法注册,然后通过 getXXX()取得值),类型为IN的参数可以通过setXXX()方法来设置参数的 值。 JDBC API v访问数据库 Statement提供了3种常用的执行SQL语句的方法 ResultSet executeQuery(String sql) 该方法执行给定的SQL语句,该语句必须为Select语句。返回ResultSet结果集。 int executeUpdate(String sql) 执行给定的SQL语句,该语句或者为Insert、Update或Delete等能对数据库引起更 新的语句,或者为不返回任何内容的SQL语句(如SQL DDL语句)。当执行的是 Insert、Update或Delete语句时,返回值表示影响的记录行数,若返回0,表示执行 的是不返回任何内容的SQL语句 boolean execute(String sql) 该方法执行返回对个结果集的SQL语句,可以执行任何SQL语句。当返回结果是 Result对象时,返回值为true,否则为false Int executeBatch() 该方法允许向数据库提交一批命令,然后一起执行。可以使用addBatch()方法将 SQL命令加入到命令列表。 PreparedStatement和CallableStatement也提供3种执行SQL语句的方法 :execute(),executeQuery(),executeUpdate(),注意这3个方法没有任何参 数 JDBC API v 实例1:网上书店(连接参数不写进web.xml) (1)利用程序创建数据库和表 CreateDBServlet.java,注意为了使表支持事 务处理,建表时需要指定ENGINE=InnoDB (2)编译 (3)部署 (4)配置Web应用程序 (5)配置JDBC驱动 (6)调用 JDBC API v 实例2:查询网上书店的数据ListServlet.java 将连接数据库的信息写在web.xml的 中,利用getServletContext()方法取得ServletContext 对象。 使用Javascript控制客户端显示 编译 部署 配置Web应用程序 配置JDBC驱动 调用 JDBC API v 实例3:PreparedStatement接口的运用 CreateAccountServlet.java 执行带参数的SQL 参数用?表示 程序需要使用setXXX(字段的索引值,字段的值)方法传 递值给参数 编译 部署 配置Web应用程序 配置JDBC驱动 调用 JDBC API v 实例4:CallableStatement接口的使用 创建mysql存储过程 传入in参数 取得out参数值 编译 部署 配置Web应用程序 配置JDBC驱动 调用 JDBC API vResultSet结果集 JDBC使用ResultSet对象来存储SQL语句执行的结果。ResultSet对象中 存放的是满足SQL语句执行条件的所有记录行,所以它是一个结果集。 ResultSet对象维护一个指向当前数据行的游标,初始的时候,游标在第 一行之前,通过next()方法移动游标到下一行。 ResultSet接口中定义了很多方法来获取当前行中列的数据,如 getString(int columnIndex) ResultSet 成员变量 boolean first() boolean next() boolean last() boolean previous() boolean close() String getString(String columnName) JDBC API v 元数据 在SQL中,用于描述数据库或者他的各个组成部分之一的数据称 为元数据。 在java.sql包中,利用接口ResultSetMetaData获取描述数据库表 结构的元数据。 调用ResultSet对象的getMetaData()方法来得到ResultSetMetaData 对象 在java.sql包中,利用接口DatabaseMetaData获取描述数据库信 息的元数据。 调用Connection对象的getMetaData()方法来得到DatabaseMetaData 对象 在java.sql包中,利用接口ParameterMetaData获取 PreparedStatement对象中的参数的类型和属性信息。 调用PreparedStatement对象的getParameterMetaData()方法来得到 ParameterMetaData对象 JDBC API v 实例5:元数据的应用GetDBInfoServlet.java 利用DatabaseMetaData接口和 ParemeterMetaData接口中定义的方法取得数 据库和表的信息。 编译 部署 配置Web应用程序 配置JDBC驱动 调用 JDBC API v 事务处理 事务是构成单个逻辑工作单元的操作集合。事务处理保证所有 的事务都作为一个工作单元来执行,即使出现了硬件故障或者 系统失灵,都不能改变这种执行方式。 当在一个事务中执行多个操作时,要么所有的操作都被提交 (commit),要么整个事务回滚(rollback)到最初的状态。 JDBC API v 事务处理 通过JDBC实现事务处理相对简单。只要将Connection对象的事务 提交模式setAutoCommit()方法设为false,那么所有被执行的SQL 语句都会在Connection对象的commit()方法被执行时才得到事务 确认。若有SQL语句执行失败,只要调用Connection类的 rollback()方法将事务回滚即可。 try class.forName(DBDriver); Connection conn=DriverManager.getConnection(constr,user,pass); conn.setAutoCommit(false); Statement stmt=conn.CreateStatement(); stmt.executeUpdate(sqlstr1); stmt.executeUpdate(sqlstr2); mit; stmt.close;conn.close; catch(Exception e) conn.rollback; 事务处 理 v 事务的隔离 为了避免多个事务同时访问同一份数据可能引发的冲 突,需要设置事务的隔离级别 事务隔离指的是数据库系统通过某种机制,在并行的 多个事务之间进行分离,使每个事务在其执行过程中 保持独立,如同当前只有此事务单独运行。 3个概念 脏读:一个事务读取了另外一个事务修改后还未提交到数据库 的数据(脏数据)。 不可重复读:一个事务在结束前第二次读取同一数据,但此时 该数据已被另一事务修改,因此读取的不是原来的数据内容。 幻读:一个事务读取所有数据后,发现凭空多出了在此期间被 另一事务插入的数据。 事务处 理 v事务的隔离 SQL标准4种事务隔离级别 Read Uncommitted:仅保证读取过程中不会读取到非法数据,这种级别不能 避免上述3种事务问题。 Read Committed:保证一个事务不会读到另一个并行事务已修改尚未提交的 数据(脏读) Repeatable Read:避免了脏读和不可重复读。 Serializable:避免了所有上述3种事务问题,即串行化执行事务。 Connection接口定义了setTransactionIsolation()方法,用于设定事务的 隔离级别,指定5个常量 TRANSACTION_NONE/不支持事务 TRANSACTION_READ_UNCOMMITTED/可以发生脏读、不可重复读和幻 读 TRANSACTION_READ_COMMITTED/禁止脏读,可以发生不可重复读和幻 读 TRANSACTION_REPEATABLE_READ/禁止脏读和不可重复读,可以发生 幻读 TRANSACTION_SERIALIZABLE/禁止脏读、不可重复读和幻读 代码:conn.setTransactionIsolation(TRANSACTION_SERIALIZABLE) 事务处 理 v 实例6:事务的应用:购书程序 TradeServlet.java JDBC API v 可滚动和可更新的结果集 可滚动的结果集 Connection对象的无参方法createStatement()所创建的结果集只能用 next()方法向前移动游标,无法自由滚动游标,因此可以使用有参方 法指定结果集的类型。 Statement createStatement(int resultSetType,int resultSetConcurrency) resultSetType用于指定结果集类型,有3种类型: ResultSet.TYPE_FORWARD_ONLY(只能向前移动), ResultSet.TYPE_SCROLL_INSENSITIVE(可以滚动,但对数据库 变化不敏感), ResultSet.TYPE_SCROLL_SENSITIVE(可以滚动 ,对数据库变化敏感) resultSetConcurrency用于指定并发性类型,有2种类型: ResultSet.CONCUR_READ_ONLY(结果集不能用于更新数据库), ResultSet.CONCUR_UPDATABLE(结果集可以用于更新数据库) JDBC API v 可滚动和可更新的结果集 可滚动的结果集 PreparedStatement在Connection接口中也提供了带参数的 prepareStatement()以实现可滚动的结果集。 PreparedStatement prepareStatement(String sql,int resultSetType,int resultSetConcurrency) 可以利用DatabaseMetaData接口提供的 supportsResultSetType(int type)和 supportsResultSetConcurrency(ont type,int concurrency)方法判 断JDBC驱动是否支持可滚动和可更新的结果集 JDBC API v 可滚动和可更新的结果集 可滚动的结果集 结果集滚动的方法 JDBC API v 可滚动和可更新的结果集 可更新的结果集 可以在创建Statement对象时,指定 ResultSet.CONCUR_UPDATABLE类型,这样创建 的结果集就是可更新的结果集。 更新一行:利用updateXXX()和updateRow()方法来更新 一行 插入一行:利用moveToInsertRow()、updateXXX()和 insertRow()来插入一行 删除一行:利用deleteRow()方法删除一行。 JDBC API v 实例7:可滚动和可更新结果集应用ScrollUpdate JDBC数据源和连接池 v 连接池的需求和实现原理 为什么需要数据库连接池 建立数据库连接需要耗费服务器资源 一个数据库服务器同时建立的连接数有限,如果连接过多 ,服务器反应不过来,容易造成服务器崩溃。 连接数多会造成数据库服务器的性能下降。 JDBC数据源和连接池 v连接池的需求和实现原理 数据库连接池 预先建立多个数据库连接对象,然后将连接对象保存到连接池中,当客户 请求到来时,从池中取出一个连接对象为客户服务,当请求完成后,客户 调用close()方法,将连接对象放回池中。 数据库连接池动态负责分配、管理和释放数据库连接。 连接池取出一个空闲的连接对象分配给客户的连接请求,若客户的请求连 接数超过连接池最大连接数量时,这些超额请求被加入到等待队列中。 JDBC数据源和连接池 vJNDI和数据源 JNDI:Java Naming and Directory Interface,一组帮助做多个命名和目录服务接口的API ,为程序开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。 JNDI提供的命名服务将名称和对象绑定在一起,使得可以通过名称访问对象,其服务的主 要功能就是通过一个名称“key”查找到对应的一个对象“value” 为了提高数据库连接池与客户程序的独立性,Sun制定了标准的数据源接口: javax.sql.DataSource,用于封装各种不同的数据库连接池 由于数据源对象和连接池对象都是由Web服务器提供的,不能通过在程序中实例化一个对 象的方式来获取数据源。因此,需要使用JNDI技术将数据源和名字绑定起来,通过数据源 的名字获取数据源对象的引用。 JDBC数据源和连接池 v JNDI和数据源 如下图,Web服务器所提供的实现了javax.sql.DataSource接 口的数据源对象通过JNDI技术和“JNDIName”名字绑定在一起 ,用户就可以通过“JNDIName”名字访问连接池对象,进而使 用连接池。 JDBC数据源和连接池 v 配置连接池为数据源 将连接数据库的JDBC驱动包放在tomcat安装目录的lib下面。 在元素中使用元素来配置JDBC数据源。 context元素可以在多个位置配置 如果应用程序不在tomcat的webapps目录下首先在server.xml(在 元素里增添元素)或者Catalinalocalhostxxx.xml(xxx为Web应用程 序名称)二者之一里配置,然后再在Web应用程序的web.xml里增加 元素。(注意应该首先设定Web应用程序的根目录docBase属性)。 如果应用程序在tomcat的webapps目录下,也需要先配置Web应用程序 的META-INFcontext.xml,然后再在Web应用程序的web.xml里增加元素。(注意需要去掉docBase等属性) JDBC数据源和连接池 v 使用数据源 数据源的操作使用JNDI的方式进行查找 1、初始化名称查找上下文:Context ctx = new InitialContext() 2、通过名称查找DataSource对象:DataSource ds = (DataSource) ctx.lookup(“java:comp/env/jdbc/mldn”)/java:comp/env/是一个环境命
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东南粤银行中山分行招聘笔试考试备考试题及答案解析
- 2025宁夏医科大学总医院下半年自主招聘备案人员补充考试笔试参考题库附答案解析
- 2025固原市原州区就业困难高校毕业生城镇公益性岗位招录51人考试笔试模拟试题及答案解析
- 2025年吉林省国资委监管企业招聘(1214人)笔试考试参考试题及答案解析
- 2025湖南益阳南县城乡发展投资有限公司招聘1人考试笔试备考题库及答案解析
- 2025辽宁丹东宽甸满族自治县融媒体中心面向普通高校招聘急需紧缺人才11人笔试考试备考试题及答案解析
- 2025广东广州市卫生健康委员会直属事业单位广州医科大学附属中医医院招聘13人(第一批)笔试考试参考题库及答案解析
- 2025重庆渝中区人民政府两路口街道办事处招聘公益岗笔试考试备考试题及答案解析
- 2026上汽大乘用车校园招聘笔试考试参考题库及答案解析
- 2025广东湛江市坡头区代建项目中心编外人员招聘1人笔试考试备考试题及答案解析
- 2025年等保测评初级测评师考试题库及答案
- 电焊烟尘安全培训课件
- 乌鲁木齐冬季施工方案
- 消防工程消防水灭火系统施工方案
- 2025湖南张家界桑植县交通旅游建设投资集团有限公司招聘考试参考题库及答案解析
- 2025-2026学年人教版(2024)七年级地理第一学期第一章 地球 单元测试(含答案)
- 俄语对外一级考试题目及答案
- 口腔内科学模板课件
- 监狱消防培训知识内容课件
- 练体裁 散文(真题练习)-2026版语文高三一轮复习
- 无损检测安全培训知识课件
评论
0/150
提交评论