亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

第18天(就業班) 預編譯sql處理(防止sql注入)、存儲過程、批處理、插入數據獲取增長值、事務、大文本類型處理

2019-11-11 05:19:43
字體:
來源:轉載
供稿:網友

一、預編譯sql處理(防止sql注入)

--創建數據庫

CREATEDATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i

--創建表

USEjdbc_demo;

CREATETABLE admin(

    id INT PRIMARY KEY AUTO_INCREMENT,

    userName VARCHAR(20),

    pwd VARCHAR(20)

)

|--Statement      執行SQL命令

   |-- CallableStatement,     執行存儲過程

|--PreparedStatement    預編譯SQL語句執行

使用預編譯SQL語句的命令對象,好處:

1. 避免了頻繁sql拼接 (可以使用占位符)

2. 可以防止sql注入

登陸模塊,

   輸入用戶名,密碼!

注意,

要避免用戶輸入的惡意密碼!

package com.xp.jdbc.pstmt;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;public class PstmtLogin {	// 連接參數	// private String url = "jdbc:MySQL://localhost:3306/jdbc_demo";	private String url = "jdbc:mysql:///jdbc_demo";	private String user = "root";	private String passWord = "root";	private Connection con;	private Statement stmt;	private PreparedStatement pstmt;	private ResultSet rs;	// 1. 沒有使用防止sql注入的案例	@Test	public void testLogin() {		// 1.0 模擬登陸的用戶名,密碼		String userName = "tom";		// String pwd = "8881";		String pwd = " ' or 1=1 -- ";		// SQL語句		String sql = "select * from admin where userName='" + userName				+ "'  and pwd='" + pwd + "' ";		System.out.println(sql);		try {			// 1.1 加載驅動,創建連接			Class.forName("com.mysql.jdbc.Driver");			con = DriverManager.getConnection(url, user, password);			// 1.2 創建stmt對象			stmt = con.createStatement();			// 1.3 執行查詢			rs = stmt.executeQuery(sql);			// 業務判斷			if (rs.next()) {				System.out.println("登陸成功, 編號:" + rs.getInt("id"));			}		} catch (Exception e) {			e.printStackTrace();		} finally {			// 1.4 關閉			try {				rs.close();				stmt.close();				con.close();			} catch (Exception e) {				e.printStackTrace();			}		}	}	// 2. 使用PreparedStatement, 防止sql注入	@Test	public void testLogin2() {		// 1.0 模擬登陸的用戶名,密碼		String userName = "tom";		// String pwd = "8881";		String pwd = " ' or 1=1 -- ";		// SQL語句		String sql = "select * from admin where userName=?  and pwd=? ";		try {			// 1.1 加載驅動,創建連接			Class.forName("com.mysql.jdbc.Driver");			con = DriverManager.getConnection(url, user, password);			// 1.2 創建pstmt對象			pstmt = con.prepareStatement(sql); // 對sql語句預編譯			// 設置占位符值			pstmt.setString(1, userName);			pstmt.setString(2, pwd);			// 1.3 執行			rs = pstmt.executeQuery();			if (rs.next()) {				System.out.println("登陸成功," + rs.getInt("id"));			}		} catch (Exception e) {			e.printStackTrace();		} finally {			// 1.4 關閉			try {				rs.close();				pstmt.close();				con.close();			} catch (Exception e) {				e.printStackTrace();			}		}	}}二、 存儲過程調用

-- 存儲過程DELIMITER $$CREATE PROCEDURE proc_login()BEGIN	SELECT * FROM admin;END $$-- 調用CALL proc_login;package com.xp.jdbc.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JdbcUtil {	// 連接參數		// private String url = "jdbc:mysql://localhost:3306/jdbc_demo";		private static String url = "jdbc:mysql:///jdbc_demo";		private static String user = "root";		private static String password = "xiongpan";		/**		 * 返回連接對象		 */		public static Connection getConnection() {			try {				Class.forName("com.mysql.jdbc.Driver");				return DriverManager.getConnection(url, user, password);			} catch (Exception e) {				throw new RuntimeException(e);			}		}		/**		 * 關閉		 */		public static void closeAll(Connection con, Statement stmt, ResultSet rs) {			try {				if (rs != null) {					rs.close();  // 快速異常捕獲 Alt + shift + z 					rs = null;   // 建議垃圾回收期回收資源				}				if (stmt != null) {					stmt.close();					stmt = null;				}				if (con != null && !con.isClosed()) {					con.close();					con = null;				}			} catch (SQLException e) {				throw new RuntimeException(e);			}		}	}package com.xp.jdbc.pstmt;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import com.xp.jdbc.utils.JdbcUtil;public class PstmtLogin_call {	// 全局參數	private Connection con;	private Statement stmt;	private PreparedStatement pstmt;	private CallableStatement cstmt; // 存儲過程	private ResultSet rs;	// 程序中調用存儲過程	@Test	public void testCall() throws Exception {		try {			// 1 . 創建連接			con = JdbcUtil.getConnection();			// 2. 創建執行存儲過程的stmt對象			CallableStatement cstmt = con.prepareCall("CALL proc_login");			// 3. 執行(存儲過程)			rs = cstmt.executeQuery();			// 遍歷結果,測試			if (rs.next()) {				String name = rs.getString("userName");				String pwd = rs.getString("pwd");				// 測試				System.out.println(name + pwd);			}		} catch (Exception e) {			e.printStackTrace();		}	}}

一、 批處理

很多時候,需要批量執行sql語句!

需求:批量保存信息! 

設計:

   AdminDao

      Public  void save(List<Admin list){    // 目前用這種方式

        // 循環

        // 保存 (批量保存)

      }

      Public  void save(Admin  admin ){

        // 循環

        // 保存

      }

技術:

   |-- Statement

   批處理相關方法

      voidaddBatch(String sql)     添加批處理

      voidclearBatch()            清空批處理

int[] executeBatch()         執行批處理

實現:

   Admin.java         實體類封裝數據

   AdminDao.java      封裝所有的與數據庫的操作

   App.java           測試

package com.xp.batch;public class Admin {	private String userName;	private String pwd;	public String getUserName() {		return userName;	}	public void setUserName(String userName) {		this.userName = userName;	}	public String getPwd() {		return pwd;	}	public void setPwd(String pwd) {		this.pwd = pwd;	}	}package com.xp.batch;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.List;import com.xp.jdbc.utils.JdbcUtil;public class AdminDao {	// 全局參數	private Connection con;	private PreparedStatement pstmt;	private ResultSet rs;	// 批量保存管理員	public void save(List<Admin> list) {		// SQL		String sql = "INSERT INTO admin(userName,pwd) values(?,?)";		try {			// 獲取連接			con = JdbcUtil.getConnection();			// 創建stmt			pstmt = con.prepareStatement(sql); // 【預編譯SQL語句】			for (int i = 0; i < list.size(); i++) {				Admin admin = list.get(i);				// 設置參數				pstmt.setString(1, admin.getUserName());				pstmt.setString(2, admin.getPwd());				// 添加批處理				pstmt.addBatch(); // 【不需要傳入SQL】				// 測試:每5條執行一次批處理				if (i % 5 == 0) {					// 批量執行					pstmt.executeBatch();					// 清空批處理					pstmt.clearBatch();				}			}			// 批量執行			pstmt.executeBatch();			// 清空批處理			pstmt.clearBatch();		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, rs);		}	}}package com.xp.batch;import java.util.ArrayList;import java.util.List;import org.junit.Test;public class App {	// 測試批處理操作	@Test	public void testBatch() throws Exception {		// 模擬數據		List<Admin> list = new ArrayList<Admin>();		for (int i = 1; i < 21; i++) {			Admin admin = new Admin();			admin.setUserName("Jack" + i);			admin.setPwd("888" + i);			list.add(admin);		}		// 保存		AdminDao dao = new AdminDao();		dao.save(list);	}}四、 插入數據,獲取自增長值 需求:  李俊杰     18張相       19如何設計數據庫?編號    員工姓名    年齡    部門01       李俊杰      18     開發部02       張三        19     開發部’思考:如何減少數據冗余? 設置外鍵約束所以,編號    員工姓名    年齡    部門01       李俊杰      18     102       張三        19     1部門編號     部門名稱    1             開發部            部門與員工,一對多的關系 設計數據庫:員工表 (外鍵表) 【員工表有一個外鍵字段,引用了部門表的主鍵】部門表(主鍵表) 編碼總體思路:保存員工及其對應的部門!步驟:1. 先保存部門2. 再得到部門主鍵,再保存員工開發具體步驟:1. 設計javabean2. 設計dao3. 測試

-- 部門CREATE TABLE dept(   deptId INT PRIMARY KEY AUTO_INCREMENT,   deptName VARCHAR(20));-- 員工CREATE TABLE employee(   empId INT PRIMARY KEY AUTO_INCREMENT,   empName VARCHAR(20),   dept_id  INT   --  外鍵字段   );-- 給員工表添加外鍵約束ALTER TABLE employee ADD CONSTRAINT FK_employee_dept_deptId	FOREIGN KEY(dept_id) REFERENCES dept(deptId) ;package com.xp.auto;public class Employee {	private int empId;	private String empName;	// 關聯的部門	private Dept dept;	public Dept getDept() {		return dept;	}	public void setDept(Dept dept) {		this.dept = dept;	}	public int getEmpId() {		return empId;	}	public void setEmpId(int empId) {		this.empId = empId;	}	public String getEmpName() {		return empName;	}	public void setEmpName(String empName) {		this.empName = empName;	}}package com.xp.auto;public class Dept {	private int id;	private String deptName;	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getDeptName() {		return deptName;	}	public void setDeptName(String deptName) {		this.deptName = deptName;	}		}package com.xp.auto;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import com.xp.jdbc.utils.JdbcUtil;public class EmpDao {		private Connection con;	private PreparedStatement pstmt;	private ResultSet rs;	// 保存員工,同時保存關聯的部門	public void save(Employee emp){				// 保存部門		String sql_dept = "insert into dept(deptName) values(?)";		// 保存員工		String sql_emp = "INSERT INTO employee (empName,dept_id) VALUES (?,?)";		// 部門id		int deptId = 0;				try {			// 連接			con = JdbcUtil.getConnection();						/*****保存部門,獲取自增長*******/			// 【一、需要指定返回自增長標記】			pstmt = con.prepareStatement(sql_dept,Statement.RETURN_GENERATED_KEYS);			// 設置參數			pstmt.setString(1, emp.getDept().getDeptName());			// 執行			pstmt.executeUpdate();						// 【二、獲取上面保存的部門子增長的主鍵】			rs =  pstmt.getGeneratedKeys();			// 得到返回的自增長字段			if (rs.next()) {				deptId = rs.getInt(1);			}						/*****保存員工*********/			pstmt = con.prepareStatement(sql_emp);			// 設置參數			pstmt.setString(1, emp.getEmpName());			pstmt.setInt(2, deptId);			pstmt.executeUpdate();					} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, rs);		}	}}package com.xp.auto;import org.junit.Test;public class App {	// 保存員工	@Test	public void testSave() throws Exception {		// 模擬數據		Dept d = new Dept();		d.setDeptName("應用開發部");		Employee emp = new Employee();		emp.setEmpName("李俊杰");		emp.setDept(d);   // 關聯		// 調用dao保存		EmpDao empDao = new EmpDao();		empDao.save(emp);	}}

五、事務

事務使指一組最小邏輯操作單元,里面有多個操作組成。組成事務的每一部分必須要同時提交成功,如果有一個操作失敗,整個操作就回滾。

事務ACID特性

 原子性(Atomicity)

原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。

 一致性(Consistency)

事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。

 隔離性(Isolation)

事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。

 持久性(Durability)

持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響

事務的特性:

原子性,是一個最小邏輯操作單元 !

一致性,事務過程中,數據處于一致狀態。

持久性, 事務一旦提交成功,對數據的更改會反映到數據庫中。

隔離性, 事務與事務之間是隔離的。

案例:

需求: 張三給李四轉賬

設計: 賬戶表

技術:

|--Connection

voidsetAutoCommit(boolean autoCommit) ;  設置事務是否自動提交如果設置為false,表示手動提交事務。

voidcommit() ();                   手動提交事務

voidrollback() ;                   回滾(出現異常時候,所有已經執行成功的代碼需要回退到事務開始前的狀態。)

SavepointsetSavepoint(String name)

-- 賬戶表CREATE TABLE account(   id INT PRIMARY KEY AUTO_INCREMENT,   accountName VARCHAR(20),   money DOUBLE);-- 轉賬UPDATE account SET money=money-1000 WHERE accountName='張三';UPDATE account SET money=money+1000 WHERE accountName='李四';package com.xp.account;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Savepoint;import com.xp.jdbc.utils.JdbcUtil;public class AccountDao {	// 全局參數	private Connection con;	private PreparedStatement pstmt;	// 1. 轉賬,沒有使用事務	public void trans1() {		String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName='張三';";		String sql_ls = "UPDATE account SET money=money+1000 WHERE accountName='李四';";		try {			con = JdbcUtil.getConnection(); // 默認開啟的隱士事務			con.setAutoCommit(true);			/*** 第一次執行SQL ***/			pstmt = con.prepareStatement(sql_zs);			pstmt.executeUpdate();			/*** 第二次執行SQL ***/			pstmt = con.prepareStatement(sql_ls);			pstmt.executeUpdate();		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}	// 2. 轉賬,使用事務	public void trans2() {		String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName='張三';";		String sql_ls = "UPDATE1 account SET money=money+1000 WHERE accountName='李四';";		try {			con = JdbcUtil.getConnection(); // 默認開啟的隱士事務			// 一、設置事務為手動提交			con.setAutoCommit(false);			/*** 第一次執行SQL ***/			pstmt = con.prepareStatement(sql_zs);			pstmt.executeUpdate();			/*** 第二次執行SQL ***/			pstmt = con.prepareStatement(sql_ls);			pstmt.executeUpdate();		} catch (Exception e) {			try {				// 二、 出現異常,需要回滾事務				con.rollback();			} catch (SQLException e1) {			}			e.printStackTrace();		} finally {			try {				// 三、所有的操作執行成功, 提交事務				con.commit();				JdbcUtil.closeAll(con, pstmt, null);			} catch (SQLException e) {			}		}	}	// 3. 轉賬,使用事務, 回滾到指定的代碼段	public void trans() {		// 定義個標記		Savepoint sp = null;		// 第一次轉賬		String sql_zs1 = "UPDATE account SET money=money-1000 WHERE accountName='張三';";		String sql_ls1 = "UPDATE account SET money=money+1000 WHERE accountName='李四';";		// 第二次轉賬		String sql_zs2 = "UPDATE account SET money=money-500 WHERE accountName='張三';";		String sql_ls2 = "UPDATE1 account SET money=money+500 WHERE accountName='李四';";		try {			con = JdbcUtil.getConnection(); // 默認開啟的隱士事務			con.setAutoCommit(false); // 設置事務手動提交			/*** 第一次轉賬 ***/			pstmt = con.prepareStatement(sql_zs1);			pstmt.executeUpdate();			pstmt = con.prepareStatement(sql_ls1);			pstmt.executeUpdate();			// 回滾到這個位置?			sp = con.setSavepoint();			/*** 第二次轉賬 ***/			pstmt = con.prepareStatement(sql_zs2);			pstmt.executeUpdate();			pstmt = con.prepareStatement(sql_ls2);			pstmt.executeUpdate();		} catch (Exception e) {			try {				// 回滾 (回滾到指定的代碼段)				con.rollback(sp);			} catch (SQLException e1) {			}			e.printStackTrace();		} finally {			try {				// 提交				con.commit();			} catch (SQLException e) {			}			JdbcUtil.closeAll(con, pstmt, null);		}	}}package com.xp.account;import org.junit.Test;public class App {	@Test	public void testname() throws Exception {		// 轉賬		AccountDao accountDao = new AccountDao();		accountDao.trans();	}}六、Jdbc中大文本類型的處理Oracle中大文本數據類型,Clob    長文本類型   (MySQL中不支持,使用的是text)Blob    二進制類型MySQL數據庫,Text    長文本類型Blob    二進制類型需求: jdbc中操作長文本數據。設計: 測試表編碼:保存大文本數據類型讀取大文本數據類型保存二進制數據讀取二進制數據-- 測試大數據類型
CREATE TABLE test(     id INT PRIMARY KEY AUTO_INCREMENT,     content LONGTEXT,     img LONGBLOB);package com.xp.longtext;import java.io.File;import java.io.FileReader;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import com.xp.jdbc.utils.JdbcUtil;public class App_text {	// 全局參數	private Connection con;	private Statement stmt;	private PreparedStatement pstmt;	private ResultSet rs;	@Test	// 1. 保存大文本數據類型 ( 寫longtext)	public void testSaveText() {		String sql = "insert into test(content) values(?)";		try {			// 連接			con = JdbcUtil.getConnection();			// pstmt 對象			pstmt = con.prepareStatement(sql);			// 設置參數			// 先獲取文件路徑			String path = App_text.class.getResource("tips.txt").getPath();			FileReader reader = new FileReader(new File(path));			pstmt.setCharacterStream(1, reader);			// 執行sql			pstmt.executeUpdate();			// 關閉			reader.close();		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}	@Test	// 2. 讀取大文本數據類型 ( 讀longtext)	public void testGetAsText() {		String sql = "select * from  test;";		try {			// 連接			con = JdbcUtil.getConnection();			// pstmt 對象			pstmt = con.prepareStatement(sql);			// 讀取			rs = pstmt.executeQuery();			if (rs.next()) {				// 獲取長文本數據, 方式1:				// Reader r = rs.getCharacterStream("content");				// 獲取長文本數據, 方式2:				System.out.print(rs.getString("content"));			}		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}}package com.xp.longtext;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import com.xp.jdbc.utils.JdbcUtil;public class App_blob {	// 全局參數	private Connection con;	private Statement stmt;	private PreparedStatement pstmt;	private ResultSet rs;	@Test	// 1. 二進制數據類型 ( 寫longblob)	public void testSaveText() {		String sql = "insert into test(img) values(?)";		try {			// 連接			con = JdbcUtil.getConnection();			// pstmt 對象			pstmt = con.prepareStatement(sql);			// 獲取圖片流			InputStream in = App_text.class.getResourceAsStream("7.jpg");			pstmt.setBinaryStream(1, in);			// 執行保存圖片			pstmt.execute();			// 關閉			in.close();		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}	@Test	// 2. 讀取大文本數據類型 ( 讀longblob)	public void testGetAsText() {		String sql = "select img from  test where id=2;";		try {			// 連接			con = JdbcUtil.getConnection();			// pstmt 對象			pstmt = con.prepareStatement(sql);			// 讀取			rs = pstmt.executeQuery();			if (rs.next()) {				// 獲取圖片流				InputStream in = rs.getBinaryStream("img");				// 圖片輸出流				FileOutputStream out = new FileOutputStream(new File(						"c://1.jpg"));				int len = -1;				byte b[] = new byte[1024];				while ((len = in.read(b)) != -1) {					out.write(b, 0, len);				}				// 關閉				out.close();				in.close();			}		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}}

五、綜合案例

需求分析:

   登陸、注冊、注銷;

   登陸成功,

      顯示所有的員工

設計

數據庫設計:

   Admin, 存放所有的登陸用戶

   Employee, 存放所有的員工信息

系統設計

a. 系統結構

分層: 基于mvc模式的分層

b. 項目用到的公用組件、類 (了解)

CREATE TABLE admin(    id INT PRIMARY KEY AUTO_INCREMENT,    userName VARCHAR(20),    pwd VARCHAR(20))-- 員工CREATE TABLE employee(   empId INT PRIMARY KEY AUTO_INCREMENT,   empName VARCHAR(20),   dept_id  INT   --  外鍵字段   );package com.xp.entity;public class Admin {	private int id;	private String userName;	private String pwd;	public String getPwd() {		return pwd;	}	public void setPwd(String pwd) {		this.pwd = pwd;	}	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;	}}package com.xp.dao;import com.xp.entity.Admin;public interface IAdminDao {	/**	 * 保存	 * @param admin	 */	void save(Admin admin);	/**	 * 根據用戶名密碼查詢	 */	Admin findByNameAndPwd(Admin admin);		/**	 * 檢查用戶名是否存在	 * @param name   要檢查的用戶名	 * @return  true表示用戶名已經存在; 否則用戶名不存在	 */	boolean userExists(String name);}package com.xp.dao.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.xp.dao.IAdminDao;import com.xp.entity.Admin;import com.xp.utils.JdbcUtil;/** * 2. 數據訪問層接口的實現類*/public class AdminDao implements IAdminDao {		private Connection con;	private PreparedStatement pstmt;	private ResultSet rs;		@Override	public Admin findByNameAndPwd(Admin admin) {		String sql = "select * from admin where userName=? and pwd=?";		Admin ad = null;		try {			con = JdbcUtil.getConnection();			pstmt = con.prepareStatement(sql);			pstmt.setString(1, admin.getUserName());			pstmt.setString(2, admin.getPwd());			// 執行			rs = pstmt.executeQuery();			// 遍歷			if (rs.next()) {				ad = new Admin();				ad.setId(rs.getInt("id"));				ad.setUserName(rs.getString("userName"));				ad.setPwd(rs.getString("pwd"));			}			return ad;		} catch (Exception e) {			throw new RuntimeException(e);		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}	@Override	public void save(Admin admin) {		String sql = "INSERT INTO admin(userName,pwd) VALUES(?,?);";		try {			con = JdbcUtil.getConnection();			pstmt = con.prepareStatement(sql);			// 設置參數			pstmt.setString(1, admin.getUserName());			pstmt.setString(2, admin.getPwd());			// 執行更新			pstmt.executeUpdate();				} catch (Exception e) {			throw new RuntimeException(e);		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}			}	@Override	public boolean userExists(String name) {		String sql = "select id from admin where userName=?";		try {			con = JdbcUtil.getConnection();			pstmt = con.prepareStatement(sql);			// 設置參數			pstmt.setString(1, name);			// 執行查詢			rs = pstmt.executeQuery();			// 判斷			if (rs.next()) {				int id = rs.getInt("id");				if (id > 0) {					// 用戶名已經存在					return true;				}			}			return false;		} catch (SQLException e) {			throw new RuntimeException(e);		} finally {			JdbcUtil.closeAll(con, pstmt, rs);		}	}}package com.xp.service;import com.xp.entity.Admin;import com.xp.exception.UserExistsException;public interface IAdminService {	/**	 * 注冊	 */	void register(Admin admin) throws UserExistsException;		/**	 * 登陸	 */	Admin login(Admin admin);}package com.xp.exception;public class UserExistsException extends Exception {	public UserExistsException() {	}	public UserExistsException(String message) {		super(message);	}	public UserExistsException(Throwable cause) {		super(cause);	}	public UserExistsException(String message, Throwable cause) {		super(message, cause);	}}package com.xp.service.impl;import com.xp.dao.IAdminDao;import com.xp.dao.impl.AdminDao;import com.xp.entity.Admin;import com.xp.exception.UserExistsException;import com.xp.service.IAdminService;/** * 3. 業務邏輯層實現 *  * @author Jie.Yuan *  */public class AdminService implements IAdminService {	// 調用的dao	private IAdminDao adminDao = new AdminDao();	@Override	public Admin login(Admin admin) {		try {			return adminDao.findByNameAndPwd(admin);		} catch (Exception e) {			throw new RuntimeException(e);		}	}	@Override	public void register(Admin admin) throws UserExistsException {		try {			// 1. 先根據用戶名查詢用戶是否存在			boolean flag = adminDao.userExists(admin.getUserName());			// 2. 如果用戶存在,不允許注冊			if (flag) {				// 不允許注冊, 給調用者提示				throw new UserExistsException("用戶名已經存在,注冊失敗!");			}			// 3. 用戶不存在,才可以注冊			adminDao.save(admin);		} catch (UserExistsException e) {			throw e;		} catch (Exception e) {			throw new RuntimeException(e);		}	}}package com.xp.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.xp.entity.Admin;import com.xp.exception.UserExistsException;import com.xp.service.IAdminService;import com.xp.service.impl.AdminService;public class AdminServlet extends HttpServlet {	// 調用的service	private IAdminService adminService = new AdminService();	public void doPost(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		this.doGet(request, response);	}	public void doGet(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		// 獲取操作類型		String method = request.getParameter("method");		if ("register".equals(method)) {			register(request, response);		}	}	/**	 * 注冊處理方法	 * 	 * @param request	 * @param response	 * @throws IOException	 * @throws ServletException	 */	private void register(HttpServletRequest request,			HttpServletResponse response) throws IOException, ServletException {		// 1. 獲取請求參數		String userName = request.getParameter("userName");		String pwd = request.getParameter("pwd");		// 封裝		Admin admin = new Admin();		admin.setUserName(userName);		admin.setPwd(pwd);		// 2. 調用Service處理注冊的業務邏輯		try {			adminService.register(admin);			// 注冊成功,跳轉到首頁			request.getRequestDispatcher("/index.jsp").forward(request,					response);		} catch (UserExistsException e) {			// 用戶名存在,注冊失敗(跳轉到注冊頁面)			request.setAttribute("message", "用戶名已經存在");			// 轉發			request.getRequestDispatcher("/register.jsp").forward(request,					response);		} catch (Exception e) {			e.printStackTrace(); // 測試時候用			// 其他錯誤, 跳轉到錯誤頁面			response.sendRedirect(request.getContextPath() + "/error/error.jsp");		}	}}<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>        <title>注冊</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">      </head>    <body>  	<form name="frm1" action="${pageContext.request.contextPath }/admin?method=register" method="post" >  		<table>  			<tr>  				<td>用戶名</td>  				<td>  					<input type="text" name="userName"/>  					${requestScope.message } <!-- 如果用戶名存在注冊失敗,給用戶提示 -->  				</td>  			</tr>  			<tr>  				<td>密碼</td>  				<td><input type="password" name="pwd"/></td>  			</tr>  			<tr>  				<td colspan="2">  					<input type="submit" value="親,點我注冊!">  				</td>  			</tr>  		</table>  	  	</form>  </body></html>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品中文字幕久久臀| 日韩精品亚洲精品| 欧美黄网免费在线观看| 狠狠操狠狠色综合网| 久久全球大尺度高清视频| 精品国产欧美成人夜夜嗨| 精品日韩中文字幕| 欧美成aaa人片免费看| 国产精品va在线| 九九热视频这里只有精品| 色老头一区二区三区| 中文字幕精品—区二区| 欧美成aaa人片在线观看蜜臀| 成人免费高清完整版在线观看| 国产精品视频久久久| 亚洲精品99久久久久中文字幕| 国产亚洲精品va在线观看| 青青a在线精品免费观看| 日本免费一区二区三区视频观看| 欧美性猛交xxxx乱大交| 国产精品亚洲视频在线观看| 日韩欧美国产骚| 97在线精品国自产拍中文| 亚洲最大福利视频| 亚洲视频欧洲视频| 亚洲欧美在线一区二区| 国产精品视频公开费视频| 欧美激情免费在线| 亚洲欧美日本精品| 成人免费看黄网站| 成人精品久久久| 日韩在线视频网| 国产精品久久久久久久久久三级| 性欧美办公室18xxxxhd| 永久免费看mv网站入口亚洲| 国产精品高清网站| 日韩久久免费电影| 久久国产天堂福利天堂| 欧美老女人性视频| 日韩福利在线播放| 久久精品久久精品亚洲人| 欧美成人三级视频网站| 亚洲第一免费网站| 成人激情视频免费在线| 日韩中文字幕视频在线| 免费91麻豆精品国产自产在线观看| 欧美性猛交xxxx| 日韩av在线一区| 亚洲精品一区二区三区婷婷月| 欧美在线影院在线视频| 国产免费一区二区三区香蕉精| 亚洲免费电影在线观看| 日韩av在线导航| 亚洲在线免费看| 自拍视频国产精品| 亚洲美女动态图120秒| 麻豆乱码国产一区二区三区| 97精品国产91久久久久久| 国产亚洲人成网站在线观看| 中文字幕国产精品久久| 亚州成人av在线| 欧美一级电影免费在线观看| 日韩av一区二区在线| 久久久免费观看| 亚洲白虎美女被爆操| 91免费看片在线| 精品国产91久久久久久| 欧美日韩免费网站| 国产成人极品视频| 欧美有码在线观看| 夜夜嗨av一区二区三区四区| 欧美成人精品不卡视频在线观看| 中文字幕一精品亚洲无线一区| 欧美激情视频在线观看| 精品成人在线视频| 中文字幕精品久久| 97在线免费观看视频| 中文字幕欧美亚洲| 亚洲自拍偷拍视频| 欧美激情影音先锋| 欧美大片第1页| 97久久国产精品| 欧美性猛交xxxx黑人猛交| 欧美乱大交做爰xxxⅹ性3| 日韩欧美在线播放| 91精品国产自产在线老师啪| 久久精品国产欧美激情| 久久精品美女视频网站| 亚洲精品美女在线观看播放| 亚洲成人免费网站| 亚洲国产精品久久久久久| 日韩av一区二区在线| 欧美成人在线免费视频| 精品国产美女在线| 中文字幕不卡av| 欧美午夜久久久| 麻豆国产精品va在线观看不卡| 国产日韩欧美黄色| 97婷婷大伊香蕉精品视频| 国产在线视频2019最新视频| 欧美黄色三级网站| 精品香蕉一区二区三区| 午夜精品久久久久久久99热浪潮| 精品偷拍各种wc美女嘘嘘| 欧美最猛黑人xxxx黑人猛叫黄| 欧美一区二区三区免费观看| 亚洲精品资源在线| 日本高清视频精品| 成人激情免费在线| 最新国产精品拍自在线播放| 一区二区三区视频免费| 久久手机免费视频| 欧美激情视频一区| 日韩一级裸体免费视频| 日韩免费在线电影| 成人久久一区二区| 欧美国产日韩中文字幕在线| 久色乳综合思思在线视频| 久久九九热免费视频| 中文字幕亚洲天堂| 日韩欧美亚洲成人| 精品视频中文字幕| 欧美日韩精品二区| 亚洲欧美成人一区二区在线电影| 亚洲自拍偷拍福利| 亚洲精品www久久久久久广东| 欧美成人午夜激情视频| 欧美www视频在线观看| 亚洲第一福利网| 大桥未久av一区二区三区| 欧美www视频在线观看| 91中文在线观看| 亚洲一区www| 国产一区二区三区中文| 92国产精品久久久久首页| 美女视频久久黄| 欧美专区福利在线| 午夜剧场成人观在线视频免费观看| 久久夜精品香蕉| 国内精品一区二区三区四区| 欧美肥臀大乳一区二区免费视频| 国产91热爆ts人妖在线| 亚洲成人黄色网址| 91高清视频在线免费观看| 最新亚洲国产精品| 日韩经典第一页| 日韩成人在线视频观看| 51ⅴ精品国产91久久久久久| 青草成人免费视频| 精品视频在线播放| 91成人精品网站| 伊人久久大香线蕉av一区二区| 97国产一区二区精品久久呦| 国模私拍视频一区| 亚洲精品日韩av| 日韩精品久久久久| 久久免费高清视频| 国产精品99久久久久久久久久久久| 欧美精品videossex性护士| 精品高清一区二区三区| 国产精品视频一| 精品久久久久久国产| 亚洲性线免费观看视频成熟| 国产在线观看91精品一区|