日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Java、Mysql、MyBatis 中枚举 enum 的使用

發(fā)布時(shí)間:2023/12/9 数据库 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java、Mysql、MyBatis 中枚举 enum 的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

From: https://yulaiz.com/java-mysql-enum/

Java 和 MySql 中都有枚舉的概念,合理的使用枚舉,可以讓代碼閱讀和數(shù)據(jù)庫數(shù)據(jù)查詢更加直觀、高效。那么我們?cè)趺词褂媚?#xff0c;什么時(shí)候使用,兩者之間怎么進(jìn)行數(shù)據(jù)關(guān)聯(lián)呢?(本文使用 MyBatis 做為 Java 與 MySql 之間的關(guān)聯(lián))

文章目錄 [hide]

  • 1 1. 當(dāng)年我們?cè)趺炊x狀態(tài)
    • 1.1 1.1 數(shù)據(jù)庫設(shè)計(jì)
    • 1.2 1.2 Java Bean 代碼
    • 1.3 1.3 MyBatis 代碼
    • 1.4 1.4 代碼效果
  • 2 2. 現(xiàn)在我們?cè)趺炊x狀態(tài)
    • 2.1 2.1 Java Bean 代碼
    • 2.2 2.2 數(shù)據(jù)庫設(shè)計(jì)
    • 2.3 2.3 MyBatis 代碼
    • 2.4 2.4 代碼效果
  • 3 3. 怎么把當(dāng)年定義的狀態(tài)改成使用枚舉
    • 3.1 3.1 數(shù)據(jù)庫設(shè)計(jì)
    • 3.2 3.2 Java Bean 代碼
    • 3.3 3.3 MyBatis 代碼
      • 3.3.1 3.3.1 內(nèi)置枚舉轉(zhuǎn)換器
        • 3.3.1.1 3.3.1.1 EnumTypeHandler
        • 3.3.1.2 3.3.1.2 EnumOrdinalTypeHandler
      • 3.3.2 3.3.2 自定義枚舉轉(zhuǎn)換器
      • 3.3.3 3.3.3 在 Mapper.xml 中配置自定義的枚舉轉(zhuǎn)換器
        • 3.3.3.1 方法1:修改指定xml文件,指定的Mapper生效
        • 3.3.3.2 方法2:全局指定枚舉轉(zhuǎn)換器,無需單獨(dú)修改Mapper.xml
        • 3.3.3.3 方法3:不使用枚舉轉(zhuǎn)換器
  • 4 4. 枚舉到底好不好用
    • 4.1 4.1 Java 枚舉的實(shí)現(xiàn)
      • 4.1.1 4.1.1 基礎(chǔ)聲明、屬性、構(gòu)造函數(shù)
      • 4.1.2 4.1.2 常用方法
        • 4.1.2.1 4.1.2.1 name() 方法
        • 4.1.2.2 4.1.2.2 ordinal() 方法。
        • 4.1.2.3 4.1.2.3 toString() 方法
        • 4.1.2.4 4.1.2.4 equals(Object other) 方法
        • 4.1.2.5 4.1.2.5 compareTo(E o) 方法
        • 4.1.2.6 4.1.2.6 values() 方法
        • 4.1.2.7 4.1.2.7 valueOf(String name) 方法
      • 4.1.3 4.1.3 比較兩個(gè)枚舉值是否一致
    • 4.2 4.2 MySql 中的枚舉
      • 4.2.1 4.2.1 DDL 操作效率
        • 4.2.1.1 4.2.1.1 新增一個(gè)枚舉狀態(tài)
        • 4.2.1.2 4.2.1.2 修改一個(gè)枚舉狀態(tài)
        • 4.2.1.3 4.2.1.3 刪除一個(gè)枚舉狀態(tài)
      • 4.2.2 4.2.2 查詢效率
  • 5 5. 枚舉使用總結(jié)
  • 6 6. 參考鏈接

1. 當(dāng)年我們?cè)趺炊x狀態(tài)

我們定義狀態(tài)變量時(shí),通常需要約定幾個(gè)狀態(tài),比如交易訂單中,我們就有常見的創(chuàng)建、交易中、支付成功、支付失敗等等狀態(tài),當(dāng)年我們都是約定好 0,1,2,3,4,5 這樣的字段來表示上述幾個(gè)字段。

1.1 數(shù)據(jù)庫設(shè)計(jì)

例如我們的數(shù)據(jù)庫設(shè)計(jì)時(shí),直接這樣描述:

CREATE TABLE `order_test` (`id` int(20) NOT NULL AUTO_INCREMENT,`status` int(1) NOT NULL COMMENT '0-創(chuàng)建,1-支付中,2-支付成功,3-支付失敗,4-取消訂單',PRIMARY KEY (`id`) USING BTREE )

SQL

0-創(chuàng)建,1-支付中,2-支付成功,3-支付失敗,4-取消訂單 這就是我們的約定了。

當(dāng)然也有惡心的設(shè)計(jì)數(shù)據(jù)庫直接使用 varchar 數(shù)據(jù)類型,這就更惡心了,搜索都不好了。

1.2 Java Bean 代碼

在 Java 中我們代碼這樣寫:

public class OrderInfo {private int id;//0-創(chuàng)建,1-支付中,2-支付成功,3-支付失敗,4-取消訂單private int status; }

Java

有時(shí)候牛逼點(diǎn),我們定義點(diǎn)常量:

public interface class OrderConstants {//創(chuàng)建int ORDER_STATUS_CREATE = 0;//支付中int ORDER_STATUS_PAYING = 1;//支付成功int ORDER_STATUS_IN_PROGRESS = 2;//支付失敗int ORDER_STATUS_FAILED = 3;//取消訂單int ORDER_STATUS_REVERSED = 4; }

Java

1.3 MyBatis 代碼

然后用 MyBatis 插入查詢什么的時(shí)候也簡(jiǎn)單:

@Mapper public interface OrderMapper {int addOrder(@Param("item") OrderInfo info);OrderInfo getOrderById(@Param("id") String id); }

Java

<insert id="addOrder" parameterType="com.yulaiz.model.order.entity.OrderInfo">INSERT INTO order_test ( status )VALUES (#{item.status}) </insert> <select id="getOrderById" resultType="com.yulaiz.model.order.entity.OrderInfo">SELECT id, statusFROM order_testWHERE id = #{id} </select>

XML

1.4 代碼效果

我們最后拿到的就是 0,1,2,3,4 這樣的數(shù)值來表示訂單狀態(tài)了,當(dāng)然現(xiàn)在的例子實(shí)在簡(jiǎn)單,實(shí)際項(xiàng)目中,那可不僅僅就這么 0-4,還有很多,并且一個(gè)訂單的狀態(tài),可不僅僅就這些,還有其他字段來描述,那么在一些復(fù)雜的查詢中,那就亂套了,一堆狀態(tài),都是數(shù)字,沒辦法一個(gè)個(gè)查吧,這可是真麻煩。

2. 現(xiàn)在我們?cè)趺炊x狀態(tài)

2.1 Java Bean 代碼

一般在我設(shè)計(jì)枚舉字段的時(shí)候,我會(huì)先設(shè)計(jì) Java 部分的枚舉字段,因?yàn)槁?#xff0c;我覺得這樣粘貼復(fù)制方便一點(diǎn):

public enum OrderStatus {CREATE("創(chuàng)建"),PAYING("支付中"),IN_PROGRESS("支付成功"),FAILED("支付失敗"),REVERSED("取消訂單");private String value;OrderStatus(String value) {this.value = value;}public String getValue() {return value;} }

Java

在使用中也很簡(jiǎn)單,首先 Java Bean 設(shè)計(jì)時(shí)直接將數(shù)據(jù)類型改為 OrderStatus :

public class OrderInfo {private int id;private OrderStatus status; }

Java

賦值的時(shí)候使用:

orderInfo.setStatus(OrderStatus.CREATE);

Java

2.2 數(shù)據(jù)庫設(shè)計(jì)

在 Mysql 中這樣描述 enum 字段:

CREATE TABLE `order_test` (`id` int(20) NOT NULL AUTO_INCREMENT,`status` enum('CREATE','PAYING','IN_PROGRESS','FAILED','REVERSED') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'CREATE' COMMENT 'CREATE-創(chuàng)建,PAYING-支付中,IN_PROGRESS-支付成功,FAILED-支付失敗,REVERSED-取消訂單',PRIMARY KEY (`id`) USING BTREE )

SQL

2.3 MyBatis 代碼

接著 MyBatis 中插入查詢完全不用修改,還是上次那個(gè)原樣就ok,是不是很簡(jiǎn)單。

2.4 代碼效果

這樣一來我們?cè)?Java 代碼中就可以直接看到這個(gè)狀態(tài)是 CREATE 或者 PAYING 或者其他狀態(tài),在sql查詢中也會(huì)顯示 CREATE 或者 PAYING 或者其他狀態(tài),清晰明了,不需要再去一個(gè)個(gè)的查字段定義,非常方便閱讀。

