<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前期準備:
模組名:mybatis-010-advanced-mapping
打包⽅式:jar
引⼊依賴:mysql驅動依賴、mybatis依賴、junit依賴、logback依賴
pojo:com.powernode.mybatis.pojo.Student和Calzz
mapper接⼝:com.powernode.mybatis.mapper.StudentMapper和ClazzMapper
引⼊設定⽂件:mybatis-config.xml、jdbc.properties、logback.xml
mapper設定⽂件:com/powernode/mybatis/mapper/StudentMapper.xml和ClazzMapper.xml
編寫測試類:com.powernode.mybatis.test.StudentMapperTest和ClazzMapperTest
拷⻉⼯具類:com.powernode.mybatis.utils.SqlSessionUtil
準備資料庫表:⼀個班級對應多個學⽣:
班級表:t_clazz
學⽣表:t_student
clazz範例類
package com.bjpowernode.mybatis.pojo; /** * @Author:朗朗乾坤 * @Package:com.bjpowernode.mybatis.pojo * @Project:mybatis * @name:Clazz * @Date:2023/1/7 18:18 */ public class Clazz { private Integer cid; private String cname; public Clazz() { } public Clazz(Integer cid, String cname) { this.cid = cid; this.cname = cname; } @Override public String toString() { return "Clazz{" + "cid=" + cid + ", cname='" + cname + ''' + '}'; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }
Student實體類:只定義兩個欄位;對於cid屬性,是為了維護兩者關係的屬性
package com.bjpowernode.mybatis.pojo; /** * @Author:朗朗乾坤 * @Package:com.bjpowernode.mybatis.pojo * @Project:mybatis * @name:Student * @Date:2023/1/7 18:18 */ public class Student { private Integer sid; private String sname; public Student() { } public Student(Integer sid, String sname) { this.sid = sid; this.sname = sname; } @Override public String toString() { return "Student{" + "sid=" + sid + ", sname='" + sname + ''' + '}'; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } }
pojo類Student中新增⼀個屬性:Clazz clazz; 表示學⽣關聯的班級物件,增加setter and getter方法,重寫toString方法。
package com.bjpowernode.mybatis.pojo; /** * @Author:朗朗乾坤 * @Package:com.bjpowernode.mybatis.pojo * @Project:mybatis * @name:Student * @Date:2023/1/7 18:18 */ public class Student { // Student是多的一方 private Integer sid; private String sname; private Clazz clazz; // Clazz是一的一方 public Student() { } public Student(Integer sid, String sname) { this.sid = sid; this.sname = sname; } @Override public String toString() { return "Student{" + "sid=" + sid + ", sname='" + sname + ''' + ", clazz=" + clazz + '}'; } public Clazz getClazz() { return clazz; } public void setClazz(Clazz clazz) { this.clazz = clazz; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } }
多對一:多個學生Student對應一個班級Clazz
多種⽅式,常⻅的包括三種:
① 第⼀種⽅式:⼀條SQL語句,級聯屬性對映。
② 第⼆種⽅式:⼀條SQL語句,association。
③第三種⽅式:兩條SQL語句,分步查詢。
三兄弟之一:StudentMapper介面,編寫方法
根據id獲取學生Student資訊,同時獲取學生關聯的班級Clazz資訊
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Student; public interface StudentMapper { /* * @param id 學生的id * @return 學生物件,但是學生物件當中含有班級物件 */ Student selectById(Integer id); }
三兄弟之二:StudentMapper.xml檔案,編寫sql語句
(1)使用resultMap來指定對映關係,結果對映resultMap有兩個引數:
一個引數是id,指定resultMap的唯一標識,這個id將來在select標籤中使用。
一個引數是type,用來指定POJO類的類名。
(2)在resultMap下還有一個子標籤result;首先對於有主鍵的需要配一個id,不是必須的,但可以增加效率;下面使用result子標籤的property屬性和column屬性分別指定POJO類的屬性名和資料庫表中的欄位表之間的對映關係。
<?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.bjpowernode.mybatis.mapper.StudentMapper"> <!--多對一對映的第一種方式:一條SQL語句,級聯屬性對映--> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="sid" column="sid"/> <result property="clazz.cid" column="cid"/> <result property="clazz.cname" column="cname" /> </resultMap> <select id="selectById" resultMap="studentResultMap"> select s.sid,s.sname,c.cid,c.cname from t_student s left join t_clazz c on s.cid = c.cid where s.sid = #{sid} </select> </mapper> <?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.bjpowernode.mybatis.mapper.StudentMapper"> <!--多對一對映的第一種方式:一條SQL語句,級聯屬性對映--> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="sid" column="sid"/> <result property="clazz.cid" column="cid"/> <result property="clazz.cname" column="cname" /> </resultMap> <select id="selectById" resultMap="studentResultMap"> select s.sid,s.sname,c.cid,c.cname from t_student s left join t_clazz c on s.cid = c.cid where s.sid = #{sid} </select> </mapper>
三兄弟之三:StudentMappeTest類,用來編寫測試類
package com.bjpowernode.mybatis.test; import com.bjpowernode.mybatis.mapper.StudentMapper; import com.bjpowernode.mybatis.pojo.Student; import com.bjpowernode.mybatis.utils.SqlSessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class StudentMapperTest { @Test public void testSelectById(){ SqlSession sqlSession = SqlSessionUtil.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); Student student = mapper.selectById(1); // 直接輸出Student物件 System.out.println(student); // 輸出每個屬性 System.out.println(student.getSid()); System.out.println(student.getSname()); System.out.println(student.getClazz().getCid()); System.out.println(student.getClazz().getCname()); sqlSession.close(); } }
執行結果:
第二種方式,和第一種方式的程式碼很類似,就是多引入一個association標籤,association翻譯為關聯的意思
三兄弟之一:StudentMapper介面,編寫方法
根據id獲取學生Student資訊,同時獲取學生關聯的班級Clazz資訊
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Student; public interface StudentMapper { /** * 一條SQL語句,使用association標籤的方式 * @param id 學生的id * @return 學生物件,但是學生物件當中含有班級物件 */ Student selectByIdAssociation(Integer id); }
三兄弟之二:StudentMapper.xml檔案,編寫sql語句
association:翻譯為關聯,一個Student物件關聯一個Clazz物件
①property標籤:提供要對映的POJO類的屬性名,這裡就是clazz
②javaType標籤:用來指定要對映的java型別,這裡就是com.bjpowernode.mybatis.Clazz
<?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.bjpowernode.mybatis.mapper.StudentMapper"> <!--一條SQL語句,引入association標籤--> <resultMap id="studentResultMapAssociation" type="Student"> <id property="sid" column="sid"/> <result property="sname" column="sname"/> <!--使用assocaition標籤--> <association property="clazz" javaType="Clazz"> <!--雖然欄位是相同的,但是不能省略不寫--> <id property="cid" column="cid"/> <result property="cname" column="cname" /> </association> </resultMap> <select id="selectByIdAssociation" resultMap="studentResultMapAssociation"> select s.sid,s.sname,c.cid,c.cname from t_student s left join t_clazz c on s.cid = c.cid where s.sid = #{sid} </select> </mapper>
三兄弟之三:StudentMappeTest類,用來編寫測試類
package com.bjpowernode.mybatis.test; import com.bjpowernode.mybatis.mapper.StudentMapper; import com.bjpowernode.mybatis.pojo.Student; import com.bjpowernode.mybatis.utils.SqlSessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class StudentMapperTest { @Test public void testSelectByIdAssociation(){ SqlSession sqlSession = SqlSessionUtil.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); Student student = mapper.selectByIdAssociation(2); // 直接輸出Student物件 System.out.println(student); sqlSession.close(); } }
執行結果:
分佈查詢,需要兩條SQL語句,這種⽅式常⽤:
①優點⼀是可復⽤。
②優點⼆是⽀持懶載入(延遲載入)
(1)分佈查詢第一步:先根據學生的sid查詢學生資訊
①在StudentMapper中編寫第一步的查詢方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Student; public interface StudentMapper { // 分佈查詢第一步:現根據學生的sid查詢學生資訊 Student selectByIdStep1(Integer id); }
②在StudentMapper.xml中編寫SQL語句,並指明兩者之間的關聯關係
還是需要association標籤:
①property屬性:還是提供要對映的POJO類的屬性名,這裡就是clazz
②select屬性:用來指定另外第二步SQL語句的id,這個id實際上就是namespace+id;通過第二步語句的查詢結果,把值賦值給clazz
③column屬性:是把第一條SQL語句查詢出來的cid傳給第第二條SQL語句
<?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.bjpowernode.mybatis.mapper.StudentMapper"> <!--這是第一步:根據學生的id查詢學生的所有資訊,包含cid--> <resultMap id="studentResultMapByStep" type="Student"> <id property="sid" column="sid"/> <result property="sname" column="sname" /> <!--使用association標籤,指明關聯關係--> <association property="clazz" select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2" column="cid"/> </resultMap> <select id="selectByIdStep1" resultMap="studentResultMapByStep"> select sid,sname,cid from t_student where sid = #{sid}; </select> </mapper>
(2)分佈查詢第二步:根據學生的cid查詢班級資訊
①在ClazzMapper中編寫第二步的查詢方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Clazz; public interface ClazzMapper { // 分佈查詢第二步:根據cid獲取查詢資訊 Clazz selectByIdStep2(Integer cid); }
②在ClazzMapper.xml中編寫SQL語句
<?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.bjpowernode.mybatis.mapper.ClazzMapper"> <!--分佈查詢第二步:根據cid獲取班級資訊--> <select id="selectByIdStep2" resultType="Clazz"> select cid,cname from t_clazz where cid = #{id}; </select> </mapper>
(3)最終StudentMapperTest編寫測試,因為Student是主表
package com.bjpowernode.mybatis.test; import com.bjpowernode.mybatis.mapper.StudentMapper; import com.bjpowernode.mybatis.pojo.Student; import com.bjpowernode.mybatis.utils.SqlSessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class StudentMapperTest { @Test public void testSelectByIdStep1(){ SqlSession sqlSession = SqlSessionUtil.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); Student student = mapper.selectByIdStep1(3); System.out.println(student); sqlSession.close(); } }
執行結果:
(1)延遲載入的核心是:用到的在查詢,暫時存取不到的資料可以先不查詢。
(2)作用:提⾼程式的執⾏效率;不用的時候也查效能肯定低,例如笛卡爾積現象
(3)在MyBatis中如何開啟延遲載入:asspciation標籤當中新增fetchType="lazy"
例1:不開啟延遲載入機制,假如只存取學生表t_student的sname屬性,和t_clazz表實際上是沒有任何關係的
package com.bjpowernode.mybatis.test; import com.bjpowernode.mybatis.mapper.StudentMapper; import com.bjpowernode.mybatis.pojo.Student; import com.bjpowernode.mybatis.utils.SqlSessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class StudentMapperTest { @Test public void testSelectByIdStep1(){ SqlSession sqlSession = SqlSessionUtil.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); Student student = mapper.selectByIdStep1(3); // System.out.println(student); // 只存取sname屬性 System.out.println(student.getSname()); sqlSession.close(); } }
執行結果:實際上執行了兩個查詢語句,效率變低
例2:在asspciation標籤中開啟延遲機制,就能做到只執行第一條SQL語句,第二條不執行;
<?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.bjpowernode.mybatis.mapper.StudentMapper"> <resultMap id="studentResultMapByStep" type="Student"> <id property="sid" column="sid"/> <result property="sname" column="sname" /> <!--使用association標籤,並開啟延遲載入機制--> <association property="clazz" select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2" column="cid" fetchType="lazy"/> </resultMap> <select id="selectByIdStep1" resultMap="studentResultMapByStep"> select sid,sname,cid from t_student where sid = #{sid}; </select> </mapper>
執行結果:同樣還是隻存取學生表t_student的sname屬性,此時就是隻查詢一張表即可
(4)在association標籤中設定fetchType=“lazy”,實際上是區域性的設定,只對當前的association關聯的SQL語句起作用!
(5)那麼怎樣在mybatis中如何開啟全域性的延遲載入呢?需要setting設定,如下:
(6)在核心組態檔mybatis-config.xml檔案當中使用setting標籤進行設定
<!--啟⽤全域性延遲載入機制--> <settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>
(7)開啟全域性延遲載入之後,所有的SQL都會⽀持延遲載入,但是如果某個SQL你不希望它⽀持延遲載入怎麼辦呢? 將fetchType設定為eager
<?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.bjpowernode.mybatis.mapper.StudentMapper"> <resultMap id="studentResultMapByStep" type="Student"> <id property="sid" column="sid"/> <result property="sname" column="sname" /> <!--使用association標籤,不開啟延遲載入機制--> <association property="clazz" select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2" column="cid" fetchType="eager"/> </resultMap> <select id="selectByIdStep1" resultMap="studentResultMapByStep"> select sid,sname,cid from t_student where sid = #{sid}; </select> </mapper>
⼀對多的實現,通常是在⼀的⼀⽅中有List集合屬性!
pojo類Clazz中新增⼀個屬性:List<Student> stu; 表示班級關聯的學生物件,增加setter and getter方法,重寫toString方法。
package com.bjpowernode.mybatis.pojo; import java.util.*; public class Clazz { private Integer cid; private String cname; private List<Student> stus; public Clazz() { } public Clazz(Integer cid, String cname) { this.cid = cid; this.cname = cname; } @Override public String toString() { return "Clazz{" + "cid=" + cid + ", cname='" + cname + ''' + ", stus=" + stus + '}'; } public List<Student> getStus() { return stus; } public void setStus(List<Student> stus) { this.stus = stus; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }
⼀對多的實現通常包括兩種實現⽅式:
①第⼀種⽅式:collection
②第⼆種⽅式:分步查詢
注:這次t_calss是主表,所以是在ClazzMapper、ClazzMapper.xml、ClazzMapperTest當中完成一些列操作。
三兄弟之一:ClazzMapper介面,編寫方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Clazz; public interface ClazzMapper { // 根據班級編號查詢班級資訊 Clazz selectByIdCollection(Integer cid); }
三兄弟之二:ClazzMapper.xml檔案,編寫sql語句
使用collection標籤,和上面使用association標籤的第二種方法是很相似的
①property屬性:提供要對映的POJO類的屬性名,這裡就是stus
②ofType屬性:用來指定集合當中的元素型別com.bjpowernode.mybatis.Student
<?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.bjpowernode.mybatis.mapper.ClazzMapper"> <resultMap id="clazzResultMap" type="Clazz"> <id property="cid" column="cid"/> <result property="cname" column="cname"/> <!--ofType用來指定集合當中的元素型別--> <collection property="stus" ofType="Student"> <id property="sid" column="sid"/> <result property="sname" column="sname"/> </collection> </resultMap> <select id="selectByIdCollection" resultMap="clazzResultMap"> select c.cid,c.cname,s.sid,s.sname from t_clazz c left join t_student s on c.cid = s.cid where c.cid = #{cid} </select> </mapper>
三兄弟之三:ClazzMappeTest類,用來編寫測試類
package com.bjpowernode.mybatis.test; import com.bjpowernode.mybatis.mapper.ClazzMapper; import com.bjpowernode.mybatis.pojo.Clazz; import com.bjpowernode.mybatis.utils.SqlSessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class ClazzMapperTest { @Test public void testSelectByIdCollection(){ SqlSession sqlSession = SqlSessionUtil.openSession(); ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class); Clazz clazz = mapper.selectByIdCollection(1001); System.out.println(clazz); sqlSession.close(); } }
執行結果:
查詢的結果是stus變數是一個有三個資料的List集合,其中clazz是null屬於正常現象,如果clazz還有值,就會與前面的Student形成遞迴迴圈
(1)分佈查詢第一步:先根據班級編號獲取班級資訊
①在ClazzMapper中編寫第一步的查詢方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Clazz; public interface ClazzMapper { // 分佈查詢第一步:根據班級編號,獲取班級資訊 Clazz selectByStep1(Integer cid); }
②在ClazzMapper.xml中編寫SQL語句,並指明兩者之間的關聯關係
<?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.bjpowernode.mybatis.mapper.ClazzMapper"> <!--分佈查詢第一步:根據班級的cid獲取班級資訊--> <resultMap id="clazzResultMapStep" type="Clazz"> <id property="cid" column="cid"/> <result property="cname" column="cname"/> <collection property="stus" select="com.bjpowernode.mybatis.mapper.StudentMapper.selectByCidStep2" column="cid" /> </resultMap> <select id="selectByStep1" resultMap="clazzResultMapStep"> select cid,cname from t_clazz where cid = #{cid} </select> </mapper>
(2)分佈查詢第二步:根據學生的cid查詢班級資訊
①在StudentMapper中編寫第二步的查詢方法
package com.bjpowernode.mybatis.mapper; import com.bjpowernode.mybatis.pojo.Student; import java.util.List; public interface StudentMapper { // 分佈查詢第二步:根據班級編號查詢學生資訊 List<Student> selectByCidStep2(Integer cid); }
②在StudentMapper.xml中編寫SQL語句
<?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.bjpowernode.mybatis.mapper.StudentMapper"> <select id="selectByCidStep2" resultType="Student"> select * from t_student where cid = #{cid} </select> </mapper>
(3)最終ClazzMapperTest編寫測試,因為Clazz是主表
package com.bjpowernode.mybatis.test; import com.bjpowernode.mybatis.mapper.ClazzMapper; import com.bjpowernode.mybatis.pojo.Clazz; import com.bjpowernode.mybatis.utils.SqlSessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class ClazzMapperTest { @Test public void testSelectByStep1(){ SqlSession sqlSession = SqlSessionUtil.openSession(); ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class); Clazz clazz = mapper.selectByStep1(1001); System.out.println(clazz); sqlSession.close(); } }
執行結果:
⼀對多延遲載入機制和多對⼀是⼀樣的,同樣是通過兩種⽅式:
第⼀種:fetchType="lazy"
第⼆種:修改全域性的設定setting,lazyLoadingEnabled=true,如果開啟全域性延遲載入,想讓某個 sql不使⽤延遲載入:fetchType="eager"
到此這篇關於MyBatis的⾼級對映及延遲載入的文章就介紹到這了,更多相關MyBatis延遲載入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45