日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 數據庫 > 數據庫應用 > MyBatis入門第2天--MyBatis基礎知識(二)

MyBatis入門第2天--MyBatis基礎知識(二)

來源:程序員人生   發布時間:2016-09-12 15:26:37 閱讀次數:3536次
文檔版本 開發工具 測試平臺 工程名字 日期 作者 備注
V1.0 2016.06.26 lutianfei none

mybatis開發dao的方法

SqlSession使用范圍

  • SqlSessionFactoryBuilder

    • 通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory
    • 將SqlSessionFactoryBuilder當做1個工具類使用便可,不需要使用單例管理SqlSessionFactoryBuilder。
    • 在需要創建SqlSessionFactory時候,只需要new1次SqlSessionFactoryBuilder便可。
  • SqlSessionFactory

    • 通過SqlSessionFactory創建SqlSession,使用單例模式管理sqlSessionFactory(工廠1旦創建,使用1個實例)。
    • 將來mybatis和spring整合后,使用單例模式管理sqlSessionFactory。
  • SqlSession

    • SqlSession是1個面向用戶(程序員)的接口。
    • SqlSession中提供了很多操作數據庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象)、。
    • SqlSession是線程不安全的,在SqlSesion實現類中除有接口中的方法(操作數據庫的方法)還有數據域屬性。
    • SqlSession最好利用場合在方法體內,定義成局部變量使用。
  • SqlSession履行進程以下:

    • 1、 加載數據源等配置信息
      • Environment environment = configuration.getEnvironment();
    • 2、 創建數據庫鏈接
    • 3、 創建事務對象
    • 4、 創建Executor,SqlSession所有操作都是通過Executor完成,mybatis源碼以下:
if (ExecutorType.BATCH == executorType) { executor = newBatchExecutor(this, transaction); } elseif (ExecutorType.REUSE == executorType) { executor = new ReuseExecutor(this, transaction); } else { executor = new SimpleExecutor(this, transaction); } if (cacheEnabled) { executor = new CachingExecutor(executor, autoCommit); }
* 5、 SqlSession的實現類即DefaultSqlSession,此對象中對操作數據庫實質上用的是Executor
  • 結論:
    • 每一個線程都應當有它自己的SqlSession實例。SqlSession的實例不能同享使用,它也是線程不安全的。因此最好的范圍是要求或方法范圍。絕對不能將SqlSession實例的援用放在1個類的靜態字段或實例字段中。
    • 打開1個 SqlSession;使用終了就要關閉它。通常把這個關閉操作放到 finally 塊中以確保每次都能履行關閉。以下:
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }


原始dao開發方法

  • 程序員需要寫dao接口和dao實現類
  • 思路

    • 程序員需要寫dao接口和dao實現類。
    • 需要向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory創建SqlSession
  • dao接口


  • dao接口實現類
public class UserDaoImpl implements UserDao { // 需要向dao實現類中注入SqlSessionFactory // 這里通過構造方法注入 private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public User findUserById(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("test.findUserById", id); // 釋放資源 sqlSession.close(); return user; } @Override public List<User> findUserByName(String name) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> list = sqlSession.selectList("test.findUserByName", name); // 釋放資源 sqlSession.close(); return list; } @Override public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //履行插入操作 sqlSession.insert("test.insertUser", user); // 提交事務 sqlSession.commit(); // 釋放資源 sqlSession.close(); } @Override public void deleteUser(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //履行插入操作 sqlSession.delete("test.deleteUser", id); // 提交事務 sqlSession.commit(); // 釋放資源 sqlSession.close(); }


  • 測試代碼:
public class UserDaoImplTest { private SqlSessionFactory sqlSessionFactory; // 此方法是在履行testFindUserById之前履行 @Before public void setUp() throws Exception { // 創建sqlSessionFactory // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創建會話工廠,傳入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } @Test public void testFindUserById() throws Exception { // 創建UserDao的對象 UserDao userDao = new UserDaoImpl(sqlSessionFactory); // 調用UserDao的方法 User user = userDao.findUserById(1); System.out.println(user); } }


原始dao開提問題
  • dao接口實現類方法中存在大量模板方法,假想能否將這些代碼提取出來,大大減輕程序員的工作量。
  • 調用sqlsession方法時將statement的id硬編碼了
  • 調用sqlsession方法時傳入的變量,由于sqlsession方法使用泛型,即便變量類型傳入毛病,在編譯階段也不報錯,不利于程序員開發。

mapper代理方法

