一、JDBC概述
JDBC(Java DataBase Connectivity)是一種執行SQL語句的Java API,可以爲多種數據庫提供統一訪問,它由一組用java語言編寫的類和接口組成,JDBC提供了一組基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時,JDBC也是商標名.
1.JDBC API
JDBC API可做三件事:與數據庫建立連接、執行SQL語句、處理結果.
二、創建數據庫與表
三、實例演示————用戶登錄
1、創建Web項目LoginDemo01
2.添加數據驅動包
3.在web目錄創建首頁文件index.jsp
4.在web目錄裏創建登錄頁面login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>用戶登錄</title>
</head>
<body>
<h3 style="text-align: center">用戶登錄</h3>
<form action="do_login.jsp" method="post">
<table border="1" cellpadding="10" style="margin: 0px auto">
<tr>
<td align="center">用戶名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td align="center">密 碼</td>
<td><input type="password" name="password"/></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="登錄"/>
<input type="reset" value="重置"/>
</td>
</tr>
</table>
</form>
<%
String errMsg = (String) session.getAttribute("errMsg");
if (errMsg != null) {
out.println("<p style='text-align: center; color: red'>" + new String(errMsg.getBytes("ISO-8859-1"), "utf-8") + "</p>");
}
%>
</body>
</html>
5.在web目錄創建登錄處理頁面do_login.jsp
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.sql.*" %><%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2020/4/5
Time: 10:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登錄處理頁面</title>
</head>
<body>
<%
//設置請求對象字符編碼
request.setCharacterEncoding("utf-8");
//獲取表單提交數據
String username=request.getParameter("username");
String password=request.getParameter("password");
//設置連接數據庫的參數值
final String DRIVER ="com.mysql.jdbc.Driver";
final String URL="jdbc:mysql://localhost:3306/ysy";
final String USER="root";
final String PASSWORD="password";
try{
//安裝數據庫驅動程序
Class.forName(DRIVER);
//獲取數據庫連接
Connection connection= DriverManager.getConnection(URL+"?useUnicode=true&characterEncoding=utf-8",USER,PASSWORD);
//定義SQL字符串
String strSQL="select * from t_user where username=? and password =?";
//創建預備語句對象
PreparedStatement pstmt=connection.prepareStatement(strSQL);
//設置佔位符
pstmt.setString(1,username);
pstmt.setString(2,password);
//執行SQL查詢,返回結果集
ResultSet rs=pstmt.executeQuery();
//判斷結果集是否有記錄
if (rs.next()){
//清除session裏可能存在的屬性值
if (session.getAttribute("errMsg")!=null){
session.removeAttribute("errMsg");
}
//採用重定向,跳轉到登錄成功頁面
response.sendRedirect("success.jsp?username="+ URLEncoder.encode(username,"utf-8"));
}else {
//設置session屬性值
session.setAttribute("errMsg","用戶名或密碼錯誤,請重新登錄!!");
//採用重定向,跳轉到登錄成功界面
response.sendRedirect("login.jsp");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
%>
</body>
</html>
6.啓動服務器查看效果
登錄失敗情況
改進版1:創建一個數據庫連接管理類ConnectionManager,效果是一樣的
1.src裏創建net.ysy.dbutil包,在裏面創建ConnectionManager類
package net.ysy.dbutil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionManager {
//設置連接數據庫的參數值
private static final String DRIVER ="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/ysy";
private static final String USER="root";
private static final String PASSWORD="password";
//私有構造方法,拒絕實例化
private ConnectionManager(){
}
/*
獲取數據庫連接靜態方法
*/
public static Connection getConnection(){
//聲明數據庫連接
Connection connection=null;
try {
//安裝數據庫驅動程序
Class.forName(DRIVER);
//獲取數據庫連接
connection= DriverManager.getConnection(URL,USER, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
//返回數據庫連接
return connection;
}
/*
關閉數據庫連接靜態方法
@param connection 數據庫連接
*/
public static void closeConn(Connection connection){
if (connection !=null){
try {
if (!connection.isClosed()){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.修改do_login裏面的內容
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.sql.*" %>
<%@ page import="net.ysy.dbutil.ConnectionManager" %><%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2020/4/5
Time: 10:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登錄處理頁面</title>
</head>
<body>
<%
//設置請求對象字符編碼
request.setCharacterEncoding("utf-8");
//獲取表單提交數據
String username=request.getParameter("username");
String password=request.getParameter("password");
//獲取數據庫連接
Connection connection= ConnectionManager.getConnection();
//定義SQL字符串
String strSQL="select * from t_user where username= ? and password = ? ";
//創建預備語句對象
PreparedStatement pstmt=connection.prepareStatement(strSQL);
//設置佔位符的值
pstmt.setString(1,username);
pstmt.setString(2,password);
//執行SQL查詢,返回結果集
ResultSet rs=pstmt.executeQuery();
//判斷結果集是否有記錄
if (rs.next()) {
//清除session裏可能存在的errMsg屬性
if (session.getAttribute("errMsg") != null) {
session.removeAttribute("errMsg");
}
//採用重定向,跳轉到登錄成功頁面
response.sendRedirect("success.jsp?username=" + URLEncoder.encode(username, "utf-8"));
}else {
//設置session屬性值
session.setAttribute("errMsg","用戶名或密碼錯誤,請重新登錄!!");
//採用重定向,跳轉到登錄成功界面
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
改進版2:引入模型層,創建UserDao 效果一樣
1.在src裏創建net.ysy.bean包,在裏面創建User實體類
2.在src.ysy.dao包,在裏面創建UserDao接口
3.在net.ysy.dao下創建impl子包,在裏面創建UserDaoImpl實現類
package net.ysy.dao.impl;
import net.ysy.bean.User;
import net.ysy.dao.UserDao;
import net.ysy.dbutil.ConnectionManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 功能:用戶數據訪問接口實現類
*
*/
public class UserDaoImpl implements UserDao {
@Override
/**
* 登錄方法
* @param username
* @param password
* @return true -登錄成功 false-登錄失敗
*/
public boolean login(String username, String password) {
//聲明標誌變量
boolean flag=false;
//聲明數據庫連接
Connection connection=null;
try{
//獲取數據庫的連接
connection =ConnectionManager.getConnection();
//定義SQL字符串
String strSQL="select * from t_user where username= ? and password = ? ";
//創建預備語句對象
PreparedStatement pstmt=connection.prepareStatement(strSQL);
//設置佔位符的值
pstmt.setString(1,username);
pstmt.setString(2,password);
//執行SQL查詢,返回結果集
ResultSet rs=pstmt.executeQuery();
//判斷結果集是否有記錄
if (rs.next()) {
flag=true;
}else {
flag=false;
}
} catch (SQLException ex) {
ex.printStackTrace();
}finally {
//關閉數據庫連接
ConnectionManager.closeConn(connection);
}
//返回標誌變量
return flag;
}
/**
* 插入方法
* @param user
* @return 插入記錄數
*/
@Override
public int insert(User user) {
//聲明插入記錄變量數
int count =0;
//聲明數據庫連接
Connection connection=null;
try{
//獲取數據庫連接
connection =ConnectionManager.getConnection();
//定義SQL字符串
String strSQL="insert into t_user (username,password) value(?,?)";
//創建預備語句對象
PreparedStatement pstm=connection.prepareStatement(strSQL);
//設置佔位符的值
pstm.setString(1,user.getUsername());
pstm.setString(2,user.getPassword());
//執行SQL更新,返回更新記錄數
count =pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//關閉數據庫連接
ConnectionManager.closeConn(connection);
}
//返回插入記錄數
return count;
}
}
4.修改登錄處理頁面do_login.jsp(控制層)
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.sql.*" %>
<%@ page import="net.ysy.dbutil.ConnectionManager" %>
<%@ page import="net.ysy.dao.UserDao" %>
<%@ page import="net.ysy.dao.impl.UserDaoImpl" %><%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2020/4/5
Time: 10:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登錄處理頁面</title>
</head>
<body>
<%
//設置請求對象字符編碼
request.setCharacterEncoding("utf-8");
//獲取表單提交數據
String username=request.getParameter("username");
String password=request.getParameter("password");
//創建用戶數據訪問對象
UserDao userDao=new UserDaoImpl();
//判斷是否登錄成功
if (userDao.login(username,password)){
//清除session裏可能存在的errMsg
if (session.getAttribute("errMsg")!=null){
session.removeAttribute("errMsg");
}
//採用重定向,跳轉到登錄成功頁面
response.sendRedirect("success.jsp?username=" + URLEncoder.encode(username, "utf-8"));
}else {
//設置session屬性值
session.setAttribute("errMsg","用戶名或密碼錯誤,請重新登錄!!");
//採用重定向,跳轉到登錄成功界面
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
改進版3:用Servlet取代登錄處理頁面do_login.jsp
1.在src裏創建net.ysy.servlet包,在裏面創建登錄LoginServlet類
2.在LoginServelt註解裏添加url映射
3.編寫doGet()方法,調試doPost()方法.
4.編寫doPost()方法,進行業務邏輯處理,實現頁面跳轉.
package net.ysy.Servlet;
import net.ysy.dao.UserDao;
import net.ysy.dao.impl.UserDaoImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet(name = "loginServlet",value = "/login")
public class loginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//設置請求對象字符編碼
request.setCharacterEncoding("utf-8");
//獲取表單提交數據
String username=request.getParameter("username");
String password=request.getParameter("password");
//創建用戶數據訪問對象
UserDao userDao=new UserDaoImpl();
//獲取響應請求
HttpSession session=request.getSession();
//判斷是否登錄成功
if (userDao.login(username,password)){
//清除session裏可能存在的errMsg
if (session.getAttribute("errMsg")!=null){
session.removeAttribute("errMsg");
}
//採用重定向,跳轉到登錄成功頁面
response.sendRedirect("success.jsp?username=" + URLEncoder.encode(username, "utf-8"));
}else {
//設置session屬性值
session.setAttribute("errMsg","用戶名或密碼錯誤,請重新登錄!!");
//採用重定向,跳轉到登錄成功界面
response.sendRedirect("login.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
}
5.修改登錄頁面login.jsp
6.重啓服務器,查看運行效果