国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

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

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

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

--創(chuàng)建數(shù)據庫

CREATEDATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i

--創(chuàng)建表

USEjdbc_demo;

CREATETABLE admin(

    id INT PRIMARY KEY AUTO_INCREMENT,

    userName VARCHAR(20),

    pwd VARCHAR(20)

)

|--Statement      執(zhí)行SQL命令

   |-- CallableStatement,     執(zhí)行存儲過程

|--PreparedStatement    預編譯SQL語句執(zhí)行

使用預編譯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 {	// 連接參數(shù)	// 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 加載驅動,創(chuàng)建連接			Class.forName("com.mysql.jdbc.Driver");			con = DriverManager.getConnection(url, user, password);			// 1.2 創(chuàng)建stmt對象			stmt = con.createStatement();			// 1.3 執(zhí)行查詢			rs = stmt.executeQuery(sql);			// 業(yè)務判斷			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 加載驅動,創(chuàng)建連接			Class.forName("com.mysql.jdbc.Driver");			con = DriverManager.getConnection(url, user, password);			// 1.2 創(chuàng)建pstmt對象			pstmt = con.prepareStatement(sql); // 對sql語句預編譯			// 設置占位符值			pstmt.setString(1, userName);			pstmt.setString(2, pwd);			// 1.3 執(zhí)行			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 {	// 連接參數(shù)		// 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 {	// 全局參數(shù)	private Connection con;	private Statement stmt;	private PreparedStatement pstmt;	private CallableStatement cstmt; // 存儲過程	private ResultSet rs;	// 程序中調用存儲過程	@Test	public void testCall() throws Exception {		try {			// 1 . 創(chuàng)建連接			con = JdbcUtil.getConnection();			// 2. 創(chuàng)建執(zhí)行存儲過程的stmt對象			CallableStatement cstmt = con.prepareCall("CALL proc_login");			// 3. 執(zhí)行(存儲過程)			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();		}	}}

一、 批處理

很多時候,需要批量執(zhí)行sql語句!

需求:批量保存信息! 

設計:

   AdminDao

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

        // 循環(huán)

        // 保存 (批量保存)

      }

      Public  void save(Admin  admin ){

        // 循環(huán)

        // 保存

      }

技術:

   |-- Statement

   批處理相關方法

      voidaddBatch(String sql)     添加批處理

      voidclearBatch()            清空批處理

int[] executeBatch()         執(zhí)行批處理

