5数据库访问技术学习目标了解JDBC连接数据库的方式。掌握JDBC-ODBC桥接数据库的方法。掌握JDBC连接数据常用的接口。学会用Java Bean封装数据库操作类连接数据库。了解数据库连接池的工作原理,掌握创建数据库连接池。5.1 Java Web中访问数据库在Jav aBean章节应用开发实例中,应用集合HashMap存放学生对象,当Tomcat服务器重新启动时,所有的数据将丢失。真实项目设计中 ,涉及到多个数据表,数据量大,表之间的关联多,应用集合存储数据也不能满足要求,这就需要应用数据库。JDBC作为Java Web访问 数据库最直接的方式,为数据库访问提供了一组用Java语言编写的类和接口。5.1.1 JDBC简介Java数据库连接(Java Da tabase Connectivity)简称JDBC,是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查 询和更新数据库中数据的方法。我们通常说的JDBC是面向关系型数据库的,在关系数据库的“对象/关系”映射中,表中的每行对应于类的一个 实例,而每列的值对应于该实例的一个属性。程序员可直接对Java对象进行操作,存取数据所需的SQL调用将在“掩盖下”自动生成。此外还 可提供更复杂的映射,例如将多个表中的行结合到一个Java类中。5.1.1 JDBC简介JDBC的特点是与任何关系型数据库协同工作的 方式完全相同,也就是说,使用JDBC后没有必要为访问SQL Server数据库写一个程序,而为访问Oracle数据库再写另一个专门 的程序。同时,将Java语言和JDBC结合起来,使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运 行,这也是Java语言“编写一次,处处运行”的优势。5.1.2 JDBC连接数据库的方式数据库建立连接发送操作数据库的SQL语句处 理结果关闭与数据库的连接方式1:JDBC-ODBC桥利用JDBC-ODBC桥,ODBC驱动程序对JDBC访问。我们可以使用JDBC API通过ODBC去访问数据库,它实际上是把标准的JDBC调用转换成相应的ODBC调用,并通过ODBC把它们发送给ODBC数据源 。方式2:本地API这种驱动程序由部分Java程序和特定厂商的本地API组成。在程序中利用JDBC API访问数据库,JDBC驱动 程序将调用请求转换成厂商提供的本地API调用。请求处理后,这些API将结果返回给JDBC驱动程序,由JDBC驱动程序负责将结果转换 成JDBC标准形式后返回给客户端程序。方式3:JDBC网络纯Java驱动程序这种驱动程序将JDBC转换为与DBMS无关的网络协议, 之后这种协议又被某个服务器转换为一种DBMS协议。网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上,这是最为灵活 的JDBC驱动程序方式4:本地协议纯Java驱动程序这种驱动程序完全用Java编写,将JDBC调用直接转换为DBMS所使用的网络协 议。这将允许从客户机上直接调用DBMS服务器。由于许多这样的协议都是专用的,因此数据库提供者自己是主要来源。5.2 JDBC与OD BCMicrosoft的ODBC API可能是使用最广的、用于访问关系数据库的编程接口,它能在几乎所有平台上连接几乎所有的数据库。 ODBC定义了访问数据库API的一组规范,这些API独立于形色各异的DBMS和编程语言。一个基于ODBC的应用程序,对数据库的操作 不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。例题5-1,以Windows 7系统为例,配置SQL Server系统数据源。1.打开控制面板,找到【管理工具】,并打开2.在【管理工具】页面找到【ODBC数据 源】并打开3.找到“系统DSN”,选择“添加”按钮 4.在弹出的【创建新数据源】界面,选中“SQL Server”5. 【创建到S QL Server的新数据源】界面填写数据源 6. 设置SQL Server数据库管理系统中的数据库xinxi7.测试数据源并添加 数据源5.3 JDBC的数据库编程5.3.1 JDBC常用接口1. Driver接口不同数据库厂商提供不同实现的驱动类:SQL S erver 2000:com.microsoft.jdbc.sqlserver.SQLServerDriverSQL Server 2008:com.microsoft.sqlserver.jdbc.SQLServerDriverSQL Server 2017 :com.microsoft.sqlserver.jdbc.SQLServerDriverOracle:oracle.jdbc.d river.OracleDriverMySQL:com.mysql.jdbc.DriverJDBC-ODBC数据库连接驱动类:su n.jdbc.odbc.JdbcOdbcDriver加载数据库驱动的语句:Class.forName(“驱动类”);2.Drive rManager类static Driver getDriver(String url) throws SQLException尝 试查找给定URL的驱动程序。DriverManager尝试从一组已注册的JDBC驱动程序中选择适当的驱动程序。static Con nection getConnection(String url) throws SQLException尝试建立与给定数据库UR L的连接。 Connection con=DriverManager.getConnection(url,“user ”,“password”); user - 数据库用户,连接是为该用户建立的。 password - 数据库用户的密码。2.DriverManager类url用于标识数据库位置,常用数据库url地址的写法:SQL Server: j dbc:microsoft:sqlserver://localhost:1433;DatabaseName=“数据库名称”Orac le: jdbc:oracle:thin:@localhost:1521:“数据库名称” MySql: jdbc:mysql:// localhost:3306/“数据库名称”3.Connection接口Connection接口用于代表数据库的连接,Collec tion是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法:Stat ement createStatement() throws SQLExceptionPreparedStatement prep areStatement(String sql) throws SQLExceptionCallableStatement pre pareCall(String sql) throws SQLException3.Connection接口void close( ) throws SQLException:立即释放此 Connection 对象的数据库和JDBC 资源,要主动执行close( )方法,不要等待它们被自动释放。 void commit() throws SQLException:使所有上一次提交进行的更改成 为持久更改。void rollback() throws SQLException取消在当前事务中进行的所有更改,并释放此 Con nection 对象当前持有的所有数据库锁。4.Statement接口在建立与数据库的连接后需要对数据库进行访问,Statemen t接口用于执行不带参数的简单SQL语句,用来向数据库提交SQL语句交返回SQL语句的执行结果。创建了Statement接口的实例后 ,可调用其中的方法执行SQL语句,JDBC中提供了三种执行方法。executeUpdate()。executeQuery()exe cute()(1)executeUpdate()int executeUpdate(String sql) throws SQLE xception:执行给定 SQL 语句,该语句可能为INSERT、UPDATE或DELETE语句,或者不返回任何内容的SQL语句 。例如:st.executeUpdate(“UPDATE SCORE SET C_SCORE=99 WHERE age=20”); 该语句将数据表中年龄为20的行中C_SCORE值改成99,如果该语句带来了三行记录的修改,则返回影响的行数3,如果没有对任何行产生 影响,则返回值为0。(2)executeQuery()ResultSet executeQuery(String sql) thr ows SQLException:执行给定的 SQL 语句,通常为静态SQL SELECT语句,该语句返回单个ResultSet对 象。例如:st.executeQuery(“select from SCORE WHERE age=20”);该语句将查询到的 年龄20岁的所有行放入ResultSet对象。(3)execute()boolean execute(String sql) th rows SQLException:一般是在用户不知道执行SQL语句后会产生什么结果或可能有多种类型的结果产生时才会使用。exec ute()的执行结果包括包含多个ResultSet、多条记录被影响、既包含结果集也有记录被影响三种情况。5.PreparedSta tement接口PreparedStatement接口继承了Statement接口,但它包含了经过预编译的SQL语句,因此获得更高 的执行效率。在PreparedStatement语句中可以包含多个用“?”代表的字段,在程序中可以利用setXXX方法设置该字段的 内容,从而增强了程序设计的动态性。PreparedStatement pstmt=conn.prepareStatement(“U PDATE SCORE SET C_SCORE=? WHERE ID=?”);pstmt.setInt(1,100); //设置第 一个字段C_SCORE值为100 pstmt.setInt(2,1001); //设置第二个字段ID值为10016.Callabl eStatement接口CallableStatement接口继承了PreparedStatement接口用于执行数据库的存储过程 。在CallableStatement对象中,有一个通用的成员方法call,这个方法用于以名称的方式调用数据库中的存储过程。7.R esultSet接口ResultSet对象包含了executeQuery方法中SELECT查询的结果集,即符合指定SQL语句中条件 的所有行。ResultSet对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,用于移动到ResultSet中的下一行,使下一行成为当前行。ResultSet提供的都是用于获取数据的get方法:获取任意类 型的数据:getObject(int index)或getObject(string columnName)获取指定类型的数据:g etString(int index)或getString(String columnName)5.3.2 用JavaBeans封 装数据库访问操作访问数据库时一系列操作:设置驱动程序,连接数据库,生成一条语句,进行SQL操作,最后断开连接。首先要装载并注册数据 库的JDBC驱动程序例题5-2,编写数据库访问的JavaBeanConnection con=null; Statement s t=null; ResultSet rs=null;Class.forName("com.microsoft.sqlserve r.jdbc.SQLServerDriver");con=DriverManager.getConnection("jdbc:sq lserver://localhost:1433;databaseName=student", "sa", "123456");s t=con.createStatement();rs=st.executeQuery("select from xs");wh ile(rs.next()){ System.out.println("学号:"+rs.getString(1)+"姓名:" +rs.getString(2) +"年龄:"+rs.getString(3)+"性别:"+rs.getString(4) );}5.3.3 实例:JavaBean+Jdbc技术实现用户登录public class ConnectDbase { priv ate String diverName ="com.microsoft.sqlserver.jdbc.SQLServerDriv er"; String url1 = "jdbc:sqlserver://localhost:1433;databaseName =login"; private String userName = "sa"; private String userPwd = "123456"; Connection conn; public Connection getConnect() { t ry {Class.forName(diverName); conn = DriverManager.getConnection (url1,userName,userPwd); } catch (SQLException e) { e.printStackTrace(); } return conn;} }2.编写User.java,创 建查询,返回是否查找到相关信息public class User { private String name = null; private String password = null; public String getName() {return name;} public void setName(String name) {this.name = name;} publi c String getPassword() {return password;} public void setPassword (String password) {this.password = password;} public boolean yanz heng_user(String xm2, String mm2) throws Exception { boolean f = false; ConnectDbase cdb = new ConnectDbase(); Connection conn = cdb.getConnect(); PreparedStatement pstmt = conn.prepareStatem ent("select from denglu where name=? and password=?"); pstmt.s etString(1, xm2); pstmt.setString(2, mm2); ResultSet rs = pstmt. executeQuery(); if (rs.next()) f = true; else f = false; return f;} }3.编写input.html,显示登录页面<%@ page language="java" p ageEncoding="GB2312" %> 用户登录页面 < /head> 4.编写show.jsp,显示登录结果 <%request.setCharacterEncoding("gbk");%> eBean id="us" class="com.db.User" scope="page"> :setProperty name="us" property="" /> <%if (us.ya nzheng_user(us.getName(), us.getPassword())){%> <%=us.getName()% >:登录成功! <%} else { %> <%=us.getName()%>:登录失败! <% } %> 测试程序当用zhangsan账号和对应密码登录时,登录成功当用li si账号和对应密码登录时,登录失败5.4 数据库连接池的访问类实现5.4.1 为什么使用数据库连接池每次创建和断开Connecti on对象都会消耗一定的时间和IO资源,频繁地创建、断开数据库连接势必会影响数据库的访问效率,如果访问数据库的次数过于频繁,这个过程 就会非常浪费系统资源,并直接影响运行速度。为了避免频繁的创建数据库连接,提出了数据库连接池技术,系统可以通过连接池来实现对数据库的 访问。5.4.2 数据库连接池的工作原理一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池” 中取出一个连接,使用完毕之后再放回去。数据库连接池的优缺点数据库连接池的优点:创建一个新的数据库连接所耗费的时间主要取决于网络的速 度以及应用程序和数据库服务器的(网络)距离,而且这个过程通常是一个很耗时的过程。而采用数据库连接池后,数据库连接请求可以直接通过连 接池满足而不需要为该请求重新连接到数据库服务器,这样就节省了时间,提高了性能。数据库连接池的缺点:服务器启动就会创建一定数量的数据 库连接,项目实施中,数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库,这意味着资源的浪费。5.4.3 创建连接池进行数 据库访问 1.在项目中的META-INF文件夹中创建context.xml文件 ng="UTF-8"?> rce name="jdbc/student" auth="Container" type="javax.sql.DataSour ce"driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DataBaseName=student" usern ame="sa" password="123456" maxActive="100" maxIdle="30" maxWait=" 1000" />2.打开WEB-INF下的Web.xml文件 iption>NorthWind jdbc/wshopDa ta javax.sql.DataSource Container 3.把JDBC驱动拷贝到WEB-I NF下的lib里4.测试代码 <%DataSource ds = null; In itialContext ctx = new InitialContext(); ds = (DataSource)ctx.loo kup("java:comp/env/jdbc/student"); Connection conn = ds.getConnec tion(); Statement stmt = conn.createStatement(); String strSql = "SELECT FROM xsxx"; ResultSet rs = stmt.executeQuery(strSql); w hile (rs.next()) { %> 学号:<%=rs.getString(1)%> | 姓名: ><%=rs.getString(2)%> | 年龄:<%=rs.getString(3)%> | 性别: ><%=rs.getString(4)%> | <%}%> 5.5数据库访问技术应用开发实例设计一个具备增删查改功能的商品管理系统项目,商品信息包含编号(自动编号),商品大类,商品名称和商品 单价。5.5数据库访问技术应用开发实例1.应用JavaBean技术编写连接和操作数据库的类db.java2.编写showgoods.jsp页面,显示所有商品3.编写add.jsp页面,添加商品4.编写del.jsp页面,删除所选商品5.编写edit.jsp页面,更改已有商品信息6.编写update.jsp页面,更新edit.jsp页面提交的商品信息详见课本代码showgoods.jsp页面数据分页在页面显示信息时,创建一个良好的浏览环境,就需要把查询的信息分页以方便用户查看,这就是数据分页技术。分页的基本步骤:(1)初始化,如设定每页显示数据记录行数。(2)从数据库提取要显示的数据。(3)确定总页数,将游标定位到最后,然后用getRow()方法取得总数。(4)确定要显示的当前页为第几页。(5)定位数据集到要显示页,数据集的absolute()方法可以定位游标。(6)循环显示当前页的所有记录。(7)输出导航信息,即显示首页、末页、上一页、下一页链接等信息。小 结本章学习了JDBC的基本原理,通过JDBC-ODBC桥接和JDBC专用驱动两种连接数据库的方式;学习了连接数据库的步骤及DriverManager类、Connection接口、Statement接口、ResultSet接口;利用executeQuery()方法查询数据库,利用executeUpdate()方法更新数据库,利用PreparedStatement预编译SQL语句,利用CallableStatement执行存储过程;在商品管理系统案例中,实现了页面的分页功能。 |
|