  • 程序員只需要mapper接口(相當 于dao接口)

mapper代理開發規范

  • 程序員還需要編寫mapper.xml映照文件
  • 程序員編寫mapper接口需要遵守1些開發規范,這樣Mybatis可以自動生成mapper接口實現類代理對象。

  • 開發規范:

    • 1、在mapper.xml中namespace等于mapper接口地址
      • 2、mapper.java接口中的方法名和mapper.xml中statement的id1致
    • 3、mapper.java接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型1致。
    • 4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型1致。

  • 總結:
    • 以上開發規范主要是對下邊的代碼進行統1生成:
User user = sqlSession.selectOne("test.findUserById", id); sqlSession.insert("test.insertUser", user);
  • 編寫XXXmapper.java
public interface UserMapper { //用戶信息綜合查詢 public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception; //用戶信息綜合查詢總數 public int findUserCount(UserQueryVo userQueryVo) throws Exception; //根據id查詢用戶信息 public User findUserById(int id) throws Exception; //根據id查詢用戶信息,使用resultMap輸出 public User findUserByIdResultMap(int id) throws Exception; //根據用戶名列查詢用戶列表 public List<User> findUserByName(String name)throws Exception; //插入用戶 public void insertUser(User user)throws Exception; //刪除用戶 public void deleteUser(int id)throws Exception; }


  • XXXmapper.xml



  • 在SqlMapConfig.xml中加載mapper.xml
<!-- 加載 映照文件 --> <mappers> <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> <!-- 批量加載mapper 指定mapper接口的包名,mybatis自動掃描包下邊所有mapper接口進行加載,遵守1些規范:需要將mapper接口類名和mapper.xml映照文件名稱保持1致,且在1個目錄中 上邊規范的條件是:使用的是mapper代理方法 --> <package name="cn.itcast.mybatis.mapper"/> </mappers>
  • 測試
@Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用userMapper的方法 User user = userMapper.findUserById(1); System.out.println(user); }
  • 1些問題總結
    • 代理對象內部調用selectOne或selectList ?
      • 如果mapper方法返回單個pojo對象(非集合對象),代理對象內部通過selectOne查詢數據庫
      • 如果mapper方法返回集合對象,代理對象內部通過selectList查詢數據庫
    • mapper接口方法參數只能有1個是不是影響系統擴大保護?
      • 系統框架中,dao層的代碼是被業務層公用的。即便mapper接口只有1個參數,可使用包裝類型的pojo滿足不同的業務方法的需求。
      • 注意:持久層方法的參數可以包裝類型、map、list等等;
      • 但service方法中建議不要使用包裝類型(不利于業務層的可擴大)。


SqlMapConfig.xml配置文件

  • mybatis的全局配置文件SqlMapConfig.xml,配置內容以下:
    • properties(屬性)
    • settings(全局配置參數)
    • typeAliases(類型別名)
    • typeHandlers(類型處理器)
    • objectFactory(對象工廠)
    • plugins(插件)
    • environments(環境集合屬性對象)
    • environment(環境子屬性對象)
    • transactionManager(事務管理)
    • dataSource(數據源)
    • mappers(映照器)
properties屬性
  • 需求:將數據庫連接參數單獨配置在db.properties中,只需要在SqlMapConfig.xml中加載db.properties的屬性值。

  • 在SqlMapConfig.xml中就不需要對數據庫連接參數硬編碼。

  • 數據庫連接參數只配置在db.properties中:方便對參數進行統1管理,其它xml可以援用該db.properties。
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=mysql


  • 在sqlMapConfig.xml加載屬性文件
<!-- 加載屬性文件 --> <properties resource="db.properties"> <!--properties中還可以配置1些屬性名和屬性值 --> <!-- <property name="jdbc.driver" value=""/> --> </properties> <!-- 和spring整合后 environments配置將廢除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理,事務控制由mybatis--> <transactionManager type="JDBC" /> <!-- 數據庫連接池,由mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
  • properties特性:
  • 注意: MyBatis 將依照下面的順序來加載屬性:
    • 在 properties 元素體內定義的屬性首先被讀取。
    • 然后會讀取properties 元素中resource或 url 加載的屬性,它會覆蓋已讀取的同名屬性。
    • 最后讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
  • 因此,通過parameterType傳遞的屬性具有最高優先級resourceurl 加載的屬性次之最低優先級的是 properties 元素體內定義的屬性。