實現(xiàn):

   Admin.java         實體類封裝數(shù)據

   AdminDao.java      封裝所有的與數(shù)據庫的操作

   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 {	// 全局參數(shù)	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();			// 創(chuàng)建stmt			pstmt = con.prepareStatement(sql); // 【預編譯SQL語句】			for (int i = 0; i < list.size(); i++) {				Admin admin = list.get(i);				// 設置參數(shù)				pstmt.setString(1, admin.getUserName());				pstmt.setString(2, admin.getPwd());				// 添加批處理				pstmt.addBatch(); // 【不需要傳入SQL】				// 測試:每5條執(zhí)行一次批處理				if (i % 5 == 0) {					// 批量執(zhí)行					pstmt.executeBatch();					// 清空批處理					pstmt.clearBatch();				}			}			// 批量執(zhí)行			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 {		// 模擬數(shù)據		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);	}}四、 插入數(shù)據,獲取自增長值 需求:  李俊杰     18張相       19如何設計數(shù)據庫?編號    員工姓名    年齡    部門01       李俊杰      18     開發(fā)部02       張三        19     開發(fā)部’思考:如何減少數(shù)據冗余? 設置外鍵約束所以,編號    員工姓名    年齡    部門01       李俊杰      18     102       張三        19     1部門編號     部門名稱    1             開發(fā)部            部門與員工,一對多的關系 設計數(shù)據庫:員工表 (外鍵表) 【員工表有一個外鍵字段,引用了部門表的主鍵】部門表(主鍵表) 編碼總體思路:保存員工及其對應的部門!步驟:1. 先保存部門2. 再得到部門主鍵,再保存員工開發(fā)具體步驟: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;	// 關聯(lián)的部門	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;	// 保存員工,同時保存關聯(lián)的部門	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);			// 設置參數(shù)			pstmt.setString(1, emp.getDept().getDeptName());			// 執(zhí)行			pstmt.executeUpdate();						// 【二、獲取上面保存的部門子增長的主鍵】			rs =  pstmt.getGeneratedKeys();			// 得到返回的自增長字段			if (rs.next()) {				deptId = rs.getInt(1);			}						/*****保存員工*********/			pstmt = con.prepareStatement(sql_emp);			// 設置參數(shù)			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 {		// 模擬數(shù)據		Dept d = new Dept();		d.setDeptName("應用開發(fā)部");		Employee emp = new Employee();		emp.setEmpName("李俊杰");		emp.setDept(d);   // 關聯(lián)		// 調用dao保存		EmpDao empDao = new EmpDao();		empDao.save(emp);	}}

五、事務

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

事務ACID特性

 原子性(Atomicity)

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

 一致性(Consistency)

事務必須使數(shù)據庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。

 隔離性(Isolation)

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

 持久性(Durability)

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

事務的特性:

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

一致性,事務過程中,數(shù)據處于一致狀態(tài)。

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

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

案例:

需求: 張三給李四轉賬

設計: 賬戶表

技術:

|--Connection

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

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

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

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 {	// 全局參數(shù)	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);			/*** 第一次執(zhí)行SQL ***/			pstmt = con.prepareStatement(sql_zs);			pstmt.executeUpdate();			/*** 第二次執(zhí)行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);			/*** 第一次執(zhí)行SQL ***/			pstmt = con.prepareStatement(sql_zs);			pstmt.executeUpdate();			/*** 第二次執(zhí)行SQL ***/			pstmt = con.prepareStatement(sql_ls);			pstmt.executeUpdate();		} catch (Exception e) {			try {				// 二、 出現(xiàn)異常,需要回滾事務				con.rollback();			} catch (SQLException e1) {			}			e.printStackTrace();		} finally {			try {				// 三、所有的操作執(zhí)行成功, 提交事務				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中大文本數(shù)據類型,Clob    長文本類型   (MySQL中不支持,使用的是text)Blob    二進制類型MySQL數(shù)據庫,Text    長文本類型Blob    二進制類型需求: jdbc中操作長文本數(shù)據。設計: 測試表編碼:保存大文本數(shù)據類型讀取大文本數(shù)據類型保存二進制數(shù)據讀取二進制數(shù)據-- 測試大數(shù)據類型
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 {	// 全局參數(shù)	private Connection con;	private Statement stmt;	private PreparedStatement pstmt;	private ResultSet rs;	@Test	// 1. 保存大文本數(shù)據類型 ( 寫longtext)	public void testSaveText() {		String sql = "insert into test(content) values(?)";		try {			// 連接			con = JdbcUtil.getConnection();			// pstmt 對象			pstmt = con.prepareStatement(sql);			// 設置參數(shù)			// 先獲取文件路徑			String path = App_text.class.getResource("tips.txt").getPath();			FileReader reader = new FileReader(new File(path));			pstmt.setCharacterStream(1, reader);			// 執(zhí)行sql			pstmt.executeUpdate();			// 關閉			reader.close();		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}	@Test	// 2. 讀取大文本數(shù)據類型 ( 讀longtext)	public void testGetAsText() {		String sql = "select * from  test;";		try {			// 連接			con = JdbcUtil.getConnection();			// pstmt 對象			pstmt = con.prepareStatement(sql);			// 讀取			rs = pstmt.executeQuery();			if (rs.next()) {				// 獲取長文本數(shù)據, 方式1:				// Reader r = rs.getCharacterStream("content");				// 獲取長文本數(shù)據, 方式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 {	// 全局參數(shù)	private Connection con;	private Statement stmt;	private PreparedStatement pstmt;	private ResultSet rs;	@Test	// 1. 二進制數(shù)據類型 ( 寫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);			// 執(zhí)行保存圖片			pstmt.execute();			// 關閉			in.close();		} catch (Exception e) {			e.printStackTrace();		} finally {			JdbcUtil.closeAll(con, pstmt, null);		}	}	@Test	// 2. 讀取大文本數(shù)據類型 ( 讀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);		}	}}

五、綜合案例

需求分析:

   登陸、注冊、注銷;

   登陸成功,

      顯示所有的員工

設計

數(shù)據庫設計:

   Admin, 存放所有的登陸用戶

   Employee, 存放所有的員工信息

系統(tǒng)設計

a. 系統(tǒng)結構

分層: 基于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. 數(shù)據訪問層接口的實現(xiàn)類*/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());			// 執(zhí)行			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);			// 設置參數(shù)			pstmt.setString(1, admin.getUserName());			pstmt.setString(2, admin.getPwd());			// 執(zhí)行更新			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);			// 設置參數(shù)			pstmt.setString(1, name);			// 執(zhí)行查詢			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. 業(yè)務邏輯層實現(xiàn) *  * @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. 獲取請求參數(shù)		String userName = request.getParameter("userName");		String pwd = request.getParameter("pwd");		// 封裝		Admin admin = new Admin();		admin.setUserName(userName);		admin.setPwd(pwd);		// 2. 調用Service處理注冊的業(yè)務邏輯		try {			adminService.register(admin);			// 注冊成功,跳轉到首頁			request.getRequestDispatcher("/index.jsp").forward(request,					response);		} catch (UserExistsException e) {			// 用戶名存在,注冊失敗(跳轉到注冊頁面)			request.setAttribute("message", "用戶名已經存在");			// 轉發(fā)			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>
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 三明市| 吴堡县| 新闻| 大埔区| 海盐县| 涪陵区| 房产| 收藏| 漠河县| 吴堡县| 来安县| 浦县| 右玉县| 苍山县| 晴隆县| 石台县| 谢通门县| 通许县| 宜昌市| 灵璧县| 大石桥市| 昆山市| 康平县| 黄龙县| 陇川县| 兴宁市| 淮北市| 尚志市| 丁青县| 洮南市| 阳江市| 大姚县| 准格尔旗| 夹江县| 商都县| 井冈山市| 长垣县| 汉源县| 巴楚县| 昔阳县| 如东县|