持久化歷史實物記錄(繩結(jié)、泥板、竹片、絹布、紙張)電子文件數(shù)據(jù)庫管理系統(tǒng)關(guān)系型數(shù)據(jù)庫Relation in Co" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > Web開發(fā)基礎(chǔ)-07-數(shù)據(jù)設(shè)計

Web開發(fā)基礎(chǔ)-07-數(shù)據(jù)設(shè)計

時間:2023-10-09 10:36:01 | 來源:網(wǎng)站運營

時間:2023-10-09 10:36:01 來源:網(wǎng)站運營

Web開發(fā)基礎(chǔ)-07-數(shù)據(jù)設(shè)計:

07-數(shù)據(jù)設(shè)計

數(shù)據(jù)持久化

為什么持久化

知識:數(shù)據(jù)被記錄(record)、存儲(storage)、回憶(recall)。

持久化歷史

關(guān)系型數(shù)據(jù)庫

Relation in Concept Model







Relation in database




Concept model->Logic model ->Physical model

Concept model




Logic model




Physical model




索引

Why 索引

在數(shù)據(jù)庫系統(tǒng)的使用過程當(dāng)中,數(shù)據(jù)的查詢是使用最頻繁的一種數(shù)據(jù)操作。

? 最基本的查詢算法當(dāng)然是順序查找(linear search),遍歷表然后逐行匹配行值是否等于待查找的關(guān)鍵字,其時間復(fù)雜度為O(n)。但時間復(fù)雜度為O(n)的算法規(guī)模小的表,負(fù)載輕的數(shù)據(jù)庫,也能有好的性能。 但是數(shù)據(jù)增大的時候,時間復(fù)雜度為O(n)的算法顯然是糟糕的,性能就很快下降了。

? 好在計算機科學(xué)的發(fā)展提供了很多更優(yōu)秀的查找算法,例如二分查找(binary search)、二叉樹查找(binary tree search)等。如果稍微分析一下會發(fā)現(xiàn),每種查找算法都只能應(yīng)用于特定的數(shù)據(jù)結(jié)構(gòu)之上,例如二分查找要求被檢索數(shù)據(jù)有序,而二叉樹查找只能應(yīng)用于二叉查找樹上,但是數(shù)據(jù)本身的組織結(jié)構(gòu)不可能完全滿足各種數(shù)據(jù)結(jié)構(gòu)(例如,理論上不可能同時將兩列都按順序進(jìn)行組織),所以,在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實現(xiàn)高級查找算法。這種數(shù)據(jù)結(jié)構(gòu),就是索引。

? 索引是對數(shù)據(jù)庫表 中一個或多個列的值進(jìn)行排序的結(jié)構(gòu)。與在表 中搜索所有的行相比,索引用指針 指向存儲在表中指定列的數(shù)據(jù)值,然后根據(jù)指定的次序排列這些指針,有助于更快地獲取信息。通常情 況下 ,只有當(dāng)經(jīng)常查詢索引列中的數(shù)據(jù)時 ,才需要在表上創(chuàng)建索引。索引將占用磁盤空間,并且影響數(shù) 據(jù)更新的速度。但是在多數(shù)情況下 ,索引所帶來的數(shù)據(jù)檢索速度優(yōu)勢大大超過它的不足之處。

Why B+ Tree

1.文件很大,不可能全部存儲在內(nèi)存中,故要存儲到磁盤上

2.索引的結(jié)構(gòu)組織要盡量減少查找過程中磁盤I/O的存取次數(shù)(為什么使用B-/+Tree,還跟磁盤存取原理有關(guān)。)

3.局部性原理與磁盤預(yù)讀,預(yù)讀的長度一般為頁(page)的整倍數(shù),(在許多操作系統(tǒng)中,頁得大小通常為4k)

4.數(shù)據(jù)庫系統(tǒng)巧妙利用了磁盤預(yù)讀原理,將一個節(jié)點的大小設(shè)為等于一個頁,這樣每個節(jié)點只需要一次I/O就可以完全載入,(由于節(jié)點中有兩個數(shù)組,所以地址連續(xù))。而紅黑樹這種結(jié)構(gòu),h明顯要深的多。由于邏輯上很近的節(jié)點(父子)物理上可能很遠(yuǎn),無法利用局部性