  • 建議:

    • 不要在properties元素體內添加任何屬性值,只將屬性值定義在properties文件中。
    • 在properties文件中定義屬性名要有1定的特殊性,如:XXXXX.XXXXX.XXXX


settings全局參數配置
  • mybatis框架在運行時可以調劑1些運行參數。
  • 比如:開啟2級緩存、開啟延遲加載。。
  • 全局參數將會影響mybatis的運行行動。
  • 詳細參見“學習資料/mybatis-settings.xlsx”文件


typeAliases(別名)重點
  • 需求

    • 在mapper.xml中,定義很多的statement,statement需要parameterType指定輸入參數的類型、需要resultType指定輸出結果的映照類型。
    • 如果在指定類型時輸入類型全路徑,不方便進行開發,可以針對parameterTyperesultType 指定的類型定義1些別名,在mapper.xml中通過別名定義,方便開發。
  • mybatis默許支持的別名

別名 映照的類型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal


  • 自定義別名
  • 單個別名定義

  • 援用別名:

  • 批量定義別名(經常使用)

<!-- 別名定義 --> <typeAliases> <!-- 針對單個別名定義 type:類型的路徑 alias:別名 --> <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> --> <!-- 批量別名定義 指定包名,mybatis自動掃描包中的po類,自動定義別名,別名就是類名(首字母大寫或小寫都可以) --> <package name="cn.itcast.mybatis.po"/> </typeAliases>


typeHandlers(類型處理器)
  • mybatis中通過typeHandlers完成jdbc類型和java類型的轉換。
  • 通常情況下,mybatis提供的類型處理器滿足平常需要,不需要自定義
  • mybatis支持類型處理器:
類型處理器 Java類型 JDBC類型
BooleanTypeHandler Boolean,boolean 任何兼容的布爾值
ByteTypeHandler Byte,byte 任何兼容的數字或字節類型
ShortTypeHandler Short,short 任何兼容的數字或短整型
IntegerTypeHandler Integer,int 任何兼容的數字和整型
LongTypeHandler Long,long 任何兼容的數字或長整型
FloatTypeHandler Float,float 任何兼容的數字或單精度浮點型
DoubleTypeHandler Double,double 任何兼容的數字或雙精度浮點型
BigDecimalTypeHandler BigDecimal 任何兼容的數字或10進制小數類型
StringTypeHandler String CHAR和VARCHAR類型
ClobTypeHandler String CLOB和LONGVARCHAR類型
NStringTypeHandler String NVARCHAR和NCHAR類型
NClobTypeHandler String NCLOB類型
ByteArrayTypeHandler byte[] 任何兼容的字節流類型
BlobTypeHandler byte[] BLOB和LONGVARBINARY類型
DateTypeHandler Date(java.util) TIMESTAMP類型
DateOnlyTypeHandler Date(java.util) DATE類型
TimeOnlyTypeHandler Date(java.util) TIME類型
SqlTimestampTypeHandler Timestamp(java.sql) TIMESTAMP類型
SqlDateTypeHandler Date(java.sql) DATE類型
SqlTimeTypeHandler Time(java.sql) TIME類型
ObjectTypeHandler 任意 其他或未指定類型
EnumTypeHandler Enumeration類型 VARCHAR-任何兼容的字符串類型,作為代碼存儲(而不是索引)。


mappers(映照配置)
  • 通過resource加載單個映照文件,<mapper resource=" " />使用相對類路徑的資源
    • 如:<mapper resource="sqlmap/User.xml" />


  • 使用完全限定路徑<mapper url=" " />

    • 如:<mapper url="file:///D:\workspace_spingmvc\mybatis_01\config\sqlmap\User.xml" />
  • 通過mapper接口加載單個mapper

    • 規范:mapper**接口類名和mapper.xml映照文件名稱必須保持1致,且在1個package目錄中**;并且要使用mapper代理方法
<!-- 通過mapper接口加載單個映照文件需要遵守1些規范:mapper接口類名和mapper.xml映照文件名稱必須保持1致,且在1個package目錄中;并且要使用mapper代理方法--> <mapper class="cn.itcast.mybatis.mapper.UserMapper"/>


