MVC設計模式、事務、連接池

重點

1.JavaBean的概念

 就是一個普通類(實體bean),包含三樣標準:
 一個無參構造
 私有屬性
 公共的getter和setter方法

2.MVC設計模式

 M:Model模型【JavaBean】
 V:View視圖 【JSP】
 C:Controller控制器 【Servlet】

3.分層思想

web層(表示層)、service層(業務層)、dao層(數據訪問層)

圖示:
在這裏插入圖片描述

4.MySQL事務

4.1 概念

事務指邏輯上的一組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。一般超過兩條以上的sql操作,建議使用事務,保證數據的安全。

4.2 使用事務

**場景一:**windows命令行

 start transaction 開啓事務
 Rollback 回滾事務
 Commit 提交事務

**場景二:**JDBC使用事務
前提:需要Connection對象

Connection.setAutoCommit(false);start transaction
Connection.rollback(); rollback
Connection.commit(); commit

4.3事務的隔離級別

分類:

贓讀:指一個事務讀取了另一個事務未提交的數據。
不可重複讀:在一個事務內讀取表中的某一行數據,多次讀取結果不同。一個事務讀取到了另一個事務提交後的數據。(update)
虛讀(幻讀):是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。 (insert)

數據庫通過設置事務的隔離級別防止以上情況的發生:

  • 1、READ UNCOMMITTED: 贓讀、不可重複讀、虛讀都有可能發生。
    2、READ COMMITTED: 避免贓讀。不可重複讀、虛讀都有可能發生。(oracle默認的)
    4、REPEATABLE READ:避免贓讀、不可重複讀。虛讀有可能發生。(mysql默認)
    8、SERIALIZABLE: 避免贓讀、不可重複讀、虛讀。
    級別越高,性能越低,數據越安全

mysql中查看當前的事務隔離級別:

select @@tx_isolation; (低版本的mysql)
select @@transaction_isolation;(高版本的mysql,如我的8.0.12)

mysql中更改當前的事務隔離級別:
set transaction isolation level REPEATABLE READ;

5.數據庫連接池

5.1常用的數據庫連接池

DBCP:是java數據庫連接池的一種,由Apache開發,通過數據庫連接池,可以讓程序自動管理數據庫連接的釋放和斷開。
C3P0:是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。

5.2使用方法

DBCP使用

  1. 添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar
  2. 添加屬性資源文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day12
username=root
password=root

#<!-- 初始化連接 -->
initialSize=10
#最大連接數量
maxActive=50
#<!-- 最大空閒連接 -->
maxIdle=20
#<!-- 最小空閒連接 -->
minIdle=5
#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60-->
maxWait=60000


#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須爲這樣:[屬性名=property;] 
#注意:"user""password" 兩個屬性會被明確地傳遞,因此這裏不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=utf8

#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true

#driver default 指定由連接池所創建的連接的只讀(read-only)狀態。
#如果沒有設置該值,則“setReadOnly”方法將不被調用。(某些驅動並不支持只讀模式,如:Informix)
defaultReadOnly=

#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ

在這裏插入圖片描述
C3P0的使用

  1. 添加jar包
  2. 編寫配置文件c3p0-config.xml(不能更改),放在classpath中,或classes目錄中
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
	<property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql://localhost:3306/day12</property>
	<property name="user">root</property>
	<property name="password">123456</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
  </default-config>
</c3p0-config>

編寫工具類:
在這裏插入圖片描述

6.JNDI

6.1JNDI概念

 JNDI(Java Naming and Directory Interface)是一個應用程序設計的API
 爲開發人員提供了查找和訪問各種命名和目錄服務的通用、統一的接口
 類似JDBC都是構建在抽象層上。
 現在JNDI已經成爲J2EE的標準之一,所有的J2EE容器都必須提供一個JNDI的服務。

6.2 Tomcat中配置JNDI 數據源

 開發JavaWeb應用,必須使用一個JavaWeb服務器,JavaWeb服務器都內置數據源。這種配置就是JDNI
 Tomcat 內置了數據源就是:(DBCP),所以數據源只需要配置服務器即可。