索引實現(xiàn)

InnoDB索引和MyISAM索引的區(qū)別:

一是主索引的區(qū)別:InnoDB的數(shù)據(jù)文件本身就是索引文件。而MyISAM的索引和數(shù)據(jù)是分開的。

二是輔助索引的區(qū)別:InnoDB的輔助索引data域存儲相應(yīng)記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區(qū)別。

MyISAM




innoDB




將類圖映射為關(guān)系表

ORM(Object-Relation Mapping) + 通常一個類/對象映射為一張表 + 類的屬性映射為表的列名 + 類的實例對象就是表的行 + 要為每個轉(zhuǎn)換后的表建立主鍵 - 類/對象通過引用來唯一標(biāo)識自己 - 關(guān)系/表通過主鍵類唯一標(biāo)識自己 + 處理關(guān)聯(lián) - 類/對象通過鏈接實現(xiàn)關(guān)聯(lián) - 關(guān)系/表通過主鍵/外鍵對實現(xiàn)關(guān)聯(lián) + 1:1關(guān)聯(lián):其中一個表的主鍵,作為另一個表的外鍵;兩端等價 + 1:N關(guān)聯(lián):將1端表的主鍵,作為N端表的外鍵 + M:N關(guān)聯(lián):建立中間表,將M的主鍵和N的主鍵都作為中間表的外鍵 - 在包含/聚合關(guān)聯(lián)中,將整體的主鍵放在部分中作為外鍵 - 關(guān)聯(lián)的最小基數(shù)為0,意味著相應(yīng)外鍵可以為NULL

Mysql

安裝




啟動




用初始密碼登錄

mysql -u root -p

修改初始密碼

ALTER USER 'root'@'localhost' IDENTIFIED BY '[your new password]';

JDBC




主要步驟

API

//1.加載驅(qū)動程序Class.forName("com.mysql.jdbc.Driver");//2. 獲得數(shù)據(jù)庫連接Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);//3.操作數(shù)據(jù)庫,實現(xiàn)增刪改查Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess");//如果有數(shù)據(jù),rs.next()返回truewhile(rs.next()){ System.out.println(rs.getString("user_name")+" 年齡:"+rs.getInt("age"));}

DAO

DAO模式

DAO (Data Access objects 數(shù)據(jù)存取對象)是指位于業(yè)務(wù)邏輯和持久化數(shù)據(jù)之間實現(xiàn)對持久化數(shù)據(jù)的訪問。通俗來講,就是將數(shù)據(jù)庫操作都封裝起來。




對外提供相應(yīng)的接口

在面向?qū)ο笤O(shè)計過程中,有一些"套路”用于解決特定問題稱為模式。 DAO 模式提供了訪問關(guān)系型數(shù)據(jù)庫系統(tǒng)所需操作的接口,將數(shù)據(jù)訪問和業(yè)務(wù)邏輯分離對上層提供面向?qū)ο蟮臄?shù)據(jù)訪問接口。

從以上 DAO 模式使用可以看出,DAO 模式的優(yōu)勢就在于它實現(xiàn)了兩次隔離。

1、隔離了數(shù)據(jù)訪問代碼和業(yè)務(wù)邏輯代碼。業(yè)務(wù)邏輯代碼直接調(diào)用DAO方法即可,完全感覺不到數(shù)據(jù)庫表的存在。分工明確,數(shù)據(jù)訪問層代碼變化不影響業(yè)務(wù)邏輯代碼,這符合單一職能原則,降低了藕合性,提高了可復(fù)用性。 2、隔離了不同數(shù)據(jù)庫實現(xiàn)。采用面向接口編程,如果底層數(shù)據(jù)庫變化,如由 MySQL 變成 Oracle 只要增加 DAO 接口的新實現(xiàn)類即可,原有 MySQ 實現(xiàn)不用修改。這符合 "開-閉" 原則。該原則降低了代碼的藕合性,提高了代碼擴(kuò)展性和系統(tǒng)的可移植性。

組成部分

