Mybatis教程 | 第三篇:深入Mapper映射文件
前言
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
SQL映射文件常用的元素如下:
cache – 给定命名空间的缓存配置;
cache-ref – 其他命名空间缓存配置的引用;
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象;
sql – 可被其他语句引用的可重用语句块;
insert – 映射插入语句;
update – 映射更新语句;
delete – 映射删除语句;select – 映射查询语句;
下一部分将从语句本身开始来描述每个元素的细节。
测试select标签
select标签用来映射查询语句,它是Mybatis常用标签之一。
执行简单查询的select标签是非常简单的,例如:
<select id="selectPerson" parameterType="int" resultType="hashmap">SELECT * FROM PERSON WHERE ID = #{id}
</select>
这个语句被称作 selectPerson,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。
注意参数符号#{id},这就告诉 MyBatis 创建一个预处理语句参数,通过 JDBC,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
当然,这需要很多单独的 JDBC 的代码来提取结果并将它们映射到对象实例中,这就是 MyBatis 节省你时间的地方。我们需要深入了解参数和结果映射,细节部分我们下面来了解。
select 元素有很多属性允许你配置,来决定每条语句的作用细节,如下所示:
<selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10000"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY">
select标签的属性描述如下:
属性 | 描述 |
---|---|
id | 在命名空间中唯一的标识符,可以被用来引用这条语句,在dao层接口中对应的就是方法名,要确保唯一性,也就是dao层接口不允许重载 |
parameterType | 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unse |
resultType | 从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用 |
resultMap | 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用 |
flushCache | 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false |
useCache | 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true |
timeout | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动) |
fetchSize | 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动) |
statementType | STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED |
resultSetType | FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动) |
databaseId | 如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略 |
resultOrdered | 这个设置仅针对嵌套结果 select 语句适用:如果为 true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false |
resultSets | 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的 |
下面是一个简单的查询示例:
配置文件沿用第一篇中的配置文件
数据库表结构
持久化对象:
public class User{private Integer userId;private String userName;private String userGender;private Integer userAge;public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserGender() {return userGender;}public void setUserGender(String userGender) {this.userGender = userGender;}public Integer getUserAge() {return userAge;}public void setUserAge(Integer userAge) {this.userAge = userAge;}public User() {super();}public User(Integer userId, String userName, String userGender, Integer userAge) {super();this.userId = userId;this.userName = userName;this.userGender = userGender;this.userAge = userAge;}@Overridepublic String toString() {return "User [userId=" + userId + ", userName=" + userName + ", userGender=" + userGender + ", userAge="+ userAge + "]";}
}
mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zepal.mybatis.mapper.UserMapper"><resultMap type="com.zepal.mybatis.domain.User" id="userMap"><id column="user_id" property="userId"/><result column="user_name" property="userName"/><result column="user_gender" property="userGender"/><result column="user_age" property="userAge"/></resultMap><select id="getUserById" parameterType="int" resultMap="userMap">SELECT * from tb_user WHERE user_id = #{userId};</select></mapper>
测试代码
public class MybatisTest {public static void main(String[] args) {InputStream is = MybatisTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("com.zepal.mybatis.mapper.UserMapper.getUserById", 1);System.out.println(user.toString());sqlSession.close();}}
运行结果
DEBUG [main] - ==> Preparing: SELECT * from tb_user WHERE user_id = ?;
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [userId=1, userName=孙悟空, userGender=男, userAge=1000]
说明
对照上面select标签属性表,id是命名空间的唯一标识符,parameterType指明该查询语句允许接收一个int类型的参数(其它的标签属性这里暂时未用到,但一定要熟悉于胸,后面会用到)。resultMap属性标签引用了外部resultMap标签。这里解决的问题就是:由于在数据库中的表字段user_name,而持久层对象是userName,导致mybatis对结果集处理的时候,无法构造对象的属性,就需要结果集映射。
resultMap标签常用属性:
id–resultMap的唯一标识符,其它标签需要引用当前结果集映射的时候,通过id引入。
type–实际返回类型,告诉Mybatis需要去找哪个持久层对象进行结果集映射,这里一般需要全路径,虽然mybatis提供了typeAliases进行别名处理,但是为了方便排错,建议全路径。
autoMapping–如果设置这个属性,MyBatis将会为这个ResultMap开启或者关闭自动映射。这个属性会覆盖全局的属性 autoMappingBehavior。默认值为:unset
注:在实际开发中,有很多复杂情况,比如多表联合查询,这时简单的结果集映射已经无法满足了,就需要使用resultMap的关联属性来处理,后续的博文会继续深入resultMap。
在select标签的属性中,对结果的处理,除了resultMap以外,还有一个resultType(resultMap和resultType不能同时使用),从字面意思理解就是结果类型,允许接收类的完全限定名或别名(就是说没有被typeAliases处理过的,就需要全类名)。如果指定的返回结果类型是持久层对象,按照resultMap,假如说持久层对象和数据库字段,属性名不一致,mybatis可以构造返回结果对象,但是属性为null。这里除了指定持久层对象,mybatis还允许Map作为返回类型,因为Map是Mybatis中typeAliases默认处理的,所以指定Map的时候不用全类名(比如java.util.Map),直接使用map即可,返回结果使用列名作为key,列值作为value。如下
resultType="map"
使用map运行结果为下
DEBUG [main] - ==> Preparing: SELECT * from tb_user WHERE user_id = ?;
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
{user_id=1, user_name=孙悟空, user_age=1000, user_gender=男}
这里有个短板就是map集合不能很好描述一个领域对象,所以一般强制使用POJO去描述数据库表。所以使用resultMap比较多。
针对多条查询结果,map就需要用类似如下的数据结构:
List<Map<String, Object>>
而SqlSession调用的方法就应该是sqlSession.selectList().
insert标签测试
执行简单的新增功能标签如下
<insert id="saveUser" parameterType="com.zepal.mybatis.domain.User" useGeneratedKeys="true">INSERT INTO tb_user (user_name, user_gender, user_age)VALUES(#{userName}, #{userGender}, #{userAge});</insert>
insert标签常用属性描述如下:
属性 | 描述 |
---|---|
id | 在命名空间中唯一的标识符,可以被用来引用这条语句,在dao层接口中对应的就是方法名,要确保唯一性,也就是dao层接口不允许重载 |
parameterType | 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unse |
flushCache | 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句) |
timeout | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动) |
statementType | STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED |
useGeneratedKeys | (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false |
keyProperty | (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表 |
keyColumn | (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表 |
databaseId | 如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略 |
下面是一个简单insert示例:
配置文件、持久化对象和数据库表结构同上。
mapper文件
<insert id="saveUser" parameterType="com.zepal.mybatis.domain.User" useGeneratedKeys="true">INSERT INTO tb_user (user_name, user_gender, user_age)VALUES(#{userName}, #{userGender}, #{userAge});</insert>
测试代码
public class MybatisTest {public static void main(String[] args) {InputStream is = MybatisTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();User user = new User();user.setUserName("唐三藏");user.setUserGender("男");user.setUserAge(5000);int result = sqlSession.insert("com.zepal.mybatis.mapper.UserMapper.saveUser", user);System.out.println("返回受影响的行 : " + result);sqlSession.commit();sqlSession.close();}
}
运行结果:
DEBUG [main] - ==> Preparing: INSERT INTO tb_user (user_name, user_gender, user_age) VALUES (?, ?, ?);
DEBUG [main] - ==> Parameters: 唐三藏(String), 男(String), 5000(Integer)
DEBUG [main] - <== Updates: 1
返回受影响的行 : 1
说明:
对照上面insert标签属性表,id是命名空间的唯一标识符,parameterType指明该查询语句允许接收一个User类型的参数(其它的标签属性这里暂时未用到,但一定要熟悉于胸,后面会用到)。useGeneratedKeys表示使用自增策略(需要数据库支持,可以在mybatis配置文件打开全局开关),这里不用指明返回结果类型insert标签页没有这项属性,mybatis会根据JDBC自动返回受影响的行(只针对DML语言有限,即新增、修改和删除)。
那么有这么一个场景,我需要返回当前插入结果中的数据。mybatis也是提供了支持,就是用insert属性表描述中的keyProperty和keyColumn,需要useGeneratedKeys设置为true的支持。
mapper文件:
<insert keyProperty="userId" keyColumn="user_id" id="saveUser" parameterType="com.zepal.mybatis.domain.User" useGeneratedKeys="true">INSERT INTO tb_user (user_name, user_gender, user_age)VALUES(#{userName}, #{userGender}, #{userAge});</insert>
测试代码
public class MybatisTest {public static void main(String[] args) {InputStream is = MybatisTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();User user = new User();user.setUserName("黑山老妖");user.setUserGender("男");user.setUserAge(3000);int result = sqlSession.insert("com.zepal.mybatis.mapper.UserMapper.saveUser", user);System.out.println("返回受影响的行 : " + result);System.out.println(user.getUserId());sqlSession.commit();sqlSession.close();}
}
运行结果
DEBUG [main] - ==> Preparing: INSERT INTO tb_user (user_name, user_gender, user_age) VALUES (?, ?, ?);
DEBUG [main] - ==> Parameters: 黑山老妖(String), 男(String), 3000(Integer)
DEBUG [main] - <== Updates: 1
返回受影响的行 : 1
5
mapper只是多了两项属性keyProperty(持久层对象的属性)和keyColumn(表字段PS:在mybatis中,colum都是指向数据库、property指向持久层对象属性,例如resultMap)。在测试代码中打印userId。但是在新增之前,我并没有添加此属性,说明返回的userId就是当前新增数据生成的userId,并将其封装进传递的user对象中。
注意:keyProperty、keyColumn是支持多字段返回的,只需要用英文的逗号隔开即可,而且只持久层对象作为传递参数,比如说我上面传递的不是user,而是单个的属性(将name、gender、age作为单个参数传递),那么就造成了mybatis对返回的字段无处可放的尴尬地步。对于像oracle这种不支持自增长主键的,就需要用下面的方法来处理:
<insert id="insertAuthor"><selectKey keyProperty="userId" keyColumn="user_id" resultType="int" order="BEFORE">select SEQUENCE_TB_USER.nextval as user_id from tb_user;</selectKey>INSERT INTO tb_user (user_id,user_name, user_gender, user_age)VALUES(#{userId},#{userName}, #{userGender}, #{userAge});
</insert>
在上面的示例中,selectKey元素将会首先运行,其通过查询SEQUENCE序列,TB_USER的user_id会被设置,然后插入语句会被调用(当然,selectKey标签中还可以运行其他逻辑)。
selectKey 元素描述如下:
<selectKeykeyProperty="id"resultType="int"order="BEFORE"statementType="PREPARED">
属性描述:
属性 | 描述 |
---|---|
keyProperty | selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
keyColumn | 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表 |
resultType | 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。 |
order | 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。 |
与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型 |
测试UPDATE、DELETE
update和delete标签属性几乎和insert属性一样,所以就不一一罗列了。唯一不同的是,useGeneratedKeys、keyColumn、keyProperty对delete是无效的。
友情提示:在开发中,修改和删除记得带上条件,不然该跑路了。
update测试:
mapper文件(条件user_id在开发中当然是传递进来的,这里图方便就直接给了,另外一点就是因为mybatis提供了typeAliases的默认处理,所以string是识别的)
<update id="updateUser" parameterType="string">update tb_user set user_name = #{userName} where user_id = 1;</update>
测试代码:
public class MybatisTest {public static void main(String[] args) {InputStream is = MybatisTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();String userName = "玉皇大帝";int result = sqlSession.insert("com.zepal.mybatis.mapper.UserMapper.updateUser", userName);System.out.println("返回受影响的行 : " + result);sqlSession.commit();sqlSession.close();}
}
执行结果
DEBUG [main] - ==> Preparing: update tb_user set user_name = ? where user_id = 1;
DEBUG [main] - ==> Parameters: 玉皇大帝(String)
DEBUG [main] - <== Updates: 1
返回受影响的行 : 1
delete测试
mapper文件:
<delete id="deleteUserWithId" parameterType="int">delete from tb_user where user_id = #{userId};</delete>
测试代码
public class MybatisTest {public static void main(String[] args) {InputStream is = MybatisTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();Integer userId = 5;int result = sqlSession.delete("com.zepal.mybatis.mapper.UserMapper.deleteUserWithId", userId);System.out.println("返回受影响的行 : " + result);sqlSession.commit();sqlSession.close();}
}
执行结果
DEBUG [main] - ==> Preparing: delete from tb_user where user_id = ?;
DEBUG [main] - ==> Parameters: 5(Integer)
DEBUG [main] - <== Updates: 1
返回受影响的行 : 1
sql标签
这个元素可以被用来定义可重用的 SQL 代码段(即在sql标签中定义一段SQL语句,其它标签就可以引用这段在sql标签中定义的SQL语句),可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化. 比如:
<delete id="deleteUseriwthId" parameterType="int">delete from tb_user<include refid="deleteSql"><property name="id" value="userId"/></include></delete><sql id="deleteSql">where user_id = #{id};</sql>
解释:delete标签引用了sql标签中的SQL语句(通过sql标签的id属性标识),组合起来就是delete from tb_user where user_id = ?。SqlSession像delete标签传递一个userId参数,通过property标签,将参数命名为id传递给sql标签。
测试代码及运行结果
public class MybatisTest {public static void main(String[] args) {InputStream is = MybatisTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();Integer userId = 1;UserDao userDao = sqlSession.getMapper(UserDao.class);int result = userDao.deleteUseriwthId(userId);System.out.println("受影响的行 : " + result);sqlSession.commit();sqlSession.close();}
}
DEBUG [main] - ==> Preparing: delete from tb_user where user_id = ?;
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Updates: 1
受影响的行 : 1
改进
上面所有的示例中,SqlSession都是直接调用自身的方法进行操作数据库的,但是这样不仅不容易维护,而且每次进行CRUD操作都不够灵活(每次指定mapper标签都要全路径)。所以我们需要将其抽离出来。在第一篇中介绍SqlSessiong的时候,在其常用方法表中说明,Mybatis官方手册建议通过mapper接口的代理对象访问mybatis。
项目结构:
操作步骤:
新增一个代理对象的接口
public interface UserDao {int deleteUseriwthId(Integer userId);
}
在mapper文件中引入当前代理对象,即命名空间要以全路径指向dao层接口
<mapper namespace="com.zepal.mybatis.dao.UserDao">
mapper中的标签id指向dao层(即代理对象)接口的方法
<delete id="deleteUseriwthId" parameterType="int">delete from tb_user where user_id = #{userId};</delete>
测试代码和结果
public class MybatisTest {public static void main(String[] args) {InputStream is = MybatisTest.class.getResourceAsStream("/mybatis/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();Integer userId = 4;UserDao userDao = sqlSession.getMapper(UserDao.class);int result = userDao.deleteUseriwthId(userId);System.out.println("受影响的行 : " + result);sqlSession.commit();sqlSession.close();}
}
受影响的行 : 1
此篇完结
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 呵,女大学生上网搜索什么(保证好看得要命)
呵,女大学生上网搜索什么(保证好看得要命) (转) 如今的女生,无论是学化工的还是学哲学的,都要配台笔记本电脑,以示跟上时代。但是我有些疑惑,很多女生连WORD都不会用,她们的电脑到底用来干吗呢?前两天,因为帮MM扛箱子,我有幸潜入传说中的女生宿舍。MM很得意地请…...
2024/3/15 21:01:29 - python从零开始(下载&安装)
前言:我有很久没有编程了,几乎忘记了当年的感觉。不过我从来没有接触过python,也算是从零开始。正文:首先去官网:https://www.python.org/看到有2和3:官方的简短介绍是 “Python 2.x is legacy, Python 3.x is the present and future of the language” 和“ The 2.x …...
2024/3/17 11:33:58 - javascript 正则表达式格式化数字字符串
javascript 正则表达式格式化数字字符串javascript 正则表达式格式化数字字符串 /(?=(\d\d\d)+$)/g (?=exp) 表示在查找某个位置前向查找(向右)字符串 , 这个位置右边的字符串必须满足表达式exp exp: (\d\d\d)+$ 表示: 从字符串尾部开始,每3个数字为一个分组,这样的分…...
2024/3/15 21:01:27 - mybatis教程,这一篇就够了
https://blog.csdn.net/hellozpc/article/details/80878563#125resultMap_2012...
2024/3/15 21:01:27 - js 日期格式化工具类
js 日期格式化工具类// 对Date的扩展,将 Date 转化为指定格式的String // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) // 例子: // (new Date()).Format("yyyy-MM-d…...
2024/3/29 14:21:19 - 2018年39名最牛的女程序媛,第三名很多人都认识!
这些有着工程师背景的女性,她们负责许多大公司里的重要业务部门,创造着未来的尖端科技,或者在科技公司扮演者领导者的角色。尽管人们都说STEM(科学、技术、工程和数学,Science、 Technology、 Engineering、 and Mathematics ,简称STEM)领域缺少女性,但实际上,有一些非…...
2024/3/15 21:01:23 - 搭建与使用fastdfs分布式文件服务器
一、环境 系统:Centos7.3 fastdfs:到 https://github.com/happyfish100 下载,都下载最新的: fastdfs-master:下载地址:https://github.com/happyfish100/fastdfs.git libfastcommon-master:下载地址:https://github.com/happyfish100/libfastcommon.git fastdfs-nginx-…...
2024/3/26 14:36:12 - 一个女孩的就业之路(同济大学BBS上两年不沉的帖子)
http://luckybins.blog.51cto.com/786164/195030我是2005年毕业的,偶尔来这里看看,不常灌水。今天来随意写下一些,如果对各位有任何的帮助,是我衷心所愿。1。考研与就业:2004年的暑假,我和大多数人一样,艰难的抉择,究竟是考研还是找工作。凭良心说,如果我选择考研并不…...
2024/3/28 7:40:15 - Unity Movement AI (二)
感兴趣的可以下载下来 跑一下(是下载源代码,不是release )地址: https://github.com/SunGuangdong/unity-movement-ai 这个库有以下Movement AI : Arrive 抵达, Cohesion 凝聚, Collision Avoidance 碰撞避免, Evade 逃避, Flee 逃离, Follow Path 跟…...
2024/3/28 4:18:58 - JavaScript前台页面使用jsjava对后台传过来的日期进行格式化
在JavaScript中格式化日期还是一个很麻烦的事情,尤其是后台传过来的数据。今天介绍一个js的日起格式化工具jsjava。目前最新版为2.2,不过没有2.0好用,推荐使用2.0下载地址引用的js在下载的压缩包的src\jsjava\text里 分别是 Format.js DateFormat.js SimpleDateFormat.j…...
2024/3/28 3:05:14 - MyBatis教程系列(三)Spring整合Mybatis
MyBatis教程系列(三)Spring整合Mybatis...
2024/3/28 7:32:01 - 目录浏览(目录遍历)漏洞和任意文件读取/下载漏洞
目录目录浏览(目录遍历)漏洞任意文件读取/下载漏洞利用任意文件读取漏洞Getshell目录浏览(目录遍历)漏洞目录浏览漏洞是由于网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件...
2024/3/28 7:41:08 - js时间格式化函数
//时间格式化// 对Date的扩展,将 Date 转化为指定格式的String// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) Date.prototype.Format = function (fmt) { //author: meizz…...
2024/3/28 7:50:26 - MyBatis教程系列(七)MyBatis源码实现
MyBatis教程系列(七)MyBatis源码实现...
2024/3/15 21:01:20 - ]★☆谁是我们一生中最重要的人☆★
听说过一个故事:在美国的一所大学里,快下课时,教授对自己的学生们说:”我和大家做个游戏,谁愿意配合我一下?”一名女生走上台来. 教授说:”请在黑板上写下你难以割舍的20个人的名字.”女生照做了,她写了一连串自已邻居、朋友和亲人的名字。 教授说:“请你划掉一个这里面你…...
2024/3/28 13:10:06 - Typora 自定的主题
文章更新时间2018年12月11日最近一直挺喜欢用Typora这款软件写各种文档的,为什么?免费啊,还有就是真的好用,不像其他的那些Markdown软件要左右对照,Typroa界面真的很友好。前前后后用了大概有半年多了吧,而我呢,又是一个喜欢尝新的人。在用了段时间后,发现软件自带的主…...
2024/3/28 7:55:04 - JavaScript中Long型时间格式转标准格式
直切主题,场景:当使用ajax请求参数时,如果服务器是Date星,那么JS中得到的时间是Long型时间戳,这种格式直接显示给用户不妥,所以需要进行格式转换,当然,方法很多。我只介绍我使用的这种方法,仅供参考。1、我们需要扩展Date对象,增加一个自定义属性。Date.prototype.for…...
2024/3/28 9:16:51 - git获取Android指定版本的kernel内核
使用git获取Android源码的时候一般需要使用repo脚本,但是使用repo脚本得到的源码并不带kernel内核的,所以如果需要下载kernel内核还必须使用git手动下载。。。使用git的clone命令,把内核下载下来,到kernel文件夹 git clone git://android.git.kernel.org/kernel/common.git…...
2024/3/28 7:53:17 - MyBatis教程系列(六)MyBatis源码解读
MyBatis教程系列(六)MyBatis源码解读...
2024/3/28 16:30:05 - JS实现Sql语句格式化效果
我们知道,在编辑SQL语句的时候,可以通过各种客户端软件对SQL语句进行格式化,但是我们如果想通过前端来格式化SQL怎么办呢?这时我们可以借助sql-formatter.js插件来实现,效果如下所示:格式化前:格式化后:具体使用代码如下所示://获取格式化SQL var formatSql = sqlForm…...
2024/3/28 7:41:34
最新文章
- Intel Arc显卡安装Stable Diffusion
StableDiffusion是一种基于深度学习的文本到图像生成模型,于2022年发布。它主要用于根据文本描述生成详细图像,也可应用于其他任务,如内补绘制、外补绘制和在提示词指导下生成图像翻译。通过给定文本提示词,该模型会输出一张匹配提…...
2024/3/29 22:57:10 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - idea创建javaweb项目步骤超详细(2022最新版本)
目录 前言必读 一、新建文件 1.在idea里面点击文件-新建-项目 2.新建项目-更改名称为自己想要的项目名称-创建 3.右键自己建立的项目-添加框架支持(英文版是Add Framework Support...) 4.勾选Web应用程序-确定 5.建立成功界面 二、配置tomcat 6.…...
2024/3/29 20:32:18 - 数据结构——顺序表
大家好,我是小锋,今天我们进入顺序表的学习 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符…...
2024/3/28 7:06:50 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/3/29 18:08:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/3/29 18:08:34 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/3/29 2:45:46 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/3/29 16:26:39 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/3/29 5:19:52 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/3/29 18:08:00 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/3/29 11:11:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/3/29 1:13:26 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/3/29 8:28:16 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/3/29 7:41:19 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/3/29 18:07:15 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/3/29 9:57:23 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/3/29 0:49:46 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/3/29 18:06:57 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/3/29 17:27:19 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/3/29 18:06:36 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/3/29 18:06:22 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/3/28 18:26:34 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/3/29 18:06:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/3/28 20:09:10 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57