  • 批量加載mapper(推薦使用)
    • 當指定mapper接口的包名時,mybatis會自動掃描包下邊所有mapper接口進行加載
    • 應遵守的1些規范:需要將mapper**接口類名和mapper.xml映照文件名稱保持1致,且在1個package目錄中;并且使用的是**mapper代理方法
<package name="cn.itcast.mybatis.mapper"/>


輸入映照

  • 通過parameterType指定輸入參數的類型,類型可以是簡單類型、hashmap、pojo的包裝類型。
傳遞pojo的包裝對象
  • 需求:

    • 完成用戶信息的綜合查詢,需要傳入查詢條件很復雜(可能包括用戶信息、其它信息,比如商品、定單的)
  • 定義包裝類型pojo

    • 針對上邊需求,建議使用自定義的包裝類型的pojo。在包裝類型的pojo中將復雜的查詢條件包裝進去。


  • 映照文件XXXmapper.xml設置
    • 在UserMapper.xml中定義用戶信息綜合查詢(查詢條件復雜,通太高級查詢進行復雜關聯查詢)。

  • mapper.java

  • 測試代碼


傳遞hashmap
  • Sql映照文件定義以下:
    • #中 id 和 username是hashmap的key。
<!-- 傳遞<u>hashmap</u>綜合查詢用戶信息 --> <select id="findUserByHashmap" parameterType="hashmap" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select>


  • 測試:
Public void testFindUserByHashmap()throws Exception{ //獲得session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper接口實例 UserMapper userMapper = session.getMapper(UserMapper.class); //構造查詢條件Hashmap對象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); map.put("username", "管理員"); //傳遞Hashmap對象查詢用戶列表 List<User>list = userMapper.findUserByHashmap(map); //關閉session session.close(); }
  • 異常測試:
    • 傳遞的map中的key和sql中解析的key不1致。
    • 測試結果沒有報錯,只是通過key獲得值為空。


輸出映照

resultType
  • 使用resultType進行輸出映照,只有查詢出來的列名pojo中的屬性名1致,該列才可以映照成功。

    • 如果查詢出來的列名和pojo中的屬性名全部不1致,沒有創建pojo對象。
    • 只要查詢出來的列名和pojo中的屬性有1個1致,就會創建pojo對象。
  • 輸出簡單類型

  • 需求

    • 用戶信息的綜合查詢列表總數,通過查詢總數和上邊用戶綜合查詢列表才可以實現分頁。
  • Usermapper.xml


  • Usermapper.java

  • 測試代碼

  • 小結

    • 查詢出來的結果集只有1行且1列,可使用簡單類型進行輸出映照。
  • 輸出pojo對象和pojo列表

  • 不論是輸出的pojo單個對象還是1個列表(list中包括pojo),在mapper.xml中resultType指定的類型是1樣的。
  • 在mapper.java指定的方法返回值類型不1樣:

    • 1、輸出單個pojo對象,方法返回值是單個對象類型
    • 2、輸出pojo對象list,方法返回值是List<Pojo>
  • 生成的動態代理對象中是根據mapper方法的返回值類型肯定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用)


resultMap
  • mybatis中使用resultMap完成高級輸出結果映照。

  • resultMap使用方法

    • 如果查詢出來的列名pojo的屬性名不1致,通過定義1個resultMap列名和pojo屬性名之間作1個映照關系
  • 案例: 將下邊的sql使用User完成映照

    • User類中屬性名和上邊查詢列名不1致。
SELECT id id_,username username_ FROM USER WHERE id=#{value}


  • 1、在UserMapper.xml中定義resultMap

<!-- 定義resultMap 將SELECT id id_,username username_ FROM USER 和User類中的屬性作1個映照關系 type:resultMap終究映照的java對象類型,可使用別名 id:對resultMap的唯1標識 --> <resultMap type="user" id="userResultMap"> <!-- id表示查詢結果集中唯1標識 column:查詢出來的列名 property:type指定的pojo類型中的屬性名 終究resultMap對column和property作1個映照關系 (對應關系) --> <id column="id_" property="id"/> <!-- result:對普通名映照定義 column:查詢出來的列名 property:type指定的pojo類型中的屬性名 終究resultMap對column和property作1個映照關系 (對應關系) --> <result column="username_" property="username"/> </resultMap>