1、DAO接口: 把對數(shù)據(jù)庫的所有操作定義成抽象方法,可以提供多種實現(xiàn)。 2、DAO 實現(xiàn)類: 針對不同數(shù)據(jù)庫給出DAO接口定義方法的具體實現(xiàn)。 3、實體類:用于存放與傳輸對象數(shù)據(jù)。 4、數(shù)據(jù)庫連接和關(guān)閉工具類: 避免了數(shù)據(jù)庫連接和關(guān)閉代碼的重復(fù)使用,方便修改。

樣例代碼

DAO 接口:

public interface PetDao { /** * 查詢所有寵物 */ List<Pet> findAllPets() throws Exception;}DAO 實現(xiàn)類:

public class PetDaoImpl extends BaseDao implements PetDao { /** * 查詢所有寵物 */ public List<Pet> findAllPets() throws Exception { Connection conn=BaseDao.getConnection(); String sql="select * from pet"; PreparedStatement stmt= conn.prepareStatement(sql); ResultSet rs= stmt.executeQuery(); List<Pet> petList=new ArrayList<Pet>(); while(rs.next()) { Pet pet=new Pet( rs.getInt("id"), rs.getInt("owner_id"), rs.getInt("store_id"), rs.getString("name"), rs.getString("type_name"), rs.getInt("health"), rs.getInt("love"), rs.getDate("birthday") ); petList.add(pet); } BaseDao.closeAll(conn, stmt, rs); return petList; }}寵物實體類(里面get/set方法就不列出了)

public class Pet { private Integer id; private Integer ownerId; //主人ID private Integer storeId; //商店ID private String name; //姓名 private String typeName; //類型 private int health; //健康值 private int love; //愛心值 private Date birthday; //生日}連接數(shù)據(jù)庫

public class BaseDao { private static String driver="com.mysql.jdbc.Driver"; private static String url="jdbc:mysql://127.0.0.1:3306/epet"; private static String user="root"; private static String password="root"; static { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throws SQLException { if(rs!=null) { rs.close(); } if(stmt!=null) { stmt.close(); } if(conn!=null) { conn.close(); } } public int executeSQL(String preparedSql, Object[] param) throws ClassNotFoundException { Connection conn = null; PreparedStatement pstmt = null; /* 處理SQL,執(zhí)行SQL */ try { conn = getConnection(); // 得到數(shù)據(jù)庫連接 pstmt = conn.prepareStatement(preparedSql); // 得到PreparedStatement對象 if (param != null) { for (int i = 0; i < param.length; i++) { pstmt.setObject(i + 1, param[i]); // 為預(yù)編譯sql設(shè)置參數(shù) } } ResultSet num = pstmt.executeQuery(); // 執(zhí)行SQL語句 } catch (SQLException e) { e.printStackTrace(); // 處理SQLException異常 } finally { try { BaseDao.closeAll(conn, pstmt, null); } catch (SQLException e) { e.printStackTrace(); } } return 0; }}

Mybatis

MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。

樣例代碼

@Mapper@Repositorypublic interface AdminMapper { int addManager(User user); List<User> getAllManagers();}public class User { //省略getter、setter private Integer id; private String email; private String password; private String userName; private String phoneNumber; private double credit; private UserType userType;}<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.hotel.data.admin.AdminMapper"> <insert id="addManager" parameterType="com.example.hotel.po.User" useGeneratedKeys="true" keyProperty="id"> insert into User(email,password,usertype) values(#{email},#{password},#{userType}) </insert> <select id="getAllManagers" resultMap="User"> select * from User where usertype='HotelManager' </select> <resultMap id="User" type="com.example.hotel.po.User"> <id column="id" property="id"></id> <result column="email" property="email"></result> <result column="password" property="password"></result> <result column="username" property="userNzame"></result> <result column="phonenumber" property="phoneNumber"></result> <result column="credit" property="credit"></result> <result column="usertype" property="userType"></result> </resultMap></mapper>參考鏈接

https://zh.wikipedia.org/wiki/%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E5%BA%93

https://www.cnblogs.com/xyxxs/p/4440187.html

https://www.visual-paradigm.com/cn/guide/data-modeling/what-is-entity-relationship-diagram/

https://www.runoob.com/note/27029 https://www.runoob.com/w3cnote/jdbc-use-guide.html

關(guān)鍵詞:數(shù)據(jù),設(shè)計,基礎(chǔ)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