其中Java代碼里枚舉類有一個(gè)隱藏的屬性叫 name 就是我們定義時(shí)候使用的 CREATE("創(chuàng)建"),PAYING("支付中") 當(dāng)中的 CREATE 和 PAYING ,MyBatis在插入數(shù)據(jù)庫的時(shí)候,會(huì)自動(dòng)使用這個(gè) name 屬性作為賦值,而查詢的時(shí)候也是通過數(shù)據(jù)庫查詢的內(nèi)容和 name 屬性進(jìn)行匹配。

3. 怎么把當(dāng)年定義的狀態(tài)改成使用枚舉

好了,由于本人比較懶,發(fā)現(xiàn)枚舉的好處之后就覺得,當(dāng)年寫的到底是什么垃圾代碼,由此也就想把之前定義的都替換成枚舉。

3.1 數(shù)據(jù)庫設(shè)計(jì)

首先,咱從底層入手,先看看數(shù)據(jù)庫。

要想修改成枚舉,那么我就要先新增一個(gè)枚舉字段,然后根據(jù)原有的映射,來分別 update 對(duì)應(yīng)數(shù)據(jù),但是這樣是很糟糕的操作:

  • 麻煩,當(dāng)數(shù)據(jù)量大時(shí),大量 update 操作效率很慢。
  • 修改后原有代碼邏輯沒有修改完整,導(dǎo)致出錯(cuò)。
  • 那么數(shù)據(jù)庫就先不改了,咱直接把新功能用上枚舉吧,之前的代碼不改動(dòng)了,新功能的 Java 部分直接用上枚舉,盡量讓自己寫代碼舒服點(diǎn),看著爽一些。

    3.2 Java Bean 代碼

    我們?nèi)耘f想使用 orderInfo.setStatus(OrderStatus.CREATE); 的方式進(jìn)行賦值,但是現(xiàn)在數(shù)據(jù)庫中的數(shù)據(jù)是 0,1,2... 跟枚舉類 OrderStatus 的 name屬性 不能對(duì)應(yīng)上了。

    首先我們還是先寫 Java 的枚舉,由于這次要跟數(shù)據(jù)庫對(duì)應(yīng)上,數(shù)據(jù)結(jié)構(gòu)就有點(diǎn)區(qū)別了:

    public enum OrderStatus {CREATE(0, "創(chuàng)建"),PAYING(1, "支付中"),IN_PROGRESS(2, "支付成功"),FAILED(3, "支付失敗"),REVERSED(4, "取消訂單");private int value;private String desc;OrderStatus(int value, String desc) {this.value = value;this.desc = desc;}public int getValue() {return value;}public String getDesc() {return desc;} }

    Java

    當(dāng)然,也可以:

    public enum OrderStatus {CREATE(0),PAYING(1),IN_PROGRESS(2),FAILED(3),REVERSED(4);private int value;OrderStatus(int value) {this.value = value;}public int getValue() {return value;} }

    Java

    但我覺得還是加個(gè)中文方便,那么我就想用 CREATE(0, "創(chuàng)建") 這種方式。

    3.3 MyBatis 代碼

    實(shí)際上這里的關(guān)鍵就是 MyBatis 了,怎么樣讓 MyBatis 知道我們?cè)谫x值 orderInfo.setStatus(OrderStatus.CREATE); 的時(shí)候用 CREATE(0, "創(chuàng)建") 中的 0 而不是 CREATE 呢。

    首先,我們先看看 MyBatis 是否能夠滿足我們的需求。MyBatis 內(nèi)置了兩個(gè)枚舉轉(zhuǎn)換器分別是org.apache.ibatis.type.EnumTypeHandler 和 org.apache.ibatis.type.EnumOrdinalTypeHandler。

    3.3.1 內(nèi)置枚舉轉(zhuǎn)換器

    3.3.1.1 EnumTypeHandler

    這是默認(rèn)的枚舉轉(zhuǎn)換器,轉(zhuǎn)換器將枚舉實(shí)例轉(zhuǎn)換為實(shí)例名稱的字符串,即 name 屬性,也就是將 OrderStatus.CREATE 轉(zhuǎn)換為 CREATE。就是我們?cè)?2.現(xiàn)在我們?cè)趺炊x狀態(tài) 中所使用的方式。

    3.3.1.2 EnumOrdinalTypeHandler

    這個(gè)轉(zhuǎn)換器將枚舉實(shí)例的 ordinal 屬性作為取值,這個(gè)屬性可以通過 orderInfo.getStatus().ordinal() 來獲取。

    public final int ordinal()

    Null

    Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as EnumSet and EnumMap.

    • Returns:

      the ordinal of this enumeration constant

    通過官方文檔并且通過自己的實(shí)驗(yàn)來看,這個(gè) ordinal 屬性其實(shí)是一個(gè)序號(hào),這個(gè)序號(hào)從 0 開始,只跟定義枚舉類時(shí)的順序有關(guān)。

    當(dāng)我們按照下述方式定義枚舉時(shí):

    public enum OrderStatus {CREATE("創(chuàng)建"),PAYING("支付中"),IN_PROGRESS("支付成功"),FAILED("支付失敗"),REVERSED("取消訂單");//省略部分代碼... }

    Java

    其 ordinal 屬性就是跟這個(gè)先后順序有關(guān),OrderStatus.CREATE.ordinal()==0 OrderStatus.PAYING.ordinal()==1 剛好跟我們后來自定義的 value 屬性同步了。

    但是我們不能相信這個(gè)屬性,所以 MyBatis 提供的兩種枚舉轉(zhuǎn)換器均不適用,我們也就只好繼續(xù)自定義了。

    3.3.2 自定義枚舉轉(zhuǎn)換器

    MyBatis 提供了 org.apache.ibatis.type.BaseTypeHandler 類用于我們自己擴(kuò)展類型轉(zhuǎn)換器,上面的 EnumTypeHandler 和 EnumOrdinalTypeHandler 也都實(shí)現(xiàn)了這個(gè)接口。

    public class EnumOrderStatusHandler extends BaseTypeHandler<OrderStatus> {/*** 設(shè)置配置文件設(shè)置的轉(zhuǎn)換類以及枚舉類內(nèi)容,供其他方法更便捷高效的實(shí)現(xiàn)** @param type 配置文件中設(shè)置的轉(zhuǎn)換類*/public EnumOrderStatusHandler(Class<OrderStatus> type) {if (type == null)throw new IllegalArgumentException("Type argument cannot be null");this.type = type;this.enums = type.getEnumConstants();if (this.enums == null)throw new IllegalArgumentException(type.getSimpleName()+ " does not represent an enum type.");}//用于定義設(shè)置參數(shù)時(shí),該如何把Java類型的參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)庫類型@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, OrderStatus parameter, JdbcType jdbcType) throws SQLException {// 根據(jù)數(shù)據(jù)庫存儲(chǔ)類型決定獲取類型,本例子中數(shù)據(jù)庫中存放int類型// ps.setStringps.setInt(i, parameter.getValue());}//用于定義通過字段名稱獲取字段數(shù)據(jù)時(shí),如何把數(shù)據(jù)庫類型轉(zhuǎn)換為對(duì)應(yīng)的Java類型@Overridepublic OrderStatus getNullableResult(ResultSet rs, String columnName) throws SQLException {// 根據(jù)數(shù)據(jù)庫存儲(chǔ)類型決定獲取類型,本例子中數(shù)據(jù)庫中存放int類型// String i = rs.getString(columnName);int i = rs.getInt(columnName);if (rs.wasNull()) {return null;} else {// 根據(jù)數(shù)據(jù)庫中的值,定位Enum子類return locateEnum(i);}}//用于定義通過字段索引獲取字段數(shù)據(jù)時(shí),如何把數(shù)據(jù)庫類型轉(zhuǎn)換為對(duì)應(yīng)的Java類型@Overridepublic OrderStatus getNullableResult(ResultSet rs, int columnIndex) throws SQLException {// 根據(jù)數(shù)據(jù)庫存儲(chǔ)類型決定獲取類型,本例子中數(shù)據(jù)庫中存放int類型// String i = rs.getString(columnIndex);int i = rs.getInt(columnIndex);if (rs.wasNull()) {return null;} else {// 根據(jù)數(shù)據(jù)庫中的值,定位Enum子類return locateEnum(i);}}//用定義調(diào)用存儲(chǔ)過程后,如何把數(shù)據(jù)庫類型轉(zhuǎn)換為對(duì)應(yīng)的Java類型@Overridepublic OrderStatus getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {// 根據(jù)數(shù)據(jù)庫存儲(chǔ)類型決定獲取類型,本例子中數(shù)據(jù)庫中存放int類型// String i = cs.getString(columnIndex);int i = cs.getInt(columnIndex);if (cs.wasNull()) {return null;} else {// 根據(jù)數(shù)據(jù)庫中的值,定位Enum子類return locateEnum(i);}}/*** 枚舉類型轉(zhuǎn)換** @param value 數(shù)據(jù)庫中存儲(chǔ)的自定義屬性* @return value對(duì)應(yīng)的枚舉類*/private OrderStatus locateEnum(int value) {for (OrderStatus status : OrderStatus.values()) {if (status.getValue() == value) {return status;}}throw new IllegalArgumentException("未知的枚舉類型:" + value);} }

    Java

    類轉(zhuǎn)換器就這樣編寫,注意的是,各個(gè)重寫方法中,數(shù)據(jù)類型,用對(duì)應(yīng)數(shù)據(jù)庫數(shù)據(jù)的枚舉屬性的數(shù)據(jù)類型,本次就是 value 屬性對(duì)應(yīng)數(shù)據(jù)庫中的內(nèi)容,所以是 int 類型,再有就是在最后的方法中,給出枚舉匹配的方法。

    3.3.3 在 Mapper.xml 中配置自定義的枚舉轉(zhuǎn)換器

    方法1:修改指定xml文件,指定的Mapper生效

    我們只需要在 insert update select 等語句中配置 typeHandler , 而 Java 文件無需改動(dòng)。

    <insert id="addOrder" parameterType="com.yulaiz.model.order.entity.OrderInfo">INSERT INTO order_test ( status) VALUES (#{item.status, typeHandler=com.yulaiz.model.order.entity.enums.mybatis.EnumOrderStatusHandler}) </insert> <resultMap id="get" type="com.yulaiz.model.order.entity.OrderInfo"><result column="status" property="status"typeHandler="com.yulaiz.model.order.entity.enums.mybatis.EnumOrderStatusHandler"/> </resultMap> <select id="getOrderById" id="getOrderById" resultMap="get">SELECT id, statusFROM order_testWHERE id = #{id} </select>

    XML

    方法2:全局指定枚舉轉(zhuǎn)換器,無需單獨(dú)修改Mapper.xml

    直接在 Mybatis 的配置文件中配置自定義的類型轉(zhuǎn)換,這里我使用的 Spring-Boot,直接在 application.yml 文件中配置:

    mybatis:type-handlers-package: com.yulaiz.model.order.entity.enums.mybatis

    Yml

    方法3:不使用枚舉轉(zhuǎn)換器

    對(duì)于 insert 和 update 語句,還有一個(gè)簡(jiǎn)單的方法:

    <insert id="addOrder" parameterType="com.yulaiz.model.order.entity.OrderInfo">INSERT INTO order_test ( status) VALUES (#{item.status.value}) </insert>

    XML

    對(duì)于 Java Bean 來說,也可以手動(dòng)設(shè)置 get set 方法

    public class OrderInfo {private int id;private OrderStatus status;public int getStatus() {return status.getValue();}public void setStatus(int value) {for (OrderStatus status : OrderStatus.values()) {if (status.getValue() == value) {this.status = status;break;}}} }

    Java

    4. 枚舉到底好不好用

    枚舉這樣直觀方便,在大數(shù)據(jù)量的情況下到底好不好用呢,下面我們就這么一個(gè)問題進(jìn)行分析。

    4.1 Java 枚舉的實(shí)現(xiàn)

    4.1.1 基礎(chǔ)聲明、屬性、構(gòu)造函數(shù)

    java 的枚舉類 以關(guān)鍵字 enum 聲明,該關(guān)鍵字隱含著該類為 java.lang.Enum 的子類,Java編譯器在編譯枚舉類時(shí),會(huì)生成一個(gè)相關(guān)的類,這個(gè)類就是實(shí)際的枚舉類,繼承自 java.lang.Enum 。

    public enum OrderStatus {CREATE("創(chuàng)建"), PAYING("支付中"), IN_PROGRESS("支付成功"), FAILED("支付失敗"), REVERSED("取消訂單"); }

    Java

    該類有兩個(gè)屬性,分別是 name 和 ordinal ,在自定義的枚舉類中,我們聲明 CREATE("創(chuàng)建"), PAYING("支付中"), IN_PROGRESS("支付成功"), FAILED("支付失敗"), REVERSED("取消訂單") 的時(shí)候,前面括號(hào)外部分就是 name 屬性,比如:CREATE ,而 ordinal 屬性則是我們聲明中寫的順序,從 0 開始。這兩個(gè)屬性在父類的構(gòu)造函數(shù)中進(jìn)行賦值,我們自定義的枚舉類中不用去費(fèi)心這兩個(gè)屬性的賦值。子類中如果需要,只需要在構(gòu)造方法中定義其他自定義屬性的賦值即可。

    protected Enum(String name, int ordinal) {this.name = name;this.ordinal = ordinal; }

    Java

    而 CREATE("創(chuàng)建") 中括號(hào)內(nèi)就是我們自定義的屬性,也就是我們聲明的 value 屬性。

    4.1.2 常用方法

    4.1.2.1 name() 方法

    返回 Enum 對(duì)象的 name 屬性。

    4.1.2.2 ordinal() 方法。

    返回 Enum 對(duì)象的 ordinal 屬性。

    4.1.2.3 toString() 方法

    返回 Enum 對(duì)象的名稱,也就是 name 屬性。

    4.1.2.4 equals(Object other) 方法

    比較兩個(gè)對(duì)象是否相等。詳細(xì)用法在下方 4.1.3 比較兩個(gè)枚舉值是否一致

    4.1.2.5 compareTo(E o) 方法

    比較兩個(gè)枚舉對(duì)象的順序,在該對(duì)象小于、等于或大于指定對(duì)象時(shí),分別返回負(fù)整數(shù)、零或正整數(shù)。詳細(xì)用法在下方 4.1.3 比較兩個(gè)枚舉值是否一致

    4.1.2.6 values() 方法

    這個(gè)方法我們查看JDK中源碼沒有看到,并且在API文檔中也沒有找到。但確實(shí)是有這么一個(gè)方法。

    在 Oracle的文檔 中可以找到這么一段話

    The compiler automatically adds some special methods when it creates an enum. For example, they have a static values method that returns an array containing all of the values of the enum in the order they are declared. This method is commonly used in combination with the for-each construct to iterate over the values of an enum type.

    大致意思就是,Java 編譯器在編譯枚舉類的時(shí)候會(huì)自動(dòng)為該類加入一些靜態(tài)方法,比如說 values() ,這個(gè)方法返回一個(gè)包含這個(gè)枚舉類所有枚舉項(xiàng)的數(shù)組,這個(gè)數(shù)組是按照聲明的順序來排列(意味著 ordinal 屬性可以當(dāng)成這個(gè)數(shù)組的下標(biāo)),這個(gè)方法通常與 for-each 語句配合在遍歷枚舉值時(shí)使用。

    注意,這是一個(gè) static 靜態(tài)方法,意味著使用的時(shí)候直接通過枚舉類來調(diào)用,比如 OrderStatus.values() 。

    4.1.2.7 valueOf(String name) 方法

    根據(jù)傳入的 name 名稱,找到相對(duì)應(yīng) name 屬性的枚舉值。

    這個(gè)方法實(shí)際上也是 Java 編譯器在編譯的時(shí)候加入的方法,在父類 java.lang.Enum 中,同樣存在 valueOf 方法,不過父類的方法是有兩個(gè)參數(shù),而這個(gè)第一個(gè)參數(shù)就是用來指定是哪一個(gè)枚舉類,那我們?cè)谧宇惖臅r(shí)候使用這個(gè)方法就很明確是這個(gè)類本身,所以編譯器直接在編譯的時(shí)候加入了一個(gè)方法,只需要傳入 name 參數(shù)即可。

    注意,這是一個(gè) static 靜態(tài)方法,意味著使用的時(shí)候直接通過枚舉類來調(diào)用,比如: OrderStatus.valueOf("CREATE") 。

    4.1.3 比較兩個(gè)枚舉值是否一致

    我們?cè)趯?shí)際代碼中經(jīng)常根據(jù)狀態(tài)來進(jìn)行流程向?qū)?#xff0c;而枚舉類大部分時(shí)間就是用來表示狀態(tài),那么我們就需要對(duì)比枚舉類是否為某個(gè)值來進(jìn)行判斷:

    • 通過 switch 語句

      通過 switch 語句來判斷,簡(jiǎn)單方便,好看:

      OrderStatus status = OrderStatus.CREATE; switch (status) {case CREATE:System.out.println("CREATE");break;case PAYING:System.out.println("PAYING");break;default:System.out.println("default"); }

      Java

    • 通過 equals() 方法

      用 String 的時(shí)候經(jīng)常使用的方法:

      OrderStatus status = OrderStatus.CREATE; boolean result = status.equals(OrderStatus.CREATE);

      Java

    • 通過 == 運(yùn)算符

      實(shí)際上效果跟 equals() 方法是一樣的,我們可以點(diǎn)進(jìn) equals() 方法的源碼查看,實(shí)際上就是使用 == 運(yùn)算符來實(shí)現(xiàn)的:

      /*** Returns true if the specified object is equal to this* enum constant.** @param other the object to be compared for equality with this object.* @return true if the specified object is equal to this* enum constant.*/public final boolean equals(Object other) {return this==other;}

      Java

      實(shí)際使用上就更簡(jiǎn)單了:

      OrderStatus status = OrderStatus.CREATE; if (status == OrderStatus.CREATE) {System.out.println("=="); }

      Java

    • 通過compareTo(E o) 方法

      稍微麻煩一點(diǎn):

      OrderStatus status = OrderStatus.CREATE; if (status.compareTo(OrderStatus.CREATE) == 0) {System.out.println("=="); }

      Java

      ?

    4.2 MySql 中的枚舉

    首先,我們要知道對(duì)于 select 語句,枚舉對(duì)于其展示出來的數(shù)據(jù)是非常友好的,可以直觀的看到具體的含義。而枚舉的優(yōu)點(diǎn)就是固定的有限的枚舉項(xiàng),那么就需要我們?cè)诙x數(shù)據(jù)庫的時(shí)候就定義好這個(gè)枚舉可能用到的所有值,相比int類型,我們來看看對(duì)于枚舉類型 enum 的枚舉項(xiàng)的刪除和修改操作的效率如何。

    我在數(shù)據(jù)庫中分別創(chuàng)建了兩張表:order_test 、order_test_enum 。

    CREATE TABLE `order_test` (`id` int(20) NOT NULL AUTO_INCREMENT,`status` int(1) NOT NULL COMMENT '0-創(chuàng)建,1-支付中,2-支付成功,3-支付失敗,4-取消訂單',PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;CREATE TABLE `order_test_enum` (`id` int(20) NOT NULL AUTO_INCREMENT,`status` enum('CREATE','PAYING','IN_PROGRESS','FAILED','REVERSED') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'CREATE' COMMENT 'CREATE-創(chuàng)建,PAYING-支付中,IN_PROGRESS-支付成功,FAILED-支付失敗,REVERSED-取消訂單',PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

    SQL

    在兩張表中分別插入了 1000W 條數(shù)據(jù),其數(shù)據(jù)格式就是每個(gè)枚舉項(xiàng)都依次循環(huán)插入,保證每個(gè)枚舉項(xiàng)的數(shù)量盡可能平均的分布。

    4.2.1 DDL 操作效率

    對(duì)于狀態(tài)的修改,我們一般會(huì)有幾種操作:

    • 新增一個(gè)狀態(tài)。
    • 修改一個(gè)狀態(tài)。
    • 刪除一個(gè)狀態(tài)。

    4.2.1.1 新增一個(gè)枚舉狀態(tài)

    對(duì)于 int 類型來說,這個(gè)直接無需操作了,要什么新狀態(tài),直接 insert 的時(shí)候直接插入就行了。

    對(duì)于 enum 類型來說,這個(gè)就需要進(jìn)行 DDL 操作:

    ALTER TABLE `test`.`order_test_enum` MODIFY COLUMN `status` enum('CREATE','PAYING','IN_PROGRESS','FAILED','REVERSED','TEST') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'CREATE' COMMENT 'CREATE-創(chuàng)建,PAYING-支付中,IN_PROGRESS-支付成功,FAILED-支付失敗,REVERSED-取消訂單,TEST-新增測(cè)試';

    SQL

    執(zhí)行時(shí)間:0.008s 還不錯(cuò)的速度。

    4.2.1.2 修改一個(gè)枚舉狀態(tài)

    比方說我們定義的狀態(tài),寫錯(cuò)值了,又不想將錯(cuò)就錯(cuò),int 類型應(yīng)該不會(huì)出現(xiàn)這個(gè)問題吧,奈何英文水平實(shí)在太差,拼錯(cuò)了單詞,或者單詞用的不合理,我們這里假設(shè)將 PAYING 換成 PAYING1 :

    ALTER TABLE `test`.`order_test_enum` MODIFY COLUMN `status` enum('CREATE','PAYING1','IN_PROGRESS','FAILED','REVERSED','TEST') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'CREATE' COMMENT 'CREATE-創(chuàng)建,PAYING1-支付中,IN_PROGRESS-支付成功,FAILED-支付失敗,REVERSED-取消訂單,TEST-新增測(cè)試';

    SQL

    1265 - Data truncated for column 'status' at row 2 修改失敗,Mysql 不允許修改已經(jīng)使用的枚舉項(xiàng)。

    那么我們想到達(dá)換枚舉值的情況就只能曲折一點(diǎn),先新增一個(gè),再 update 原有的值到新值,剛剛已經(jīng)建好的TEST 值,那么我們現(xiàn)在就把 PAYING 修改成 TEST :

    UPDATE order_test_enum SET `status` = 'TEST' WHERE`status` = 'PAYING';

    SQL

    執(zhí)行時(shí)間: 12.456s 這樣的一個(gè)時(shí)間說得過去,因?yàn)槲覄倓傄苍?order_test 表中做了一個(gè)差不多的操作執(zhí)行時(shí)間是 10.459s 。

    UPDATE order_test SET `status` = 5 WHERE`status` = 1;

    SQL

    4.2.1.3 刪除一個(gè)枚舉狀態(tài)

    同樣 int 類型無需修改,修改 enum 類型進(jìn)行 DDL 操作,假設(shè)我們刪除 IN_PROGRESS 這項(xiàng):

    ALTER TABLE `test`.`order_test_enum` MODIFY COLUMN `status` enum('CREATE','PAYING','FAILED','REVERSED','TEST') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'CREATE' COMMENT 'CREATE-創(chuàng)建,PAYING-支付中,FAILED-支付失敗,REVERSED-取消訂單,TEST-新增測(cè)試';

    SQL

    1265 - Data truncated for column 'status' at row 2 刪除失敗,這是由于MySql不允許刪除已經(jīng)被使用的枚舉項(xiàng)。那我們刪除剛剛已經(jīng)把數(shù)據(jù)改為 TEST 的 PAYING 試試:

    ALTER TABLE `test`.`order_test_enum` MODIFY COLUMN `status` enum('CREATE','IN_PROGRESS','FAILED','REVERSED','TEST') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'CREATE' COMMENT 'CREATE-創(chuàng)建,IN_PROGRESS-支付成功,FAILED-支付失敗,REVERSED-取消訂單,TEST-新增測(cè)試';

    SQL

    執(zhí)行時(shí)間: 34.971s 這個(gè)時(shí)間是真的不快。

    4.2.2 查詢效率

    可能有些人會(huì)說枚舉對(duì)于大數(shù)據(jù)查詢是非常不友好的,畢竟是字符型。

    而實(shí)際上 Mysql 中的 enum 類型,還恰恰不是字符型,而是整型存儲(chǔ)。

    實(shí)際上在建立 enum 字段的時(shí)候,MySql 會(huì)根據(jù)設(shè)定的幾個(gè)字段的順序來編號(hào),而這個(gè)編號(hào)實(shí)際上才是 MySql 真正存儲(chǔ)的內(nèi)容,這個(gè)編號(hào)在某些文章里也會(huì)稱呼為索引值。

    在上面的例子中,建立的枚舉值分別為 'CREATE','PAYING','IN_PROGRESS','FAILED','REVERSED' ,那么他們的索引值就分別為:

    值索引值
    NULLNULL
    0
    ‘CREATE’1
    ‘PAYING’2
    ‘IN_PROGRESS’3
    ‘FAILED’4
    ‘REVERSED’5

    所以在搜索的時(shí)候 WHERE 條件中的 status = 'CREATE' 和 status = 1 是等效的,這里也要注意就是 enum 字段同樣有 NULL 值 和 ” 的情況,需要我們?cè)诙x數(shù)據(jù)類型的時(shí)候就需要注意。

    SELECTid,`status` FROMorder_test_enum WHEREid = 1 AND `status` = 1;

    SQL

    SELECTid,`status` FROMorder_test_enum WHEREid = 1 AND `status` = 'CREATE';

    SQL

    上面兩個(gè)sql查詢到的內(nèi)容就是一樣的,那么同是整型,在查詢上的差距,咱就可以忽略不計(jì)了吧。

    5. 枚舉使用總結(jié)

    雖然 Java 中的枚舉比 C 或 C++ 中的 enum 更成熟,但它仍然是一個(gè)“小”功能,Java 沒有它也已經(jīng)(雖然有點(diǎn)笨拙)存在很多年了。而本章正好說明了一個(gè)“小”功能所能帶來的價(jià)值。有時(shí)恰恰因?yàn)樗?#xff0c;你才能夠優(yōu)雅而干凈地解決問題。正如我在本書中一再強(qiáng)調(diào)的那樣,優(yōu)雅與清晰很重要,正是它們區(qū)別了成功的解決方案與失敗的解決方案。而失敗的解決方案就是因?yàn)槠渌藷o法理解它。

    直接引用了《Thinking in Java》這么一段話(《Thinking in Java》第四版 19章12節(jié)),很明顯,很清楚,至少在 Java 中使用枚舉是值得的。

    而對(duì)于數(shù)據(jù)庫來說,根據(jù)實(shí)際情況來構(gòu)建,至少枚舉時(shí)一個(gè)特別方便的結(jié)構(gòu),如果有舊表的狀態(tài)描述字段沒有使用枚舉,請(qǐng)慎重是否進(jìn)行改進(jìn),需要考慮存量數(shù)據(jù)的改造,以及對(duì)接代碼的改造。

    即便 MySql 中依舊使用數(shù)字來表達(dá)狀態(tài),依然不妨礙在 Java 中改造成枚舉,具體改造的范圍需要自行斟酌,防止接口對(duì)上下游系統(tǒng)的不友好。

    枚舉是非常適合用來描述狀態(tài)的結(jié)構(gòu),并且不推薦使用數(shù)字來定義,請(qǐng)使用字符串來表達(dá)各個(gè)狀態(tài),否則在查看代碼,查看數(shù)據(jù)庫數(shù)據(jù)的時(shí)候,還是一個(gè)數(shù)字,那我們使用枚舉的意義何在。

    總的來說,請(qǐng)盡量合理的使用枚舉,功能雖小,但咱們很優(yōu)雅。

    6. 參考鏈接

    mysql enum類型存在大量數(shù)據(jù)的時(shí)候方便修改數(shù)據(jù)項(xiàng)么

    mysql 數(shù)據(jù)庫枚舉類型enum,方便添加新的枚舉項(xiàng)嗎?

    MySQL中的enum類型有什么優(yōu)點(diǎn)?

    深入理解Java枚舉類型(enum)

    重新認(rèn)識(shí)java(十) —- Enum(枚舉類)

    java enum(枚舉)使用詳解 + 總結(jié)

    如何在MyBatis中優(yōu)雅的使用枚舉

    MYSQL中 ENUM 類型

    java枚舉enum類中的values()

    MyBatis對(duì)于Java對(duì)象里的枚舉類型處理

    MyBatis對(duì)于Java對(duì)象里的枚舉類型處理

    總結(jié)

    以上是生活随笔為你收集整理的Java、Mysql、MyBatis 中枚举 enum 的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产999精品久久久久久麻豆 | 精品在线观看国产 | 亚洲一区二区观看 | 麻豆va一区二区三区久久浪 | 亚洲国产精彩中文乱码av | 国产精品久免费的黄网站 | 久操97 | 国产午夜三级一区二区三桃花影视 | 丁香午夜婷婷 | 蜜臀久久99精品久久久酒店新书 | 91av官网| 日日操日日插 | 狠狠色综合网站久久久久久久 | 欧美韩国在线 | 在线91网| 丁香影院在线 | 日本在线观看中文字幕无线观看 | 亚洲一级黄色 | 9i看片成人免费看片 | 国产高清日韩欧美 | 91香蕉视频720p| 亚洲精区二区三区四区麻豆 | 久久天天躁狠狠躁亚洲综合公司 | 黄色精品一区二区 | 国产日韩精品一区二区在线观看播放 | 波多野结衣小视频 | 婷婷丁香自拍 | 国产精品久久在线 | 国内精品久久久久影院优 | 91视频在线免费看 | 亚洲精品在线视频 | 久久另类小说 | 亚洲欧美日韩在线一区二区 | 久久国产精品影片 | 极品国产91在线网站 | 国产精品婷婷 | 国产成人精品999在线观看 | 国产玖玖视频 | 日日射av | 成年人在线看视频 | 中文字幕在线看视频 | 热99久久精品 | 天天色视频| 精品无人国产偷自产在线 | 免费黄色av. | 91九色在线视频 | 国产精品99久久久久久大便 | 婷婷五天天在线视频 | 天天插综合网 | 亚洲干视频在线观看 | 亚洲精品国产精品国自 | 亚州视频在线 | 亚洲精品黄色在线观看 | 在线精品视频在线观看高清 | 久久久久色 | 啪啪av在线 | 九九九在线 | 天天操一操 | 黄色软件在线观看免费 | 最新真实国产在线视频 | 制服丝袜天堂 | 国产一区二区三区久久久 | 久久久91精品国产一区二区三区 | 国产精品第二十页 | 亚洲精品五月 | 日精品| 日本黄色免费播放 | 欧美日韩国产一区 | 天天射日| 天天天天天天操 | 91视频专区| www夜夜 | 国产精品综合久久久久 | 久久精品99国产精品酒店日本 | 日韩欧美一区二区在线观看 | 黄色软件在线观看免费 | 亚洲成人午夜在线 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 福利视频午夜 | 免费观看av网站 | 欧美一区二区三区四区夜夜大片 | 日韩精品五月天 | 97免费中文视频在线观看 | 视频一区二区视频 | 亚洲电影久久久 | 激情 一区二区 | 国产又粗又猛又黄又爽 | 狠狠狠狠狠操 | 日本女人逼 | 日韩av成人| 亚洲精品国偷自产在线91正片 | 人人狠狠综合久久亚洲 | 亚洲一二区视频 | 日韩在线视频不卡 | 亚洲黑丝少妇 | 最新av观看 | 免费观看全黄做爰大片国产 | 二区三区中文字幕 | 国产精品免费久久久久影院仙踪林 | 亚洲黄色一级大片 | 99精品国产一区二区三区麻豆 | 永久av免费在线观看 | 中文在线免费视频 | 夜夜躁狠狠躁日日躁 | 成人三级视频 | 亚洲精品国产精品国自产观看浪潮 | 婷婷五月色综合 | 婷婷国产一区二区三区 | 国产xvideos免费视频播放 | a在线v| 狠狠色伊人亚洲综合成人 | 国产一区二区视频在线 | 懂色av一区二区三区蜜臀 | 国产精品999久久久 久产久精国产品 | 91黄色在线视频 | 欧美日韩一区二区久久 | 免费大片av | 四虎成人精品在永久免费 | 国产高清在线a视频大全 | 国产精品一区二区中文字幕 | 日韩视频在线观看免费 | 91在线中文字幕 | 丁香婷婷色月天 | 91精品啪啪 | 97香蕉超级碰碰久久免费软件 | 尤物一区二区三区 | 欧美久久影院 | 久久久久久久久久久久国产精品 | 欧美精品中文在线免费观看 | 91视频链接 | 九九国产视频 | 视频在线观看亚洲 | 午夜在线免费观看视频 | 婷婷久草 | 国产精品不卡一区 | 日韩精品一区二区三区免费视频观看 | 爱爱av在线 | 久久亚洲欧美日韩精品专区 | 亚洲视频在线免费看 | 日本免费一二三区 | 久久久精品亚洲 | 国产剧情一区二区 | 日韩高清一二区 | 久久天| 三级av免费观看 | 在线激情影院一区 | 国产一区欧美二区 | 国产免费久久久久 | 99爱国产精品 | 高清av免费看 | 性色视频在线 | 亚洲jizzjizz日本少妇 | 99视频在线免费观看 | 日本黄色免费在线 | 超碰在线观看av.com | 国产精品午夜久久久久久99热 | 久草免费在线观看 | 亚洲午夜精品一区二区三区电影院 | 超碰公开在线 | 91污视频在线 | 亚洲精品国久久99热 | 亚洲乱码中文字幕综合 | 国产日产精品一区二区三区四区的观看方式 | 日韩一区二区免费视频 | 麻豆影视在线免费观看 | 亚洲网久久 | 亚洲精品美女久久久久 | 国产精品理论片在线观看 | 中文字幕一区二区在线播放 | 久久综合狠狠综合久久狠狠色综合 | 色婷婷狠狠五月综合天色拍 | 国产第一页在线观看 | 国产黄色免费电影 | 久久久久久久国产精品 | 亚洲国产精品推荐 | 成人久久视频 | 国产成人精品久久久久蜜臀 | 精品一区电影国产 | 久久久久亚洲a | 国产麻豆精品在线观看 | 国产99久久久精品 | 成人亚洲精品国产www | 激情文学综合丁香 | 欧美日韩二区三区 | 久久久电影网站 | 国产精品女人久久久 | 色搞搞| 国产精品久久久久久久久蜜臀 | 日本最新中文字幕 | 在线看av网址 | 6699私人影院 | 成人三级网站在线观看 | 99精品视频在线看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 在线看黄色的网站 | 亚洲国产精品久久久久 | 欧美国产日韩一区二区 | 国产在线一区观看 | 久久超碰网 | 人人草天天草 | 久久你懂得 | 国产午夜剧场 | 97av色| 久久五月婷婷丁香社区 | 天天天天天天天操 | 久久久久久久久艹 | 精品视频123区在线观看 | 91视频麻豆视频 | 在线观看视频国产 | 精品日本视频 | 亚洲日本一区二区在线 | 五月天婷亚洲天综合网鲁鲁鲁 | 国产精品9区| 中文字幕一区二区三 | 国产午夜麻豆影院在线观看 | 日韩av影片在线观看 | 亚洲欧洲精品一区二区精品久久久 | 国产原厂视频在线观看 | 天天做天天爱天天综合网 | 久久草在线精品 | 五月黄色 | 国产精品国内免费一区二区三区 | 日日射av | 成人一区二区在线 | 久久1电影院 | 日韩高清精品一区二区 | 国产黄在线观看 | 国产手机在线视频 | 91麻豆精品91久久久久同性 | 色诱亚洲精品久久久久久 | 国产一区二区精品久久91 | 三三级黄色片之日韩 | 一区免费视频 | 亚洲va欧美va人人爽春色影视 | 91最新在线观看 | 最近中文字幕久久 | 国产精品亚州 | 精品成人免费 | 国产精品久久久久久久久久久久午夜 | 偷拍视频一区 | 久久人91精品久久久久久不卡 | 91丨九色丨国产在线 | 久久草草影视免费网 | 麻豆视频大全 | 亚洲国产精品久久 | 91av成人 | 中日韩在线视频 | 日韩精品一区二区不卡 | 免费福利在线观看 | 97热久久免费频精品99 | 99精品久久久久久久久久综合 | 91激情视频在线 | 日韩电影在线观看中文字幕 | 亚洲涩涩一区 | 欧美日韩网址 | 亚洲精品国产精品国产 | 一区二区三区在线观看 | 国产一区二区免费 | 成人av在线看 | 久草视频在线新免费 | 国产不卡在线播放 | 亚洲国产日韩精品 | 免费在线一区二区 | 久久97精品 | 最新国产视频 | 久久亚洲综合国产精品99麻豆的功能介绍 | 91成人在线视频 | 日韩在线观看av | 996久久国产精品线观看 | 欧美激情综合五月 | 在线成人免费av | 色婷婷久久久综合中文字幕 | 日韩三级视频 | 黄色在线观看免费 | 美女久久| 国产成人av在线 | 亚洲精品小区久久久久久 | 中文字幕丝袜美腿 | 久久99精品久久久久婷婷 | 91精品国产99久久久久久红楼 | 欧美性护士 | 91久久精品日日躁夜夜躁国产 | 国产69精品久久app免费版 | 国产一级二级在线 | 少妇激情久久 | 免费成人av网站 | 国产不卡在线看 | www.在线看片.com | 天天躁天天躁天天躁婷 | 日韩网站在线免费观看 | 麻豆国产视频下载 | 国产精品免费视频久久久 | 五月天视频网站 | 亚洲欧美日韩国产一区二区 | 亚洲成人av电影 | 免费观看高清 | 蜜臀久久99精品久久久久久网站 | 免费高清看电视网站 | 一区二区视频在线看 | 中文字幕精品一区二区三区电影 | 成人在线你懂得 | 天天爱天天舔 | 九九久久精品 | 91精品国产乱码在线观看 | 成人av电影免费在线播放 | 狠狠操狠狠插 | 激情喷水 | 欧美一区在线观看视频 | 欧美性生活久久 | 精品欧美乱码久久久久久 | 久久久国产日韩 | 天天爱av导航 | 国产亚洲综合精品 | 精品人人人人 | 欧美日韩在线免费视频 | 成人黄色电影在线观看 | 亚洲天堂免费视频 | 噜噜色官网 | 亚洲视频999 | av中文在线影视 | 久久综合五月天婷婷伊人 | 日韩精品电影在线播放 | 91激情视频在线播放 | 麻豆精品在线视频 | 在线观看亚洲电影 | 97超视频免费观看 | 97国产精品亚洲精品 | 亚洲一级电影在线观看 | 337p西西人体大胆瓣开下部 | 91视频在线 | 久久永久免费视频 | 成+人+色综合 | 久久综合久久久 | 色婷婷97| 国产成人精品亚洲 | 青青久视频 | 亚洲精品高清在线观看 | 丁香在线视频 | 91视频免费播放 | 久久国产精品久久精品国产演员表 | 色资源在线 | 国产黄色特级片 | 九九精品视频在线观看 | 久久久久激情 | 国产精品免费久久久久久 | 黄色免费看片网站 | 黄色影院在线观看 | 免费看成人a | av日韩精品 | 日日干,天天干 | 国产女v资源在线观看 | 欧美日韩精品电影 | 在线观看视频在线 | 色综合天天综合 | 91视频亚洲| 日韩免费看 | 黄色的视频 | 91视频电影 | 人人爽久久久噜噜噜电影 | 大胆欧美gogo免费视频一二区 | 欧美大片aaa| 97超碰国产精品女人人人爽 | 一二三区av| 亚洲另类xxxx | 成人a级大片| 狠狠躁夜夜躁人人爽超碰91 | 免费成人短视频 | 中文字幕精品一区二区三区电影 | av中文字幕亚洲 | 免费观看性生活大片3 | 久久婷婷精品视频 | 欧美一级高清片 | 极品国产91在线网站 | 超碰国产在线播放 | 粉嫩av一区二区三区四区 | 欧美少妇xx | 91精品国产自产在线观看永久 | 国产成a人亚洲精v品在线观看 | 亚洲国产综合在线 | 人人爽人人做 | 9999在线视频 | 日韩三区在线 | 99 色 | 在线观看国产中文字幕 | 亚洲精品视频在线播放 | 综合色在线 | 香蕉视频网站在线观看 | 国产精品成人国产乱 | 免费日韩一区二区 | 欧美色精品天天在线观看视频 | 国产99视频在线观看 | 午夜成人免费影院 | 99久久精品免费看国产一区二区三区 | 亚洲精品五月 | av免费观看网址 | 成片免费观看视频大全 | 日韩欧美视频在线免费观看 | 99免费在线观看 | 久久久久影视 | 亚洲精品中文在线观看 | 黄色一级在线视频 | 91九色精品 | 国产 日韩 在线 亚洲 字幕 中文 | 亚洲免费精品一区二区 | 国产涩图 | 精品免费一区 | 99久久这里有精品 | 久久精品久久久久电影 | 久久99中文字幕 | 免费网站污 | 久草在线手机视频 | 狠狠色伊人亚洲综合网站色 | 少妇bbw揉bbb欧美 | 日韩在线首页 | 免费在线激情电影 | 很黄很污的视频网站 | 久久精品综合视频 | 午夜神马福利 | 九九免费视频 | 国产麻豆精品传媒av国产下载 | 美女久久久久久久久久久 | 激情综合国产 | 五月香视频在线观看 | 久99久中文字幕在线 | 偷拍精偷拍精品欧洲亚洲网站 | 国产精品美女久久久久久久网站 | 久久精品牌麻豆国产大山 | 国产高清视频免费最新在线 | 日韩电影一区二区在线观看 | 日本精品视频在线观看 | 最新av免费| 欧洲av在线 | 亚洲一区二区天堂 | 天天射天天干天天操 | 日韩精品一区二区在线观看 | 免费看片网址 | 九九热国产视频 | 久久不射电影院 | 超碰97中文| 亚洲永久精品国产 | 91毛片在线观看 | 日韩av一区二区三区在线观看 | 日韩亚洲精品电影 | 久久亚洲欧美 | 精品91视频 | 一区在线电影 | 日韩免费电影在线观看 | 日韩精品中文字幕在线不卡尤物 | 最新成人在线 | 欧美另类一二三四区 | 精品国产_亚洲人成在线 | 91豆花在线观看 | 国产 欧美 日产久久 | 四虎小视频 | 久久国产精品色av免费看 | 一级欧美黄 | 国产在线欧美 | 日韩欧美在线中文字幕 | 天天干天天拍天天操 | 一区二区视频播放 | 9在线观看免费高清完整版 玖玖爱免费视频 | 中文字幕中文字幕中文字幕 | 久草久草久草久草 | 四虎影视www | 99热只有精品在线观看 | 日韩电影中文字幕在线观看 | 香蕉精品视频在线观看 | 成人黄色电影在线观看 | 天天操天天干天天综合网 | 久久精品第一页 | 中文字幕在线资源 | 91精品国产99久久久久久红楼 | 久久久激情网 | 中文字幕在线看视频国产 | 探花视频在线版播放免费观看 | 国产在线精品福利 | 婷婷视频在线播放 | 天天操天天射天天爽 | 亚洲成人黄色 | 日韩免费播放 | 美女视频黄免费 | 日韩精品播放 | 欧美色图另类 | 亚洲在线网址 | 亚洲色视频 | 国产精品精品国产 | 久久久久国 | 色婷婷激情网 | 免费影视大全推荐 | 欧美成人久久 | 一级一级一片免费 | 国产成人精品a | 成人免费xyz网站 | 国产精品99精品久久免费 | 69人人 | 国产精品中文字幕在线播放 | 久久综合五月 | av黄色一级片 | 中文字幕日韩免费视频 | 操操操人人人 | 亚洲另类视频在线 | 在线一区电影 | 青青河边草观看完整版高清 | 丝袜美腿在线 | 亚洲欧洲精品一区二区 | 国产特级毛片aaaaaa高清 | 91精品国产乱码在线观看 | 成人免费视频免费观看 | 久久久久久久久国产 | 日韩高清在线看 | 91人人揉日日捏人人看 | 欧美性久久久久久 | av天天干 | 国产精品第十页 | 8x8x在线观看视频 | 亚洲国产精品成人综合 | 日本在线成人 | 天天操天天色天天 | 啪啪小视频网站 | 99国产精品久久久久老师 | 免费观看一级特黄欧美大片 | 国产精品美女久久久网av | 国产成人在线播放 | 国产经典 欧美精品 | 久草在线视频中文 | 日日夜操 | 国产a级片免费观看 | 成人99免费视频 | 国产一级不卡毛片 | 日韩一区视频在线 | 久草在线视频在线观看 | 人人插人人看 | 国产在线久久久 | 国产伦精品一区二区三区四区视频 | 欧美一级片免费播放 | 综合亚洲视频 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 日韩av在线看 | 狠狠干夜夜操 | 91在线看免费 | 婷婷五天天在线视频 | 97**国产露脸精品国产 | 精品久久免费 | 国产在线色 | 日韩特级毛片 | 日本三级香港三级人妇99 | 激情视频免费观看 | 在线观看精品一区 | 一区免费观看 | 四虎影视精品永久在线观看 | 亚洲五月综合 | 日韩国产高清在线 | 国产精品久久久久一区二区国产 | 狠狠操在线 | 国产高清永久免费 | av电影在线免费 | 美女久久久久久久 | 十八岁免进欧美 | 久久福利在线 | 亚洲精品国产综合久久 | 成人av电影在线播放 | 欧美日韩久久不卡 | 日韩免费久久 | 成人a v视频 | 久久国产精品免费一区 | 国产久草在线观看 | 国产黄av | 国产精品免费久久久久久 | 五月开心网 | 最近中文字幕国语免费高清6 | 久久艹艹 | 在线观看的a站 | 精品国偷自产国产一区 | 在线观看一区 | 欧美亚洲成人xxx | 高清av在线免费观看 | 四虎小视频 | 激情电影在线观看 | 一区二区欧美激情 | 久久久片 | 国内精品久久久久久久久久 | 99久高清在线观看视频99精品热在线观看视频 | 一区二区伦理 | 亚洲精品免费在线观看 | 91亚洲精品视频 | 国产九九热视频 | 欧洲高潮三级做爰 | 国产精品一区二区久久久 | 中文在线a在线 | 成人动漫一区二区 | 亚洲精品国产区 | 久久人91精品久久久久久不卡 | 欧美日韩久久一区 | 欧美成人h版在线观看 | 国产精品成人免费精品自在线观看 | 91中文字幕在线视频 | 亚洲综合视频在线 | 欧美极品xxx | 免费看片成人 | 91精品一区二区三区蜜臀 | 欧美久久久| 激情视频免费在线 | 欧美色图视频一区 | 在线观看免费黄色 | 天堂久色 | 久久夜靖品 | 欧美 亚洲 另类 激情 另类 | 一区中文字幕在线观看 | 在线免费观看视频一区二区三区 | 欧美国产精品久久久久久免费 | 欧美成年人在线观看 | 天天躁日日躁狠狠躁av中文 | 亚洲视频免费在线看 | 麻豆视频国产精品 | 欧美一级日韩免费不卡 | 视频在线91| 黄色片免费看 | 精品国产伦一区二区三区观看体验 | 精品一区二区三区四区在线 | 日韩专区在线观看 | av一区二区三区在线播放 | 成人免费观看完整版电影 | 国产精品黄色 | 久久久久久久久久免费视频 | 一二区精品 | 久久色在线观看 | 日韩精品一区不卡 | 天天天天综合 | 日韩免费不卡视频 | 在线国产能看的 | 日韩欧美极品 | 日韩电影一区二区在线观看 | 丁香六月婷婷开心 | 操操日| 亚洲 欧美变态 另类 综合 | 国产永久网站 | 国产精品青草综合久久久久99 | av免费看网站 | 日韩欧美在线一区 | 亚洲欧美视频在线 | 久草视频网 | 人人干人人爽 | 中文免费 | 99久热在线精品 | 伊人伊成久久人综合网小说 | 亚洲美女久久 | 国产免费小视频 | 欧美日韩国产一区二区三区在线观看 | 中文字幕视频网站 | 国产成人精品亚洲 | 亚洲欧美日韩精品一区二区 | 久草在线在线 | 亚洲在线网址 | 天天射天天干天天 | 久久久精品久久 | 夜夜爽夜夜操 | 色wwwww| 国产精品色婷婷视频 | 国产精品正在播放 | 国产精品18久久久久久vr | 免费观看视频的网站 | 午夜视频免费播放 | 久久精品最新 | 婷婷色中文字幕 | 九九免费观看视频 | 欧美极度另类性三渗透 | 手机色站 | 天天操综 | 永久免费毛片 | 福利一区二区三区四区 | 成人av在线看 | 精品视频网站 | 最新av在线免费观看 | 97在线观视频免费观看 | 狠狠操91| 国产看片 色| 成人一区不卡 | 视频国产在线观看18 | 国产粉嫩在线观看 | 亚洲午夜久久久久久久久 | 国产一区二区久久久久 | 久久福利综合 | 99精品视频在线观看视频 | 中文字幕免费一区二区 | 国偷自产中文字幕亚洲手机在线 | 亚洲视频2 | 日韩在线观看第一页 | 久久草在线视频国产 | 久久99免费观看 | 亚洲热视频 | 国产精彩视频一区 | 91av电影在线 | 国产一区电影在线观看 | 欧美九九视频 | 日免费视频 | 日韩在线一二三区 | 久久九九久久精品 | 97超碰人人干 | 国产三级香港三韩国三级 | 99久久99久久免费精品蜜臀 | 麻豆视频入口 | 干干干操操操 | 色久综合| 欧美在线观看视频一区二区三区 | 国产91影视 | 亚洲综合色激情五月 | 成人一级电影在线观看 | 国产精品国产三级国产 | 亚洲欧洲精品一区 | 欧美人牲| 91在线入口 | 国产专区一 | 国产成人精品不卡 | 国产成人久久精品 | 国产精品乱码一区二三区 | 亚洲高清视频在线观看 | 国产成人久久精品77777综合 | www.av中文字幕.com| 国内外成人免费在线视频 | 国产视频黄 | 精品亚洲一区二区三区 | 婷婷5月色 | 麻豆视频免费网站 | 天天摸夜夜添 | 欧美va在线观看 | 日韩精品久久一区二区 | 国产成人三级在线观看 | 国产区 在线 | 麻豆视频免费观看 | 国产一级黄 | 国产精品18久久久久白浆 | av免费网站| 国产精品久久久久久婷婷天堂 | 亚洲伊人第一页 | 91午夜精品 | 亚洲成人午夜在线 | 91av在线免费看 | 天天插综合 | 999久久国产 | 午夜三级理论 | 日韩高清三区 | 456成人精品影院 | 一区二区三区四区影院 | 色视频网址 | 日韩在线观看第一页 | 精品免费一区二区三区 | 婷婷中文在线 | 波多野结衣理论片 | 国产欧美综合在线观看 | 精品久久久久久久久中文字幕 | 国产精品一区二区中文字幕 | 免费看黄20分钟 | 国产一级免费av | 国产高清中文字幕 | 中文字幕在线观看不卡 | 在线免费观看黄色 | 99精品视频在线观看播放 | 成人av电影网址 | 精品福利片 | 久草在线最新视频 | 亚洲a资源 | 久久露脸国产精品 | 日韩精品第一区 | 最近日本韩国中文字幕 | 黄色软件大全网站 | 久久天堂精品视频 | 99热这里是精品 | 日本久久中文 | 青青河边草免费直播 | 国产一级淫片免费看 | 黄色精品久久久 | 日韩精品一区二区三区在线视频 | 天天玩夜夜操 | 欧美一二三区在线观看 | 日韩中文字幕免费视频 | 亚洲天堂网视频在线观看 | 亚洲欧美成人 | 欧美日韩一区二区三区在线免费观看 | 午夜久久福利影院 | 国产成人99久久亚洲综合精品 | 久久综合网色—综合色88 | 久久久国产在线视频 | 国产视频一区二区三区在线 | 人人超在线公开视频 | 一本一本久久a久久 | 在线看片一区 | 激情伊人五月天久久综合 | 免费福利片| 午夜久久精品 | 日韩国产欧美在线视频 | 国产精品久久久久久久免费大片 | 欧美激情视频一区二区三区免费 | 在线观看mv的中文字幕网站 | 精品国产欧美一区二区三区不卡 | 日韩专区一区二区 | 日韩欧美在线播放 | 亚洲另类久久 | 日韩欧美视频一区二区 | 久久精品美女 | 热久精品| 欧美性直播 | 色在线观看网站 | av久久在线| av免费观看高清 | 人人射人人澡 | 国产亚洲精品久久 | 狠狠做深爱婷婷综合一区 | 四虎影视成人精品 | 黄色成人av | 国产精品久久网站 | 在线91播放| 91在线免费观看网站 | 美女视频黄免费网站 | 国产精品黄色在线观看 | 91久久人澡人人添人人爽欧美 | 丁香久久综合 | 日韩在线不卡av | 黄色高清视频在线观看 | 国产三级午夜理伦三级 | 99久久久久国产精品免费 | 天堂av免费看 | 国产一区二区影院 | 中文字幕在线观看免费高清完整版 | 韩国av电影网 | 五月天综合 | 国产精品综合久久久久久 | 久久97超碰 | 99精品在线观看 | 国产99自拍| 亚洲视频电影在线 | 超碰激情在线 | 国产福利小视频在线 | 久久久视屏 | 香蕉视频国产在线 | 五月婷婷在线视频观看 | 国产精品久久久久久爽爽爽 | 中文字幕中文字幕在线中文字幕三区 | 在线免费观看视频一区二区三区 | 在线观看91网站 | 成人日批视频 | 天天干天天操天天干 | 国产亚洲婷婷免费 | 日韩在线大片 | 久久成人国产精品免费软件 | 91视频成人免费 | 欧美va天堂va视频va在线 | 99日精品 | 99精品视频在线观看视频 | 91精品久久久久久久久久久久久 | 欧美日本不卡高清 | 在线成人欧美 | 美女视频黄是免费的 | 最新国产在线视频 | 精品国产一区二区三区久久久蜜月 | 免费av电影网站 | 欧美日韩视频在线播放 | 亚洲激情视频在线观看 | 成人av网页 | 一区二区久久久久 | 亚洲精品99| www.午夜视频 | 亚洲播播 | 成人午夜影院在线观看 | 成人网大片 | 亚洲经典中文字幕 | 五月天亚洲激情 | 99久久国产免费,99久久国产免费大片 | 美女网站色 | 久久av中文字幕片 | 免费久久视频 | 免费观看性生交大片3 | 国产最顶级的黄色片在线免费观看 | 天天爱天天干天天爽 | 亚洲精品麻豆视频 | 成人三级黄色 | 日韩av电影中文字幕 | 美女天天操| 黄色大片国产 | 国产免费久久久久 | 亚洲高清国产视频 | 在线中文字幕观看 | www日韩视频 | 中文字幕美女免费在线 | 久草在线中文视频 | 狠狠干狠狠久久 | 日韩视频a | 色综合久久久久久久 | 在线播放你懂 | 性色在线视频 | 大胆欧美gogo免费视频一二区 | 网址你懂的在线观看 | 色视频国产直接看 | 成人试看120秒 | 午夜视频在线观看欧美 | 网站在线观看你们懂的 | 国产亚洲精品久久久久久电影 | 97在线精品视频 | 国产香蕉视频在线播放 | 色综合久久综合中文综合网 | 精品国产一区二区三区在线 | 一区二区三区日韩在线观看 | 久久精精品视频 | 婷婷色六月天 | 国产成人精品999 | 亚洲一级电影 | 日韩国产精品一区 | 国产精品久久久久久久久久直播 | 美女av免费看 | 日韩欧美国产精品 | 人人干干人人 | 久久99久国产精品黄毛片入口 | 成人午夜网址 | 超碰在线免费97 | 91激情在线视频 | 99视频在线观看视频 | 免费网址你懂的 | 99热精品视 | 丝袜美腿一区 | 五月综合色婷婷 | 欧美一区二区视频97 | 国产在线 一区二区三区 | 国产成人av一区二区三区在线观看 | 日本精品一区二区在线观看 | 亚洲三级网站 | 亚洲国产成人在线 | 日韩三级视频在线观看 | 韩国一区二区三区在线观看 | 一区二区三区日韩视频在线观看 | 日韩欧美aaa | 久久99久久精品 | 黄色一集片 | 免费观看十分钟 | 欧美另类高清 | 人人精品久久 | 国产麻豆剧果冻传媒视频播放量 | 色婷婷综合激情 | av三级在线看 | 亚洲激情免费 | 激情综合网在线观看 | 日韩欧美精品免费 | 一本一本久久a久久精品综合小说 | 西西人体4444www高清视频 | 日韩在线无| 国产精品一区二区三区久久 | 久久久精品在线观看 | www.久久久精品 | 视频一区在线免费观看 | 激情婷婷在线观看 | 欧美成人精品三级在线观看播放 | 久久精品视频3 | 色亚洲网 | 欧美一区二区三区在线播放 | 81国产精品久久久久久久久久 | 99精品视频精品精品视频 | 丁香婷婷在线观看 | 欧美成人免费在线 | 国产91成人在在线播放 | 亚洲精品小视频 | 五月天激情视频 | 中文字幕一区二区三区在线观看 | 日韩三级视频在线看 | 国产免费高清视频 | 国产一级淫片免费看 | 国产一区精品在线 | 国产精品黄网站在线观看 | 日韩免费在线视频观看 | 91丨九色丨高潮丰满 | 一区二区三区在线视频111 | 成人亚洲网 | av无限看| 久草精品视频 | 综合久久精品 | 日日碰夜夜爽 | 香蕉视频网址 | 久久一区二区三区四区 | 久久激情婷婷 | 成人欧美一区二区三区在线观看 | 91亚洲精品久久久 | 成人h电影 | 久久久久久久久久久影视 | 日本精品久久久久久 | 一区二区三区日韩视频在线观看 | www.av免费观看 | 精品视频免费久久久看 | 国产在线观看你懂得 | 丁香婷婷综合五月 | 婷婷丁香色综合狠狠色 | 成人国产亚洲 | 亚洲三级在线免费观看 | 日韩 在线a | 欧美夫妻生活视频 | 91国内在线 | 久久久久久久久久久国产精品 | 丁香婷婷射 | 五月天丁香综合 | 黄a网站 | 国产欧美精品xxxx另类 | 岛国av在线免费 |