  • 2、使用resultMap作為statement的輸出映照類型
<!-- 使用resultMap進行輸出映照 resultMap:指定定義的resultMap的id,如果這個resultMap在其它的mapper文件,前邊需要加namespace --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_,username username_ FROM USER WHERE id=#{value} </select>


  • mapper.java

  • 測試

@Test public void testFindUserByIdResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用userMapper的方法 User user = userMapper.findUserByIdResultMap(1); System.out.println(user); }


  • 小結
    • 使用resultType進行輸出映照,只有查詢出來的列名和pojo中的屬性名1致,該列才可以映照成功。
    • 如果查詢出來的列名和pojo的屬性名不1致,通過定義1個resultMap對列名和pojo屬性名之間作1個映照關系。

動態sql

  • 甚么是動態sql

    • mybatis核心 對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。
  • 需求

    • 用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。
    • 對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。
  • mapper.xml


  • 測試代碼


sql片斷

  • 需求

    • 將上邊實現的動態sql判斷代碼塊抽取出來,組成1個sql片斷。其它的statement中就能夠援用sql片斷。方便程序員進行開發。
  • 定義sql片斷,在UserMapper.xml頂部

  • 援用sql片斷
    • 在mapper.xml中定義的statement中援用sql片斷:


foreach

  • 向sql傳遞數組或List,mybatis使用foreach解析

  • 需求

    • 在用戶查詢列表和查詢總數的statement中增加多個id輸入查詢。sql語句以下:
//兩種方法: SELECT * FROM USER WHERE id=1 OR id=10 OR id=16 SELECT * FROM USER WHERE id IN(1,10,16)
  • 在輸入參數類型中添加List<Integer> ids傳入多個id


  • 修改mapper.xml
    • 對此類型Sql語句:WHERE id=1 OR id=10 OR id=16
    • 在查詢條件中,查詢條件定義成1個sql片斷,需要修改sql片斷。
<sql id="query_user_where"> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex = #{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username LIKE '%${userCustom.username}%' </if> <if test="ids!=null"> <!-- 使用 foreach遍歷傳入ids collection:指定輸入 對象中集合屬性 item:每一個遍歷生成對象中 open:開始遍用時拼接的串 close:結束遍用時拼接的串 separator:遍歷的兩個對象中需要拼接的串 --> <!-- 使用實現下邊的sql拼接: AND (id=1 OR id=10 OR id=16) --> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> <!-- 每一個遍歷需要拼接的串 --> id=#{user_id} </foreach> <!-- 實現 “ and id IN(1,10,16)”拼接 --> <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=","> 每一個遍歷需要拼接的串 #{user_id} </foreach> --> </if> </if> </sql>

  • 測試代碼

  • 在UserQueryVo中:

public class UserQueryVo { //傳入多個id private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } }


  • 對另外1個sql的實現:
<!-- 實現 “ and id IN(1,10,16)”拼接 --> <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=","> 每一個遍歷需要拼接的串 #{user_id} </foreach> -->
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 精品国产乱码久久久久久丨区2区 | 亚洲乱码国产乱码精品精98午夜 | 欧洲久久久久 | 国产精品国产三级国产a | 亚洲一区在线观看视频 | 一级片在线放映 | 国产一区二区三区成人 | 日韩中文字幕在线观看 | 91网页入口| 欧洲一区二区三区免费视频 | 九九热精品视频 | 国产一区二区三区精品在线观看 | 小草av| 国产精品18久久久久久久网站 | 91精品久久久久久久久久入口 | 97在线精品视频 | 日本黄xxxxxxxxx100 | 韩国精品一区 | 亚洲国产欧美日韩 | 麻豆视频入口 | 99久久精品一区二区成人 | 免费福利在线视频 | 操操综合 | 三区视频| 精品综合在线 | 午夜激情免费 | 免费av黄色片 | 中日韩在线观看 | 欧美一级大片 | 成人av电影网站 | 福利片一区二区 | 日韩久 | 亚洲青涩网 | 国产在线每日更新 | 在线一二区 | 成人小视频在线 | 中文字幕3区 | 麻豆国产| 亚洲精品久久久蜜桃 | 国产色片在线观看 | 九九九亚洲 |