JDBC技术
JAVA程序连接数据库的两种方式:
1.JDBC-ODBC桥接方式:使用ODBC提供的数据库连接技术访问数据库,在开发中此方法肯定不用,因为性能较低,可移植性不好。
2.JDBC驱动链接:由各数据库生产厂家提供驱动程序。
首先,简单说明一下JDBC-ODBC桥接方式的使用。建立好数据库和表后,要配置ODBC数据源,数据源名称是程序中真正使用的名称,ODBC通过一个数据源名称来访问数据库。
JDBC-ODBC的驱动由SUN提供:sun.jdbc.odbc.JdbcOdbcDriver
连接的URL固定:jdbc:odbc:数据源名称
我们主要需要掌握并应用的是JDBC连接数据库的方式。
JDBC操作步骤:
1. 加载驱动程序:
Class.forName("数据库驱动程序") //由数据库厂商提供
驱动程序放在tomcat的lib文件夹下
2. 连接数据库
Connection conn = DriverManager.getConnection("数据库连接地址","用户名","密码")
3. 操作数据库,使用Statement或PreparedStatement
4. 关闭数据库
以Oracle10g为例:
Oracle驱动程序名称:oracle.jdbc.driver.OracleDriver
Oracle的连接地址:jdbc:oracle:thin:@localhost:1521:全局数据库名
以MySQL为例:
MySQL驱动程序名称:com.mysql.jdbc.Driver
MySQL的连接地址:jdbc:mysql://localhost:3306/数据库名
另外,使用Statement对象执行SQL语句有两种方法
stmt.executeUpdate(sql):INSERT,DELETE,UPDATE
stmt.executeQuery(sql):SELECT使用,返回ResultSet实例化对象
所有的数据库连接在操作完之后必须关闭,释放资源,关闭顺序为:
ResultSet Statement Connection
连接Oracle10g范例:
<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%-- 使用JDBC连接Oracle数据库 使用TESTDB数据库 用户名:imti 密码:123456 --%> <% String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; String DBUSER = "imti" ; String DBPASSWORD = "123456" ; Connection conn = null ; Statement stmt = null ; %> <% try { Class.forName(DBDRIVER) ; conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; stmt = conn.createStatement() ; out.println("数据库连接成功"); stmt.close() ; conn.close() ; } catch(Exception e) { out.println(e) ; } %> |
连接MySQL范例:
<%@page contentType="text/html;charset=gb2312" import="java.sql.*"%> <HTML> <HEAD> <TITLE>JDBC连接</TITLE> </HEAD> <BODY> <%-- 使用JDBC连接MySQL数据库 数据库名:test 用户名:niexin 密码:niexin --%> <% String DBDRIVER = "com.mysql.jdbc.Driver" ; String DBURL = "jdbc:mysql://localhost:3306/test" ; String DBUSER = "niexin" ; String DBPASSWORD = "niexin" ; Connection conn = null ; Statement stmt = null ; %> <% try { Class.forName(DBDRIVER) ; conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; stmt = conn.createStatement() ; out.println("数据库连接成功"); stmt.close() ; conn.close() ; } catch(Exception e) { out.println(e) ; } %> </BODY> </HTML> |
上例的运行可以成功连接上数据库,但对于SELECT的SQL语句,要使用ResultSet处理查询数据库结果。
// 查询返回的结果集对象 ResultSet rs = null ; stmt = conn.createStatement() ; // 编写查询的SQL语句 sql = "SELECT sno,sname,ssex,sage,sdept FROM student" ; // 查询数据库,此方法返回ResultSet对象 rs = stmt.executeQuery(sql) ; while(rs.next()) { String no = rs. getString (1) ; String name = rs.getString(2) ; String sex = rs.getString(3) ; int age = rs.getInt(4) ; String dept = rs.getString(5) ; } |
使用getXXX()方法可以得到不同类型的结果值,参数可以是字段名或编号
查询记录
范例:查询表中的记录并使用表格来处理显示结果。
<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%-- 使用JDBC连接Oracle数据库 使用TESTDB数据库 用户名:imti 密码:123456 --%> <% String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; String DBUSER = "imti" ; String DBPASSWORD = "123456" ; Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; String sql = null ; %> <% try { Class.forName(DBDRIVER) ; conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; stmt = conn.createStatement() ; sql = "SELECT sno,sname,ssex,sage,sdept FROM student" ; rs = stmt.executeQuery(sql) ; %> <table border="1" width="80%"> <tr> <td>学号</td> <td>姓名</td> <td>性别</td> <td>年龄</td> <td>院系</td> </tr> <% while(rs.next()) { String no = rs. getString (1) ; String name = rs.getString(2) ; String sex = rs.getString(3) ; int age = rs.getInt(4) ; String dept = rs.getString(5) ;
%> <tr> <td><%=no%></td> <td><%=name%></td> <td><%=sex%></td> <td><%=age%></td> <td><%=dept%></td> </tr> <% } %> </table>
<% rs.close() ; stmt.close() ; conn.close() ; } catch(Exception e) { out.println(e) ; } %> |
添加记录
范例:用户填写表单,提交数据存入数据库
<form action="index.jsp" method="post"> 学号<input type="text" name="no"><br> 姓名:<input type="text" name="name"><br> 性别<input type="text" name="sex"><br> 年龄:<input type="text" name="age"><br> 院系<input type="text" name="dept"><br> <input type="submit" value="增加"> </form> |
index.jsp
<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%-- 使用JDBC连接Oracle数据库 使用TESTDB数据库 用户名:imti 密码:123456 --%> <% String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; String DBUSER = "imti" ; String DBPASSWORD = "123456" ; Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; String sql = null ; %> <% // 接收表单参数 // 处理乱码 request.setCharacterEncoding("gb2312") ; String no = request.getParameter("no") ; String name = request.getParameter("name") ; String sex = request.getParameter("sex") ; String age = request.getParameter("age") ; String dept = request.getParameter("dept") ; int iage = Integer.parseInt(age) ;
try { Class.forName(DBDRIVER) ; conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; stmt = conn.createStatement() ; sql = "INSERT INTO student VALUES ('"+no+"','"+name+"','"+sex+"',"+iage+",'"+dept+"')" ; System.out.println(sql) ; stmt.executeUpdate(sql) ; stmt.close() ; conn.close() ; } catch(Exception e) { out.println(e) ; } %> |
删除记录
范例:用户输入想删除的记录,执行删除
<form action="index.jsp" method="post"> 学号<input type="text" name="no"><br> <input type="submit" value="删除"> </form> |
index.jsp
<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%-- 使用JDBC连接Oracle数据库 使用TESTDB数据库 用户名:imti 密码:123456 --%> <% String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; String DBUSER = "imti" ; String DBPASSWORD = "123456" ; Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; String sql = null ; %> <% String no = request.getParameter("no") ; try { Class.forName(DBDRIVER) ; conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; stmt = conn.createStatement() ; sql = "DELETE FROM student WHERE sno='"+no+"'" ; System.out.println(sql) ; stmt.executeUpdate(sql) ; stmt.close() ; conn.close() ; } catch(Exception e) { out.println(e) ; } %> |
修改记录
范例:用户输入想修改的学生信息。
<form action="index.jsp" method="post"> 学号<input type="text" name="no"><br> 院系<input type="text" name="dept"><br> <input type="submit" value="修改"> </form> |
index.jsp
<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%-- 使用JDBC连接Oracle数据库 使用TESTDB数据库 用户名:imti 密码:123456 --%> <% String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; String DBUSER = "imti" ; String DBPASSWORD = "123456" ; Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; String sql = null ; %> <% request.setCharacterEncoding("gb2312") ; String no = request.getParameter("no") ; String dept = request.getParameter("dept") ; try { Class.forName(DBDRIVER) ; conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; stmt = conn.createStatement() ; sql = "UPDATE student SET sdept='"+dept+"' WHERE sno='"+no+"'" ; System.out.println(sql) ; stmt.executeUpdate(sql) ; stmt.close() ; conn.close() ; } catch(Exception e) { out.println(e) ; } %> |
批处理操作
可以让一个Statement同时处理多个SQL语句
<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%-- 使用JDBC连接Oracle数据库 使用TESTDB数据库 用户名:imti 密码:123456 --%> <% String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; String DBUSER = "imti" ; String DBPASSWORD = "123456" ; Connection conn = null ; Statement stmt = null ; %> <% try { Class.forName(DBDRIVER) ; conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; stmt = conn.createStatement() ; // 取消自动提交 conn.setAutoCommit(false) ; stmt.addBatch("INSERT INTO student VALUES ('9909129','王五','男',18,'信息工程')") ; stmt.addBatch("INSERT INTO student VALUES ('9909120','李斯','男',18,'信息工程')") ; stmt.addBatch("INSERT INTO student VALUES ('9909122','王莽','男',18,'信息工程')") ; // 执行批处理语句 stmt.executeBatch() ; // 提交事务,真正向数据库中插入数据 conn.commit() ; stmt.close() ; conn.close() ; } catch(Exception e) { // 将数据库回滚 try { conn.rollback() ; } catch(Exception e1) {} out.println("操作数据库失败!!!") ; } %> |
登录案例
登录页面login.jsp
<%@page contentType="text/html;charset=gb2312"%> <html> <head> <title>登陆</title> </head> <body> <center> <h1>登陆范例</h1> <hr> <br> <br> <form action="login_conf.jsp" method="post"> <table> <tr> <td colspan="2">用户登陆</td> </tr> <tr> <td>用户名:</td> <td><input type="text" name="uname"></td> </tr> <tr> <td>密 码:</td> <td><input type="password" name="upassword"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="登陆"> <input type="reset" value="重置"> </td> </tr> </table> </form> </center> </body> </html> |
登录验证页login_conf(Statement).jsp
<%@ page contentType="text/html;charset=gb2312"%> <%-- 导入java.sql包,表示要使用数据库操作 --%> <%@ page import="java.sql.*"%> <html> <head> <title>登陆</title> </head> <body> <center> <h1>登陆范例</h1> <hr> <br> <br> <% // 接收请求的内容 String name = request.getParameter("uname") ; String password = request.getParameter("upassword") ; // 定义变量,如果用户是合法用户,则将此标记变为true boolean flag = false ; %> <% // 定义数据库操作的常量、对象 // 数据库驱动程序 final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; // 数据库连接地址 final String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; // 数据库用户名 final String DBUSER = "imti" ; // 数据库连接密码 final String DBPASSWORD = "123456" ; // 声明一个数据库连接对象 Connection conn = null ; // 声明一个数据库操作对象 Statement stmt = null ; // 声明一个结果集对象 ResultSet rs = null ; // 声明一个SQL变量,用于保存SQL语句 String sql = null ; %> <% // 进行数据库操作 try { // 加载驱动程序 Class.forName(DBDRIVER) ; // 连接数据库 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; // 实例化数据库操作对象 stmt = conn.createStatement() ; // 编写SQL语句 sql = "SELECT name FROM person WHERE id='"+name+"' and password='"+password+"'" ; System.out.println(sql) ; // 查询记录 rs = stmt.executeQuery(sql) ; // 判断是否有记录 if(rs.next()) { // 如果有记录,则执行此段代码 // 用户是合法的,可以登陆 flag = true ; } // 依次关闭 rs.close() ; stmt.close() ; conn.close() ; } catch(Exception e) {} %> <% // 判断用户名及密码 if(flag) { // 合法用户 %> <jsp:forward page="login_success.jsp"/> <% } else { // 非法用户 %> <jsp:forward page="login_failure.jsp"/> <% } %> </center> </body> </html> |
注意,forward属于服务器端跳转,forward之后的代码不再被执行
以上代码是基于Statement编写,存在安全漏洞,因为这时SQL语句是拼凑出来的
SELECT name FROM person WHERE id='sss' and password='www'or'x'='x'
如果输入为www'or'x'='x,则会拼凑出合法的SQL
在实际开发中应该使用PreparedStatement
login_conf(PreparedStatement).jsp
<%@ page contentType="text/html;charset=gb2312"%> <%-- 导入java.sql包,表示要使用数据库操作 --%> <%@ page import="java.sql.*"%> <html> <head> <title>登陆</title> </head> <body> <center> <h1>登陆范例</h1> <hr> <br> <br> <% // 接收请求的内容 String name = request.getParameter("uname") ; String password = request.getParameter("upassword") ; // 定义变量,如果用户是合法用户,则将此标记变为true boolean flag = false ; %> <% // 定义数据库操作的常量、对象 // 数据库驱动程序 final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; // 数据库连接地址 final String DBURL = "jdbc:oracle:thin:@localhost:1521:TESTDB" ; // 数据库用户名 final String DBUSER = "imti" ; // 数据库连接密码 final String DBPASSWORD = "123456" ; // 声明一个数据库连接对象 Connection conn = null ; // 声明一个数据库操作对象 PreparedStatement pstmt = null ; // 声明一个结果集对象 ResultSet rs = null ; // 声明一个SQL变量,用于保存SQL语句 String sql = null ; %> <% // 进行数据库操作 try { // 编写SQL语句 sql = "SELECT name FROM person WHERE id=? and password=?" ; // 加载驱动程序 Class.forName(DBDRIVER) ; // 连接数据库 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; // 实例化数据库操作对象 pstmt = conn.prepareStatement(sql) ; // 设置pstmt的内容 pstmt.setString(1,name) ; pstmt.setString(2,password) ; // 查询记录 rs = pstmt.executeQuery() ; // 判断是否有记录 if(rs.next()) { // 如果有记录,则执行此段代码 // 用户是合法的,可以登陆 flag = true ; } // 依次关闭 rs.close() ; pstmt.close() ; conn.close() ; } catch(Exception e) {} %> <% // 判断用户名及密码 if(flag) { // 合法用户 %> <jsp:forward page="login_success.jsp"/> <% } else { // 非法用户 %> <jsp:forward page="login_failure.jsp"/> <% } %> </center> </body> </html> |
login_success.jsp
<%@page contentType="text/html;charset=gb2312"%> <html> <head> <title>登陆</title> </head> <body> <center> <h1>登陆范例</h1> <hr> <br> <br> <h2>登陆成功</h2> <h3>欢迎<font color="red" size="15"> <%=request.getParameter("uname")%> </font>光临!!!</h3> </center> </body> </html> |
login_failure.jsp
<%@page contentType="text/html;charset=gb2312"%> <html> <head> <title>登陆</title> </head> <body> <center> <h1>登陆范例</h1> <hr> <br> <br> <h2>登陆失败</h2> <h3>错误的用户名及密码!!!</h3> <a href="login.jsp">重新登陆</a> </center> </body> </html> |
经过以上的讲解,我们应该掌握了JDBC使用的基本技术,在以后的项目开发环境中,PreparedStatement应该成为我们的规范化的执行语句标准。