一、JDBC連接SQLserver數據庫的步驟:
1.下載SQLserver的JDBC驅動文件——Microsoft JDBC Driver 4.0 for SQL Server
2.例如下載得到的文件是sqljdbc_4.0.2206.100_chs.exe,解壓文件,將解壓縮文件中的sqljdbc4.jar放到eclipse-workspace\User_Message(新建的JavaWeb項目)\WebContent\WEB-INF\lib目錄下
3.加載JDBC驅動程序:在連接數據庫之前,首先要加載想要連接的數據庫的驅動到JVM(Java虛擬機),這通過java.lang.Class類的靜態方法forName(String className)實現,成功加載后,會將Driver類的實例注冊到DriverManager類中
示例語句:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
4.創建連接對象:要連接數據庫,需要向java.sql.DriverManager請求並獲得Connection對象, 該對象就代表一個數據庫的連接,使用DriverManager的getConnectin(String url , String username , String password )方法傳入指定的欲連接的數據庫的路徑、數據庫的用戶名和密碼,其中url定義了連接數據庫時的協議、子協議、數據源標識,協議——在JDBC中總是以jdbc開始,子協議——是橋連接的驅動程序或是數據庫管理系統名稱,數據源標識——標記找到數據庫來源的地址與連接端口。
示例語句:
String user="sa"; String password="woshizcy0919"; String url= "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=User_DB"; Connection connection=DriverManager.getConnection(url, user, password);
5.准備SQL語句:
示例語句:
String sql="select count(*) from t_user where username=?";
6.執行SQL語句:先將SQL語句賦給preparedStatement對象,下面有兩種執行SQL語句的方法executeQuery 、executeUpdate
(1)ResultSet executeQuery():執行查詢數據庫的SQL語句,返回值為一個結果集(ResultSet)對象。
(2)int executeUpdate():執行INSERT、UPDATE或DELETE語句以及SQL DDL語句(如:CREATE TABLE和DROP TABLE等),並更新數據庫,返回值為本次操作影響的行數,即記錄數。
示例語句:
PreparedStatement preparedStatement=
connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
resultSet=preparedStatement.executeQuery();
preparedStatement.executeUpdate();
7.操作結果集對象:
結果集中包含符合SQL語句查詢條件的所有行,即所有記錄,並且它通過一套get方法提供了對這些行中數據的訪問,使用結果集對象(resultSet)的訪問方法獲取數據。
(1)resultSet.next():讀取結果集中的下一行,即下一條記錄。
(2)resultSet.getInt(int index)
resultSet.getInt(String columName):
通過索引或者列名來獲得查詢結果集中的某一列的值。
示例語句:
//例:現有表User:列有id,name String sql="select * from User"; ResultSet resultSet = null; resultSet = preparedStatement.executeQuery(sql); while(resultSet.next) { resultSet.getInt(1)//等價於resultSet.getInt("id"); resultSet.getString(2)//等價於resultSet.getInt("name"); }
8.關閉JDBC對象:
示例語句:
DBUtil.close(resultSet);
DBUtil.close(preparedStatement);
DBUtil.close(connection);
二、登錄界面及其功能設計
1.對數據庫操作方法的接口
package com.jaovo.msg.dao; import java.util.List; import com.jaovo.msg.model.User; public interface IUserDao { public void add(User user); public void delete(int id); public void update(User user); public User load(int id); public User load(String username); public List<User> load(); }
2.實現接口的類
package com.jaovo.msg.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.jaovo.msg.Util.DBUtil; import com.jaovo.msg.Util.UserException; import com.jaovo.msg.model.User; public class UserDaoImpl implements IUserDao { public void add(User user) { //獲得連接的對象 Connection connection=DBUtil.getConnection(); //准備sql語句 String sql="select count(*) from t_user where username=?"; //創建語句傳輸對象 PreparedStatement preparedStatement=null; ResultSet resultSet=null; try { preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1, user.getUsername()); //接收結果集 resultSet=preparedStatement.executeQuery(); //遍歷結果集 while(resultSet.next()) { if(resultSet.getInt(1)>0) { throw new UserException("用戶已存在!"); } } sql="insert into t_user(username,nickname,password) values(?,?,?)"; preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1, user.getUsername()); preparedStatement.setString(2, user.getNickname()); preparedStatement.setString(3, user.getPassword()); preparedStatement.executeUpdate(); //重寫底層代碼: /* sql="insert into t_user(id,username,userpassword,nickname)values('"+user.getId()+"','"+user.getUsername()+"','"+user.getPassword()+"','"+user.getNickname()+"')"; Statement stmt; Connection con=DBUtil.getConnection(); stmt=con.createStatement(); stmt.executeUpdate(sql); */ //重寫結束 } catch (SQLException e) { e.printStackTrace(); } finally { //關閉JDBC對象 DBUtil.close(resultSet); DBUtil.close(preparedStatement); DBUtil.close(connection); } } public void delete(int id) { //獲得連接的對象 Connection connection=DBUtil.getConnection(); //准備sql語句 String sql="delete from t_user where id=?"; //創建語句傳輸對象 PreparedStatement preparedStatement=null; try { preparedStatement=connection.prepareStatement(sql); preparedStatement.setInt(1, id); preparedStatement.executeUpdate(); } catch(SQLException e) { e.printStackTrace(); } finally { DBUtil.close(preparedStatement); DBUtil.close(connection); } } public void update(User user) { //獲得連接的對象 Connection connection=DBUtil.getConnection(); //准備sql語句 String sql="delete from t_user where id=?"; //創建語句傳輸對象 PreparedStatement preparedStatement=null; try { preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1, user.getUsername()); preparedStatement.setString(2, user.getNickname()); preparedStatement.setInt(3, user.getId()); preparedStatement.executeUpdate(); } catch(SQLException e) { e.printStackTrace(); } finally { DBUtil.close(preparedStatement); DBUtil.close(connection); } } public User load(int id) { //獲得連接的對象 Connection connection=DBUtil.getConnection(); //准備sql語句 String sql="select * from t_user where id=?"; //創建語句傳輸對象 PreparedStatement preparedStatement=null; ResultSet resultSet=null; User user=null; try { preparedStatement=connection.prepareStatement(sql); preparedStatement.setInt(1, id); resultSet=preparedStatement.executeQuery(); while(resultSet.next()) { user=new User(); user.setId(id); user.setUsername(resultSet.getString("username")); user.setPassword(resultSet.getString("password")); user.setNickname(resultSet.getString("nickname")); } } catch(SQLException e) { e.printStackTrace(); } finally { DBUtil.close(resultSet); DBUtil.close(preparedStatement); DBUtil.close(connection); } return user; } public User load(String username) { //獲得連接的對象 Connection connection=DBUtil.getConnection(); //准備sql語句 String sql="select * from t_user where username=?"; //創建語句傳輸對象 PreparedStatement preparedStatement=null; ResultSet resultSet=null; User user=null; try { preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1, username); resultSet=preparedStatement.executeQuery(); while(resultSet.next()) { user=new User(); user.setId(resultSet.getInt("id")); user.setUsername(username); user.setPassword(resultSet.getString("password")); user.setNickname(resultSet.getString("nickname")); } } catch(SQLException e) { e.printStackTrace(); } finally { DBUtil.close(resultSet); DBUtil.close(preparedStatement); DBUtil.close(connection); } return user; } public List<User> load() { //獲得連接的對象 Connection connection=DBUtil.getConnection(); //准備sql語句 String sql="delete from t_user where id=?"; //創建語句傳輸對象 PreparedStatement preparedStatement=null; ResultSet resultSet=null; List<User> users=new ArrayList<User>(); User user=null; try { preparedStatement=connection.prepareStatement(sql); resultSet=preparedStatement.executeQuery(); while(resultSet.next()) { user=new User(); user.setId(resultSet.getInt("id")); user.setUsername(resultSet.getString("username")); user.setNickname(resultSet.getString("nickname")); user.setPassword(resultSet.getString("password")); users.add(user); } } catch(SQLException e) { e.printStackTrace(); } finally { DBUtil.close(resultSet); DBUtil.close(preparedStatement); DBUtil.close(connection); } return users; } //檢查密碼是不是錯誤 public boolean check(User user) { boolean flag=false; Connection connection=DBUtil.getConnection(); String sql="select * from t_user where username=?"; PreparedStatement preparedStatement = null; ResultSet resultSet=null; try { preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1,user.getUsername()); resultSet=preparedStatement.executeQuery(); while(resultSet.next()) { if(resultSet.getString("password").equals(user.getPassword().toString().trim())) { flag=true; break; } } } catch (SQLException e) { e.printStackTrace(); } return flag; } }
3.用戶模型類
package com.jaovo.msg.model; public class User { private int id; private String username; private String nickname; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
4.工具類(用於連接數據庫和關閉JDBC對象)
package com.jaovo.msg.Util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBUtil { public static Connection getConnection() { try { //加載驅動 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); System.out.println("驅動加載成功!"); } catch(ClassNotFoundException | InstantiationException | IllegalAccessException e) { System.out.println("驅動加載失敗!"); e.printStackTrace(); } String user="sa"; String password="woshizcy0919"; String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=User_DB"; Connection connection=null; try { //創建鏈接對象connection connection=DriverManager.getConnection(url, user, password); System.out.println("數據庫連接成功!"); } catch(SQLException e) { System.out.println("數據庫連接失敗!"); e.printStackTrace(); } return connection; } //關閉資源的方法 public static void close(Connection connection) { if(connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(PreparedStatement preparedStatement) { if(preparedStatement !=null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet resultSet) { if(resultSet!=null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
5.異常拋出類
package com.jaovo.msg.Util; public class UserException extends RuntimeException { public UserException() { super(); } public UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } public UserException(String message, Throwable cause) { super(message, cause); } public UserException(String message) { super(message); } public UserException(Throwable cause) { super(cause); } }
6.jsp界面代碼
(1)登錄界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>歡迎來到登錄界面</title> </head> <body> <%=request.getAttribute("error") %> <form action="LoginCheck.jsp" method="post"> <table align="center" border="1" width="500"> <caption>用戶登錄</caption> <tr> <td>賬號:</td> <td> <input type="text" name="username"/> </td> </tr> <tr> <td>密碼:</td> <td> <input type="password" name="password"> </td> </tr> <tr align="center"> <td colspan="2"> <input type="submit" value="登錄"/> <input type="button" value="注冊" onClick="window.location.href='addInput.jsp'"/> </td> </tr> </table> </form> </body> </html>
(2)登錄驗證界面
<%@page import="com.jaovo.msg.Util.UserException"%> <%@page import="com.jaovo.msg.dao.UserDaoImpl"%> <%@page import="com.jaovo.msg.model.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>用戶身份驗證</title> </head> <body> <% //接收客戶端傳遞過來的參數 String username = request.getParameter("username"); String password = request.getParameter("password"); if(username == null || "".equals(username.trim())||password == null || "".equals(password.trim())) { request.setAttribute("error", "用戶名和密碼不能為空!"); %> <jsp:forward page="Login.jsp"></jsp:forward> <% } %> <% User user = new User(); user.setUsername(username); user.setPassword(password); UserDaoImpl userDao = new UserDaoImpl(); try { if(userDao.load(username)==null) { throw new UserException(); } if(userDao.check(user)==true) { %> 登錄成功!<br> <% } else { %> 密碼輸入錯誤!<br> <% } } catch(UserException e) { %> <h2 style="color:red ; font-size:50px">該用戶名不存在</h2> <% } %> </body> </html>
(3)用戶注冊界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>用戶添加頁面</title> </head> <body> <form action="add.jsp" method="get"> <table align="center" border="1" width="500"> <tr> <td>用戶名稱 : </td> <td> <input type="text" name="username" /> </td> </tr> <tr> <td>用戶密碼:</td> <td> <input type="password" name="password" /> </td> </tr> <tr> <td>用戶昵稱:</td> <td> <input type="text" name="nickname" /> </td> </tr> <%=request.getAttribute("error") %> <tr align="center"> <td colspan="2"> <input type="submit" value="提交" /> <input type="reset" value="重置" /> </td> </tr> </table> </form> </body> </html>
(4)注冊結果界面
<%@page import="com.jaovo.msg.Util.UserException"%> <%@page import="com.jaovo.msg.dao.UserDaoImpl"%> <%@page import="com.jaovo.msg.model.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>用戶添加頁面</title> </head> <body> <% //接收客戶端傳遞過來的參數 String username = request.getParameter("username"); String password = request.getParameter("password"); String nickname = request.getParameter("nickname"); if(username == null || "".equals(username.trim())||password == null || "".equals(password.trim())){ request.setAttribute("error", "用戶名和密碼不能為空!"); %> <jsp:forward page="addInput.jsp"></jsp:forward> <% } %> <% User user = new User(); user.setUsername(username); user.setPassword(password); user.setNickname(nickname); UserDaoImpl userDao = new UserDaoImpl(); try{ userDao.add(user); %> 注冊成功!<br> <a href="addInput.jsp">返回</a><br> <a href="#">用戶列表</a> <% }catch(UserException e){ %> <h2 style="color:red ; font-size:50px">發生錯誤 : <%=e.getMessage() %></h2> <% } %> </body> </html>
7.運行結果界面截圖:
(1)登錄界面

(2)登錄成功

(3)用戶名或密碼為空

(4)用戶名不存在

(5)密碼錯誤

(6)注冊界面

(7)注冊成功

(8)注冊重復