使用步驟:
Step1:拷貝數據庫連接驅動的jar到tomcat的lib目錄下(注意驅動版本)
Step2:配置數據源XML文件(在當前應用的META-INF中創建context.xml, 編寫數據源)
注:多個數據源的配置(聲明多個Resource即可)

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource name="jdbc/day12DB"
            auth="Container"
            type="javax.sql.DataSource"
            username="root"
            password="123456"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/day12"
            maxTotal="8"
            maxIdle="4"/>
</Context>

Step3:使用連接池
在這裏插入圖片描述

練習題

1.登錄註冊註銷案例

重點掌握:

  • MVC的開發模式
  • 一般的開發順序是:dao-daoImpl-service-serviceImpl-servlet-jsp,他們之間是通過model傳遞數據的
  • 登錄表單驗證:
public class UserForm {
	private String username;
	private String password;
	private String repassword;
	private String email;
	private String birthday;
	
	Map<String, String> err = new HashMap<String,String>();

	//正則校驗
	/**
	 * username : 用戶名長度要在5~15
	 * password : 密碼不能爲空,6~9位
	 * repassword:和password要一樣
	 * email    : 郵箱的格式不正確
	 * birthday :日期爲yyyy-MM-dd的格式
	 */
	public boolean validate() {
		if (username == null || username.trim().length() == 0) {
			err.put("username", "用戶名不能爲空");
		}
		if (!username.matches("\\w{5,15}")) {
			err.put("username", "用戶名長度要在5~15位");
		}
		
		if (password == null || password.trim().length() == 0) {
			err.put("password", "密碼不能爲空");
		}
		if (!password.matches("\\w{6,9}")) {
			err.put("password", "密碼長度要在6~9位");
		}
		
		if (repassword == null || password.trim().length() == 0) {
			err.put("password", "密碼不能爲空");
		}
		if (!repassword.equals(password)) {
			err.put("repassword", "密碼前後不一致");
		}
		
		if (email == null || email.trim().length() == 0) {
			err.put("email", "郵箱不能爲空");
		}
		if (!email.matches("^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$")) {//百度裏搜的 郵箱的正則表達式 java
			err.put("email", "郵箱的格式不正確");
		}
		
		//日期的校驗
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			sdf.parse(birthday);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			err.put("birthday", "日期的格式應爲:2020-02-02");
		}
		
		return err.size()==0;
	}
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getRepassword() {
		return repassword;
	}

	public void setRepassword(String repassword) {
		this.repassword = repassword;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getBirthday() {
		return birthday;
	}

	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}

	public Map<String, String> getErr() {
		return err;
	}

	public void setErr(Map<String, String> err) {
		this.err = err;
	}
	
	
}

面試題

1.事務的4大特性

原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
一致性:事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。轉賬前和轉賬後的總金額不變。
隔離性:事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作數據所幹擾,多個併發事務之間要相互隔離。
持久性:指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。

連接池原理:

在這裏插入圖片描述
**目的:**解決建立數據庫連接耗費資源和時間很多的問題,提高性能。

總結

通過一天的學習,熟悉了MVC的設計模式,通過分層思想,體會到了接口開發的優勢,另外通過登錄註冊的小案例,知道了數據在前後端交互的規律,本質是封裝的model對象(即Java Bean)之間的傳遞。會使用登錄的表單驗證,主要考察的是正則表達式的使用。然後,又學了MySQL的事務,知道了事務的四大特性以及隔離級別,會在windows和jdbc裏面操作事務,使用事務:事務開啓、回滾、提交。數據庫連接池的出現,解決了建立數據庫連接耗費資源和時間很多的問題,提高了性能,常用的數據庫連接池有DBCP和C3P0,tomcat內置的數據源也可以用(本質是:dbcp)。萬丈高樓平地起,不要懷疑自己的努力,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章