Mybatis学习笔记

注:因为本人第一次学习mybatis,这个文章只是想记录一下学习的总结笔记,如果理解有偏差欢迎指正,谢谢包含;

一、Mybatis概述

基本概念

百度百科:

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。

特点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-craV2pqt-1642738633051)(C:\Users\86185\Desktop\笔记\Mybatis\mybatis-logo.png)]

三层架构

一般一个bs项目通常分为三层:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)

MyBatis就是三层架构中的数据访问层所使用的框架;

学习Mybatis前先简单介绍一下这三部分:

三层的职责 :

  1. 界面层(表示层,视图层):主要功能是接受用户的数据,显示请求的处理结果。使用 web 页面和用户交互,手机 app 也就是表示层的,用户在 app 中操作,业务逻辑在服务器端处理。
  2. 业务逻辑层:接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。
  3. 数据访问层:与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库.

优点:

三层架构区分层次的目的是为了 “高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。

三层对应的包:

界面层: controller包 (servlet)

业务逻辑层: service 包(XXXService类)

数据访问层: dao包(XXXDao类)

三层中类的交互:
用户使用界面层–> 业务逻辑层—>数据访问层(持久层)–>数据库(mysql)

三层对应的处理框架:
界面层—servlet—springmvc(框架)
业务逻辑层—service类–spring(框架)
数据访问层—dao类–mybatis(框架)

简单了解了这三层架构,那么学习MyBatis过程中就更能清楚的知道到自己学的框架到底干什么,用在哪里了;

自我理解

Mybatis就是一个可以自定义Sql的持久层框架,提供了操作数据库的能力;它内置了 JDBC 操作,简化了数据库的访问流程,让我们只需要关心如何写好Sql语句即可;(可以简单理解为就是一个增强的JDBC)

JDBC回顾

简单回顾一下JDBC的主要五部操作:

// 1,注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2,获取链接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC", "用户", "密码");
// 3,获取数据操作对象
String sql = "sql语句";
preparedStatement = connection.prepareStatement(sql);
// 4,执行sql语句
resultSet = preparedStatement.executeQuery();
// 5,处理结果集
while (resultSet.next()) {// 对应操作
}

这五步只要你需要写sql语句操作数据库都需要写,所以很麻烦,于是我们又自定义了JDBC工具类:

/*JDBC工具类,简化JDBC编程
*/
public class DBUtil {/*** 工具类中的构造方法是私有的* 因为工具类中的方法都是静态的,直接通过类名去调即可。*/private DBUtil(){}/*** 静态代码块,类加载的时候执行* 把 注册驱动 程序的代码放在静态代码块中,避免多次获取连接对象时重复调用*/static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}// 获取连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC", "用户", "密码");}// 关闭方法public static void close(Connection connection, Statement statement, ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

这样大大减少了重复代码的出现,但是每次使用时依然不够精简,因为处理结果等操作依旧是重复的;

并且最不好的一点就是Sql语句和Java代码写在了一起,如果想要快速找到某个Sql语句的操作十分麻烦,而且不易管理;

所以为了解决这个问题,我们可以使用MyBatis来写出更简洁的代码来;

MyBatis解决的问题

减轻使用 JDBC 的复杂性,不用编写重复的创建 Connetion , Statement ;不用编写关闭资源代码; 可以直接使用 java 对象表示结果数据,让开发者专注 SQL 的处理,其他分心的工作由 MyBatis 代劳。

所以上面的JDBC的操作MyBatis都可以解决,而需要我们做的就是写好Sql语句配置好就可以了;

二、第一个MyBatis程序

前提条件

现在我已经在数据库中创建好了一个student表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nN1br5HY-1642738633052)(C:\Users\86185\Desktop\笔记\Mybatis\数据库表student.png)]
接下来的所有操作都是基于这张表进行;

准备工作

在Maven中添加对应版本的Mybatis依赖来导入jar包

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version>
</dependency>

最好把mysql的依赖也加上

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version>
</dependency>

在 < build >标签中加上以下内容:

<resources><resource><!--所在的目录--><directory>src/main/java</directory><!--包括目录下的.properties,.xml 文件都会扫描到--><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource>
</resources>

为什么需要这个呢?这是为了保证编译后对应的xml等配置文件也可以生成到对应的编译后的文件(target)位置,这样Mybatis才可以从中找到我们的配置;如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AThJsTQw-1642738633052)(C:\Users\86185\Desktop\笔记\Mybatis\resource标签的目的.png)]

项目结构

配置好了maven对应的pom.xml文件后,接下来就需要构建项目了,这里我先展示一下整体的结构,因为每一部分的内容都是固定的,所以一定要清楚每个位置应该放什么东西

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5Wt2ihP-1642738633053)(C:\Users\86185\Desktop\笔记\Mybatis\文件结构.png)]

可以看到我创建了一个Maven模块,创建了一个com.yang包,这个包下有三个包,下面分别介绍一下它们是干什么的

  • dao包:这个包是放接口和对应的Mapper.xml文件的,在这里mapper文件名必须和对应接口名相同;
  • domain包:这个包存放对应数据库表的一些类
  • utils包:顾名思义这是个工具包;

下面的resource包用来存放config.xml等一些配置文件;

test包就是一个测试用的包;

记住这些结构,它们其实都是固定的,后面我会一一说;

domain包

这个包中的类对应数据库的每一个表,后期可以通过Mybatis来执行sql获取对应表类型的数据;

因为我只有一个student表,所以需要一个Student类,这个类的属性需要和student表的每一个字段类型相匹配,并且建议最好属性名和student表的属性名相同,不然后期会多几步操作(后面会讲)

public class Student {private int id;private String name;private String email;private int age;public Student() {}public Student(int id, String name, String email, int age) {this.id = id;this.name = name;this.email = email;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", email='" + email + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Student)) return false;Student student = (Student) o;return id == student.id && age == student.age && Objects.equals(name, student.name) && Objects.equals(email, student.email);}@Overridepublic int hashCode() {return Objects.hash(id, name, email, age);}
}

这里需要注意:一定要把get和set方法加上,因为mybatis的实现设计到动态代理的内容,这里就不过多阐述了,但是这些细节一定要记住;

这里我重写了toString等方法,就是为了测试方便;

dao包

这个包放的是一些接口,这些接口的作用就是来写sql操作的;同样一个接口对应一个表

StudentDao接口:

package com.yang.dao;import com.yang.domain.Student;public interface StudentDao {// 查询方法List<Student> selectStudent(); // 查询结构返回一个Student的list集合
}

通俗点说就是:一个接口对应一个表的sql操作,接口中的一个方法对应执行一条sql语句;

这个包下同样还有mapper.xml文件,这个文件是用来定位接口中的对应方法,来写sql语句的,并且一个类型的接口对应一个mapper.xml文件

注意mapper.xml文件要和对应的接口名相同

StudentDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
结论:上面是固定格式,直接复制粘贴就可以;
sql映射文件:写sql语句,mybatis会执行;
mybatis-3-mapper.dtd是约束文件名称;
约束文件作用:限制、检查在当前文件中出现的标签、属性是否符合mybatis规范;
--><!--
mapper是当前文件的根标签;
namespace:命名标签,唯一值,可以是自定义的字符串,
但是这里要求使用dao接口的全限名称
-->
<mapper namespace="com.yang.dao.StudentDao"><!--mapper内部可以通过以下标签表示数据库的操作:<select>:查询<update>:更新<insert>:插入(新增)<delete>:删除--><!--查询语句id:执行sql语法的唯一标识,mybatis会通过这个id找到要执行的sql语句,但是要写成对应dao接口的 方法名(动态代理的要求)resultType:表示结果类型,是sql执行后得到的ResultSet遍历得到的Java对象类型;值为该类型的权限名称--><select id="selectStudent" resultType="com.yang.domain.Student">select * from student order by id</select>
</mapper>

这个文件的结构解释都写在注释中了,除了select标签其余部分就是一个固定格式,直接用就行;

现在再理一下为什么这个包要放接口和mapper.xml文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHHnXpV5-1642738633053)(C:\Users\86185\Desktop\笔记\Mybatis\Dao文件夹中各个部分对应关系.png)]

因为这里就有一个student表,如果想要对该表进行数据操作,就需要一个StudentDao接口

对表进行一个操作(增删改查)就要在接口中写一个抽象方法(操作名)

想要写StudentDao接口中对应操作的sql语句就需要一个和接口同名的mapper.xml文件:StudentDao.xml

最后在StudentDao.xml中写StudentDao接口中的抽象方法的sql语句(查询 、更新、新增、删除)

因为这一块不好描述清楚,所以我只能按照我的理解来描述,可能会有人疑惑为什么必须要写个StudentDao接口?写成抽象类不行吗?为什么id什么的必须相对应?这就涉及到了mybatis的底层实现了,这是动态代理所要求的,必须写接口,必须这样写,实在疑惑的话可以看看代理模式的相关内容,你就会明白为什么了;

补充:dao接口中的方法不能重载,一旦出现重名的操作后Mybatis就无法判断执行哪一个了;

resource包

先跳过utils包,先说说resource包;

这个包下也有一个很重要的xml文件:config.xml

这个文件是 MyBatis 主配置文件,在dao包中的所有mapper.xml文件都整合到该文件中,且该文件中配置对应的数据库信息;

实际开发可能会有多个数据库,所以最好把每个数据库信息单独写在一个properties文件中,由config.xml文件读取;

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC
jdbc.username=用户
jdbc.password=密码
jdbc.driver.online=com.mysql.cj.jdbc.Driver
jdbc.url.online=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC
jdbc.username.online=用户
jdbc.password.online=密码

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--设置jdbc连接信息的配置文件jdbc.properties路径(该声明必须放在上面)--><properties resource="jdbc.properties" /><!--settings:控制mybatis全局行为--><settings><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING" /></settings><!--环境配置: 数据库的连接信息default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库--><environments default="mydev"><!-- environment : 一个数据库信息的配置, 环境id:一个唯一值,自定义,表示环境的名称。--><environment id="mydev"><!--transactionManager :mybatis的事务类型type: JDBC(表示使用jdbc中的Connection对象的commit,rollback做事务处理)--><transactionManager type="JDBC"/><!--dataSource:表示数据源,连接数据库的type:表示数据源的类型, POOLED表示使用连接池--><dataSource type="POOLED"><!--driver, user, username, password 是固定的,不能自定义。--><!--数据库的驱动类名--><property name="driver" value="${jdbc.driver}"/><!--连接数据库的url字符串--><property name="url" value="${jdbc.url}"/><!--访问数据库的用户名--><property name="username" value="${jdbc.username}"/><!--密码--><property name="password" value="${jdbc.password}"/></dataSource></environment><!--下面这个environment标签内的内容是为了和上面对比写的,在这个例子中不需要的--><!--表示线上的数据库,是项目真实使用的库--><environment id="online"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver.online}"/><property name="url" value="${jdbc.url.online}"/><property name="username" value="${jdbc.username.online}"/><property name="password" value="${jdbc.password.online}"/></dataSource></environment></environments><!-- sql mapper(sql映射文件)的位置--><mappers><!--一个mapper标签指定一个文件的位置。从类路径开始的路径信息。  target/clasess(类路径)--><mapper resource="com/yang/dao/StudentDao.xml"/></mappers>
</configuration>
<!--mybatis的主配置文件: 主要定义了数据库的配置信息, sql映射文件的位置1. 约束文件<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">mybatis-3-config.dtd:约束文件的名称2. configuration 根标签。
-->

mapper标签就是对应的dao包中的StudentDao.xml文件,dao包中有几个xml文件就写几个mapper标签;

设置输出日志

其中有一段代码:

<settings><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

这样在测试时可以输出日志信息,好处就是如果出现了错误可以从日志中很快的找出来;所以建议加上

设置properties文件

这里还要说一点,在xml文件中引入properties文件的操作中,首先要加一个:

<!--设置jdbc连接信息的配置文件jdbc.properties路径(该声明必须放在上面)-->
<properties resource="文件名.properties" />
<!--properties文件和xml文件要放在一起-->

然后在下面调用properties文件内容的时候value就是这样写:

value="${key值}"

记住就行;

小测试

做完这些就可以写一个测试代码测试了,我们写好了sql语句,只需要执行sql语句对应的StudentDao中的方法就可以了;

测试代码:

@Test
public void selectStudent() throws IOException {// 访问mybatis读取student数据// 1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess)String config = "mybatis.xml";// 2.读取这个config表示的文件InputStream in = Resources.getResourceAsStream(config);// 3.创建了SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 4.创建SqlSessionFactory对象,build()方法SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);// 5.获取SqlSession对象,从SqlSessionFactory中获取SqlSessionSqlSession session = sqlSessionFactory.openSession();// 6.使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)// getMapper能获取dao接口对于的实现类对象StudentDao studentDao = session.getMapper(StudentDao.class);// 7.执行sql语句(其实执行的是sql语句对应的方法)List<Student> students = studentDao.selectStudent();// 8.输出结果students.forEach(stu -> System.out.println(stu)); // Lambda表达式(直接遍历也行)// 9.关闭SqlSession对象session.close();
}

输出结果:

Student{id=1001, name='张三', email='zhangsan@123.com', age=18}
Student{id=1002, name='李四', email='lisi@123.com', age=28}
Student{id=1003, name='王五', email='wangwu@123.com', age=38}
Student{id=1006, name='小六', email='xiaoliu@123.com', age=66}
Student{id=1007, name='小七', email='xiaoqi@123.com', age=77}
Student{id=1008, name='小八', email='xiaoba@123.com', age=88}
Student{id=1009, name='九小', email='jiuxiao@123.com', age=99}

看到执行步骤这么多,是不是感觉还不如JDBC的那几句代码呢?

当实际开发中查询量大时使用这种方法还是方便的,毕竟还是省去好多代码并且对于sql语句的管理也更方便了;

简单介绍一下用到的几个方法:

Resources 类

Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象;

SqlSessionFactoryBuilder 类

SqlSessionFactory 的创建 ,需要使用 SqlSessionFactoryBuilder 对象的build()方法 ;由于 SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁;所以,一般会将该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁;

SqlSessionFactory 接口

SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可(不要多次重复创建);创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法;

openSession(true):创建一个有自动提交功能的 SqlSession

openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交

openSession():同 openSession(false)

SqlSession 接口

SqlSession 接口对象用于执行持久化操作;一个 SqlSession 对应着一次数据库会话,一次会话以 SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束; SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将 其关闭;再次需要会话,再次创建;SqlSession 在方法内部创建,使用完毕后关闭;

SqlSession 的 getMapper(Class class)方法,可获取指定接口的实现类对象。该方法的参数为指定 Dao 接口类的 Class 值;

虽然说Mybatis帮我们省去了大部分步骤,但是每次都需要写这几句代码也是有点麻烦,不如直接把它们封装成一个工具类;

utils包

终于就剩最后一个包了,我们在这个包中来声明各种工具类,为了简化Mybatis执行代码步骤,我们封装一个MybatisUtil工具类;

MybatisUtil.java

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;// 工具类,返回一个SqlSession对象
public abstract class MybatisUtil {private static SqlSessionFactory sqlSessionFactory = null;static {String config = "mybatis.xml";try {InputStream in = Resources.getResourceAsStream(config);// 创建SqlSessionFactory对象,且只创建一次,因为它开销大,将用于整个应用,// 放在静态代码块中只在类初始化中创建一次sqlSessionFactory =  new SqlSessionFactoryBuilder().build(in);} catch (IOException e) {e.printStackTrace();}}// 获取SqlSession对象public static SqlSession getSqlSession() {SqlSession sqlSession  = null;if(sqlSessionFactory != null){sqlSession = sqlSessionFactory.openSession();// 非自动提交事务}return sqlSession;}
}

这样通过这个工具类就可以获取到SqlSession对象了;工具类写成抽象类也是为了防止使用工具类创建对象

再来个小测试:

@Test
public void selectStudent() {// 直接获取到SqlSession对象SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);List<Student> students = studentDao.selectStudent();students.forEach(stu -> System.out.println(stu));session.close();
}

这样步骤就减少了很多了,多次执行sql语句时就不需要那么多步骤了;

补充

设置自动提交事务

因为这个例子是select查找语句,直接查找就可以了;但是如果是update、delete、insert的话就涉及事务的问题,在默认情况下事务提交是关闭的,所以在执行sql语句后想要在数据库中增添数据就要手动提交,就是多了一行代码,当执行完sql语句,在下面直接调用SqlSession对象的commit()即可;

注:这里省略前面的一些代码,主要想展示一下如何提交数据;

插入insert语句的测试:

@Test
public void insertStudent() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);int num = studentDao.insertStudent(new Student(1010, "小石" , "xiaoshi@123.com", 10));session.commit(); // 手动提交事务,就是想说的这一点session.close();System.out.println("新增了" + num + "条数据");
}

输出结果(包括日志内容):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILI7jqwz-1642738633054)(C:\Users\86185\Desktop\笔记\Mybatis\commit设置自动提交.png)]


如果想要开始就设置自动提交事务呢?

这就需要改动MybatisUtil.java工具类,也就是改一处即可:

sqlSession = sqlSessionFactory.openSession(true); // 自动提交事务

SqlSessionFactory 的 openSession() 方法分为有参数和无参数的,无参数默认就是关闭事务提交的,而有参数的将参数设置为true就开启事务自动提交了;

在测试代码中就不再需要写session.commit() 手动提交事务了;

输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YdGwWW3d-1642738633054)(C:\Users\86185\Desktop\笔记\Mybatis\设置自动事务提交输出结果.png)]

package 一次配置所有mapper.xml

如果存在多个表时,dao包下就会有多个mapper.xml文件,那么主配置文件config.xml配置起来就很麻烦,这时我们可以使用package指定dao包下的所有mapper文件,一次就完成了所有mapper文件的配置;

语法: <package name=“对应包的路径”>

示例:

mybatis.xml

<!-- sql mapper(sql映射文件)的位置-->
<mappers>  <!--<mapper resource="com/yang/dao/StudentDao.xml"/>--><!--用package代替mapper,表示dao包下的所有mapper.xml文件--><package name="com.yang.dao"/>
</mappers>

注意:该方法要求 Dao 接口名称和 mapper 映射文件名称相同,且在同一个目录中;

三、MyBatis 传递参数

如果我们想要实现输入数据执行查询到结果,又或者输入一些数据实现在数据库的新增…这种情况下sql语句就不能写死,如何把传入java代码中的参数传给sql语句呢?下面就简单描述一下方法;

一个参数

当传入的是一个参数时,直接传给sql语句即可,注意sql语句中传入的变量为:#{参数名}

StudentDao.java

public interface StudentDao {// 查询方法,从数据库中通过id查找对应学生Student selectStudent03(int id); // 一个参数查询,返回值是Student类型
}

mapper文件:

StudentDao.xml

<?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.yang.dao.StudentDao"><!--一个参数,#{id}就是传入的参数--><select id="selectStudent03" resultType="com.yang.domain.Student">select * from student where id = #{id}</select>
</mapper>

config文件:

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--设置jdbc连接信息的配置文件jdbc.properties路径(该声明必须放在上面)--><properties resource="jdbc.properties" /><!--settings:控制mybatis全局行为--><settings><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><environments default="test"><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--数据库的驱动类名--><property name="driver" value="${jdbc.driver}"/><!--连接数据库的url字符串--><property name="url" value="${jdbc.url}"/><!--访问数据库的用户名--><property name="username" value="${jdbc.username}"/><!--密码--><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- sql mapper(sql映射文件)的位置--><mappers><mapper resource="com/yang/dao/StudentDao.xml"/></mappers>
</configuration>

jdbc.properties略;

测试代码:

@Test 
public void selectStudent07() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);Student student = studentDao.selectStudent03(1003); // 从数据库中查找id为1003的学生session.close();System.out.println(student);
}

输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9E2xlU3-1642738633055)(C:\Users\86185\Desktop\笔记\Mybatis\传入一个参数输出结果.png)]

通过输出结果以及打印的日志信息可以看到整个sql语句的执行过程;

传递多参数

传递多参数就麻烦一些了,但是并不难,因为这篇文章我已经写过了,直接开个传送门过去吧

传送门

#和$

在参数传递时经常看到 ‘ # ’ 符号,其实还有一个 ‘ $ ’ 符号,下面来对比一下这两种符号代表的意思;

#:占位符,告诉 mybatis 使用实际的参数值代替;并使用 PrepareStatement 对象执行 sql 语句, #{…} 代替 sql 语句的占位符“?”。这样做更安全(可以防止sql注入),更迅速,通常也是首选做法

$:字符串替换,告诉 mybatis 使用 $ 包含的“字符串”替换所在位置;使用 Statement 把 sql 语句${…}的 内容连接起来(就是字符串拼接,直接把sql语句和传入的内容拼起来)。主要用在替换表名,列名,不同列排序等操作;但是Statement存在Sql注入问题,所以一般不建议使用;(并不是没用,分页查询还是用得到的)


#和$的区别:

  1. #使用 ’ ? ’ 在sql语句中做占位符, 使用PreparedStatement执行sql,效率高
  2. #能够避免sql注入,更安全。
  3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
  4. $有sql注入的风险,缺乏安全性。
  5. $:可以替换表名或者列名

四、属性名和字段名不同解决方法

resultMap

前面我说过尽可能保证domain包下的Student类的属性名和student表中的字段名相同,但是在实际开发中总会存在例外,如果出现了属性名和字段名不同的情况,同样也有解决办法,就是使用resultMap元素

resultMap 可以自定义 sql 的结果java 对象属性的映射关系,更灵活的把列值赋值给指定属性;常用在列名和 java 对象属性名不一样的情况

使用方式:

1.先定义 resultMap,指定列名和属性的对应关系;

2.在中把 resultType 替换为 resultMap;

代码演示

将domain中的Student类的属性稍作修改:

public class Student {// 这次的属性名和表的字段名不同private int myId;private String myName;private String myEmail;private int myAge;// 下面还是相同的一系列get、set操作,就不写了
}

mapper.xml文件:

StudentDoa.xml

<?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.yang.dao.StudentDao"><!--当数据库表的列名和java程序的属性名 不一样 时记住要用resultMap,id值就是整个resultMap的自定义的值,用来和下面的查询语句匹配的type就是resultMap匹配的类型--><resultMap id="studentMap" type="com.yang.domain.Student"><!--column: 是数据库中表的列名 property:在这里就是Student类中的属性名--><!-- 主键字段使用 id标签 --><id column="id" property="myId" /><!--非主键字段使用 result标签--><result column="name" property="myName" /><result column="email" property="myEmail" /><result column="age" property="myAge" /></resultMap><!--select标签中的 resultMap="studentMap"就是对应id的resultMap--><select id="selectStudent02" resultMap="studentMap">select * from student where id > #{myId}</select>
</mapper>

其他剩余操作就不演示了,和前面都一样,这里主要想强调的还是 <resultMap> 标签,通过它来把不同的属性名和字段名联系起来;

resultType

说到resultMap了也顺带聊聊resultType,其实上面第一个示例也介绍过了,这里再提一下;

resultType: 执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名; 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身;

要注意resultType 和 resultMap不能同时使用;

五、Like模糊查询

因为sql中的like模糊查询需要加 ‘ %’ 号,所以就在这里说一下两种实现:

  1. 在mapper文件的sql语句中写 ‘ %’ 号
  2. 在java代码中传入一个带 ‘ %’ 号的字符串给sql语句

下面简单演示一下:

在sql语句中写 ‘ %’ 号

StudentDao.java

List<Student> selectStudentByLike(@Param("likeName") String name); // Like测试

StudentDao.xml

<?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.yang.dao.StudentDao"><!--在sql语句中写%--><select id="selectStudentByLike" resultType="com.yang.domain.Student">select * from student where name like %#{likeName}%</select>
</mapper>

测试代码:

@Test
public void selectStudent03() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);// like模糊查询,传入查询内容List<Student> students = studentDao.selectStudentByLike("小");session.close();students.forEach(stu -> System.out.println(stu));
}

这种方法其实并不建议,因为模糊查询可以分为三种查询方式:%内容、%内容%、内容%

所以这样写你就无法自己想怎么差就怎么查了,想换种查询方法还得修改sql语句;所以不建议使用该方法

java代码传入“%查询内容%”

这种方法的灵活度就高了,因为java代码传入的就是查询方式和内容,下面演示一下:

StudentDao.java

List<Student> selectStudentByLike(@Param("likeName") String name); // Like测试

StudentDao.xml

<?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.yang.dao.StudentDao"><!--sql语句直接传一个字符串--><select id="selectStudentByLike" resultType="com.yang.domain.Student">select * from student where name like #{likeName}</select>
</mapper>

测试代码:

@Test
public void selectStudent03() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);// like模糊查询,直接传入拼接的字符串,这样的灵活度更高List<Student> students = studentDao.selectStudentByLike("%小%"); session.close();students.forEach(stu -> System.out.println(stu));
}

使用这种方法就可以了,上面第一种方法了解一下就行;

六、动态 SQL

官方定义

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

下面介绍四个常用的标签:

  • if
  • where
  • set
  • foreach

<if>标签

语法: <if test=“条件”> sql 语句 <if>

规则: 如果test中的条件为true时,才会把 if 标签中的sql语句拼接到前面的sql语句上;

使用示例:

StudendDao.java

List<Student> selectStudentIf(Student student); // If标签

StudentDao.xml

<!--if标签-->
<select id="selectStudentIf" resultType="com.yang.domain.Student">select * from student where id > 0<if test="name != null and name != '' ">and id > #{id}</if><if test="age >= 0">and age > #{age}</if>
</select>

简单解释一下,如果"name != null and name != ''成立,那么sql语句就是:select * from student where id > 0 and id > #{id}

如果age >= 0也成立,sql语句为:select * from student where id > 0 and id > #{id} and age > #{age}

如果只有age >= 0成立,那么sql语句为:select * from student where id > 0 and age > #{age}

就是满足条件就拼接,不满足就不管;

测试代码:

@Test
public void selectStudent04() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);List<Student> students = studentDao.selectStudentIf(new Student(1006, "小六" , "xiaoliu@123.com", 66));session.close();students.forEach(stu -> System.out.println(stu));
}

输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWr4XAOo-1642738633055)(C:\Users\86185\Desktop\笔记\Mybatis\if标签输出.png)]
可以看到if标签中所有条件都满足,所以都拼接上了;

<where>标签

if 标签存在一个问题:你可以发现在上面的 if 标签例子中,where语句后面开始就加了一个 id>0,为什么呢?假设没有这段sql语句,那么开始时我的sql语句就是:select * from student where;第一个条件满足还好说,拼接后就是:select * from student where id > #{id},那么如果第一个条件不满足第二个条件满足呢?拼接后就成了:select * from student where and age > #{age} ,你就会发现这个sql语句是错误的,where后面怎么能直接跟一个and;如果两个条件都不满足那么sql语句不就成了:select * from student where这样了吗?

这样就会造成sql语法的错误,所以我在前面加上了一个不论何时都满足的条件:id>0

但是这并不是最优方法,如果查询数据量大时这样很影响效率,这个时候where标签就可以解决这个问题;


where标签语法: <where> 其他动态 sql语句(比如if语句) </where>

规则: where 标签只会在子标签返回任何内容的情况下才插入 “WHERE” 子句;而且,若子句的开头为 “AND” 或 “OR”,where 标签也会将它们去除;

使用示例:

StudendDao.java

List<Student> selectStudentWhere(Student student); // Where标签

StudentDao.xml

<!--where标签-->
<select id="selectStudentWhere" resultType="com.yang.domain.Student">select * from student<where><if test="name != null and name != '' ">id > #{id}</if><if test="age >= 0">and age > #{age}</if></where>
</select>

和if标签都一个意思,但是这里sql语句中的where就不用我们自己写了,如果where标签中有满足条件的就拼接上,都不满足where语句就不会存在;

测试代码:

@Test
public void selectStudent05() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);List<Student> students = studentDao.selectStudentWhere(new Student(1006, "小六" , "xiaoliu@123.com", 66));session.close();students.forEach(stu -> System.out.println(stu));
}

输出结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZzY1sco-1642738633056)(C:\Users\86185\Desktop\笔记\Mybatis\where标签输出.png)]
对于where标签和if标签的选择应该根据实际情况,知道用法灵活变通;

<set>标签

set标签和where标签作用差不多,但是set标签就会用在update语句中,set 标签可以用于动态包含需要更新的列,忽略其它不更新的列;

语法:<set>动态sql语句</set>

规则: set标签也是只有子标签返回任何内容时才拼接,就是和where标签使用的位置不同罢了;(但是并不意味着update不能使用where标签了)

使用示例:

StudendDao.java

int updateStudent02(Student student); // set标签

StudentDao.xml

<!--set标签专门用于更新语句的,和where标签的作用相似,只是使用位置不同-->
<update id="updateStudent02">update student<set><if test="id != null">id = #{id},</if><if test="name != null">name = #{name},</if><if test="email != null">email = #{email},</if><if test="age != null">age = #{age}</if></set>where id = #{id}
</update>

测试代码:

@Test
public void updateStudent02() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);int num = studentDao.updateStudent02(new Student(1009, "小九" , "xiaojiu@123.com", 9));session.commit(); // 提交事务(默认是关闭的,所以需要手动提交)session.close();System.out.println("更新了" + num + "条数据");
}

输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tixe9Cwh-1642738633056)(C:\Users\86185\Desktop\笔记\Mybatis\set标签输出.png)]

<foreach>标签

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候),这时候就可以使用foreach标签;

语法:

<foreach collection=“集合类型” item=“集合中的成员” open=“开始字符” close=“结束字符” separator=“集合成员间的分隔符”>

#{item值}

</foreach>

规则: 可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach;当使用 Map 对象(或者 Map.Entry 对象的集合)时,需要在foreach中额外加一个index属性,index 是键,item 是值;

使用示例:

StudendDao.java

List<Student> selectStudentFor(List<Student> student); // foreach标签

StudentDao.xml

<!--foreach标签-->
<!--
当存在一个集合时查找该集合元素可以使用
collection:所要查找的集合类型
item:对应方法中形参的名字(即接口中方法形参名:List<Student> student)
open:循环开始前家的东西
close:循环结束后加的东西
separator:集合中每一个元素的分隔符
-->
<!--注意这里sql语句后面使用了in()-->
<select id="selectStudentFor" resultType="com.yang.domain.Student">select * from student where id in<foreach collection="list" item="student" open="(" close=")" separator=",">#{student.id}</foreach>
</select>

其实这个sql语句可以简单抽象成这样:

select * from student where id in (#{student.id}
)
<!--因为student是一个list集合,所以通过for循环每次从中遍历id值,每生成一个id后面再加一个分隔符‘,’-->

所以最后sql语句可以拼接成:select * from student where id in (student.id01, student.id02, student.id03.....)

测试代码:

@Test
public void selectStudent06() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);List<Student> student = new ArrayList<>();student.add(new Student(1006, "小六" , "xiaoliu@123.com", 66));student.add(new Student(1007, "小七" , "xiaoqi@123.com", 77));student.add(new Student(1009, "小九" , "xiaojiu@123.com", 9));List<Student> students = studentDao.selectStudentFor(student);session.close();students.forEach(stu -> System.out.println(stu));
}

输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSGSlFtk-1642738633056)(C:\Users\86185\Desktop\笔记\Mybatis\foreach标签输出.png)]
array、set集合和list都是一样的,map就多了一个index属性这一点区别,这里就不示范了;

七、小拓展

使用PageHelper实现分页功能

项目开发中分页功能几乎是每次都会出现的,一般我们会通过limit进行操作:

select * from 表名 limit (pageNum - 1)*pageSize, pageSize

pageNum是当前的页数,pageSize是每页显示的记录条数,这个公式可以自己找找规律推导一下;

但是这只是关键步骤,实际情况下还是很麻烦,所以就有牛人写了一个mybatis分页插件,PageHelper;

这个插件在GitHub上可以搜到:传送门

引入jar包

可以直接使用Maven依赖来引入jar包:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>最新版本</version>
</dependency>

添加plugin 配置

在config.xml文件中还需要添加额外的配置,需要加到<environments>标签之前;

mybatis.xml

<!--添加PageHelper的配置-->
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>

配置文件

mapper文件:

StudentDao.xml

<?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.yang.dao.StudentDao"><select id="selectStudent" resultType="com.yang.domain.Student">select * from student</select>
</mapper>

config文件

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--配置properties文件--><properties resource="jdbc.properties"/><!--settings:控制mybatis全局行为--><settings><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--添加PageHelper的配置--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor" /></plugins><environments default="test"><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--数据库的驱动类名--><property name="driver" value="${jdbc.driver}"/><!--连接数据库的url字符串--><property name="url" value="${jdbc.url}"/><!--访问数据库的用户名--><property name="username" value="${jdbc.username}"/><!--密码--><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- sql mapper(sql映射文件)的位置--><mappers>
<!--        <mapper resource="com/yang/dao/StudentDao.xml"/>--><!--用package代替mapper,表示dao包下的所有mapper.xml文件--><package name="com.yang.dao"/></mappers>
</configuration>

数据库配置文件:

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_learning?serverTimezone=UTC
jdbc.username=root
jdbc.password=020216

查询测试

完成基本的配置后,实现分页查询只需要在需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage() 静态方法即可,紧跟在这个方法后的第一个 MyBatis 查询方法会被进行分页;

测试代码:

@Test
public void selectTest01() {SqlSession session = MybatisUtil.getSqlSession();StudentDao studentDao = session.getMapper(StudentDao.class);// pageNum:第几页(从1开始)// pageSize:页几行数据// 表示第一页,一页三行数据PageHelper.startPage(1, 3); // 在执行下面的查询方法selectStudent()之前调用List<Student> list = studentDao.selectStudent();list.forEach(stu-> System.out.println(stu));
}

输出结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XToh1PFr-1642738633057)(C:\Users\86185\Desktop\笔记\Mybatis\PageHelper.png)]
这就输出了第一页的三行内容,如果想看第二页的内容,稍改代码:

PageHelper.startPage(2, 3); // 第二页的三行数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q9vRJIR3-1642738633057)(C:\Users\86185\Desktop\笔记\Mybatis\PageHelper第二页输出.png)]
非常方便简单;并且PageHelper支持多种数据库,绝对够用的;

八、总结

第一次接触框架,配置挺多的,也不知道理解有没有偏差,或者语言描述有问题,如果内容哪里有问题也欢迎指正!

这个笔记只是记录了一些比较重要的部分,Mybatis并不是仅仅这些内容,后期如果遇到新的内容会再补充上去;

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 客户要求200块钱做个百度?某程序员10行代码完美解决(10行代码系列)

    前言 &#x1f680; 作者 &#xff1a;“程序员梨子” &#x1f680; **文章简介 **&#xff1a;本篇文章主要调用百度接口实现一键搜索内容。 &#x1f680; **文章源码获取 **&#xff1a; 为了感谢每一个关注我的小可爱&#x1f493;每篇文章的项目源码都是无偿分 享滴&…...

    2024/5/6 19:28:09
  2. React 创建组件方式(类式组件,函数式组件,生命周期)

    创建组件的两种方式 1. 函数式组件 react中的函数组件通常只考虑负责UI的渲染&#xff0c;没有自身的状态没有业务逻辑代码&#xff0c;没有生命周期&#xff0c;只是一个纯函数。下面这个函数组件就是一个纯函数&#xff0c;它的输出只由参数props决定&#xff0c;不受其他任…...

    2024/4/20 2:09:04
  3. kinetic安装cartographer及gazebo仿真测试教程[22年1月23日测试]

    kinetic安装测试cartographer教程 [2022/1/23]本实验环境为ubuntu16.04[ROS]kinetic1.12.17 参考链接&#xff1a;https://blog.csdn.net/qq_45839415/article/details/120444971 文章目录kinetic安装测试cartographer教程[toc]一、考虑后期有编译自己的代码的需求的安装方法…...

    2024/4/14 8:22:11
  4. 2022.1.23

    新版不能发布文章&#xff0c;用老版本试一试。...

    2024/4/14 8:21:56
  5. 【C++】构造函数和析构函数

    构造&析构构造函数 Constructor析构函数 Destructor构造函数 Constructor 也叫构造器&#xff0c;再对象创建的时候自动调用&#xff0c;一般用于完成对象的初始化工作。 struct Person {int m_age;Person() {m_age 0;cout << "Person()" << endl…...

    2024/4/14 8:22:32
  6. Web安全学习Week3

    这周主要学了PHP&#xff0c;MySQL&#xff0c;SQL 学的时候才发现MAC OS12以及把PHP删了 在网上找半天对的老教程 找到了才发现已经删了PHP 又去下PHP也花了好多时间 直接劝退我 好在顶过来了 PHP PHP语法 PHP脚本在服务器上执行&#xff0c;然后将纯HTML结果发送回浏览…...

    2024/5/6 19:50:07
  7. 07:最短路径

    原题链接&#xff1a;OpenJudge - 07:Shortest Path 描述&#xff1a;某图像上共有N个节点&#xff0c;现给出每两节点之间的边的长度&#xff0c;求出从S点到E点间的最小距离。 输入&#xff1a;第一行&#xff1a;共三个正整数N( N < 100) , S( S < N ) , E( E < …...

    2024/4/14 8:22:42
  8. 把自己当作品牌来经营

    在生活或工作中&#xff0c;要获得亲朋好友&#xff0c;上司同事和部属的认可就要树立良好的个人品牌&#xff0c;要让自己每天必须做好四讲&#xff1a;讲诚信、讲品格、讲礼貌、讲实话。 每个人都应该把自己当作品牌来经营&#xff0c;你的每一次亮相、说过的每一句话、做过…...

    2024/5/6 19:54:53
  9. 贝莱德赞助商挑战赛

    黑客剑桥地图集2022&#xff1a;贝莱德赞助商挑战赛 挑战描述。 在贝莱德&#xff0c;我们的目标是利用技术为我们的客户创造更好的金融未来。作为这一目标的一部分 作为这一目标的一部分&#xff0c;我们越来越关注可持续发展&#xff0c;并相信可持续投资能够为投资者带来更好…...

    2024/5/6 19:32:59
  10. 黑客马拉松

    活动指南V2.0 1 目录 ⬡ 介绍 ⬡ 2 ⬡ 主题 ⬡ 3 ⬡ Covid预防措施&#xff08;当面&#xff09; ⬡ 4 入场须知 4 登记 4 离开和重新进入会场 5 口罩的佩戴 5 手部消毒剂和垃圾袋 6 座位安排 6 Covid-19的症状和紧急情况 6 展览和项目演示 6 ⬡ 平台和资源 ⬡ 8 活动门户网站。…...

    2024/4/16 2:10:47
  11. 【联盛德W806上手笔记】六、7816/UART 控制器

    目录7816/UART 控制器串口功能7816 接口功能下载口库函数函数参数宏Demo中的测试程序main.cwm_hal_msp.cwm_it.cfifo.cfifo.hWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 7816/UART 控制器 设备端…...

    2024/4/16 4:07:34
  12. 06:N皇后

    原题链接&#xff1a;OpenJudge - 06:N Queens 描述&#xff1a;决定放置N个皇后的列&#xff0c;列的数量应大于1小于N&#xff0c;每个列应各不相同&#xff0c;每个列加上或减去各自的指数后也应各不相同。 输入&#xff1a;一个正整数N&#xff08;N < 200&#xff09…...

    2024/4/14 8:23:02
  13. 第13章:直方图处理

    第13章&#xff1a;直方图处理一、直方图的含义&#xff1a;1. 普通直方图&#xff1a;2. 归一化直方图&#xff1a;二、绘制直方图&#xff1a;1. 使用Numpy绘制直方图&#xff1a;2. 使用OpenCV绘制直方图&#xff1a;3. 使用掩码绘制直方图&#xff1a;三、直方图均衡化&…...

    2024/4/5 4:30:47
  14. node.js和vue cli脚手架下载安装配置方法

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 一、node.js安装以及环境配置 1、下载vue.js 下载地址&#xff1a; https://nodejs.org/en/ 2、安装node.js 下载完成后…...

    2024/4/17 23:58:42
  15. 轻量级orm框架——gzero指南

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 开发过web系统人一定对大量的curd不陌生&#xff0c;为了提高效率我们通常会使用一些orm框架做辅助&#xff0c;而不会直接操…...

    2024/4/14 8:22:37
  16. 第12章:图像轮廓

    第12章&#xff1a;图像轮廓一、查找并绘制轮廓&#xff1a;1. 查找图像轮廓&#xff1a;2. 绘制图像轮廓&#xff1a;3. 绘制轮廓实例&#xff1a;二、矩特征1. 矩的计算&#xff1a;moments函数2. 计算轮廓面积&#xff1a;contourArea函数3. 计算轮廓长度&#xff1a;arcLen…...

    2024/4/14 8:22:37
  17. 嵌入式硬件之ADC/DAC

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 嵌入式硬件之ADC/DAC 写在前面 这几天在做一个寒假练项目&#xff0c;其中涉及到了音频的处理&#xff0c;ADC、DAC再次进…...

    2024/4/18 13:14:06
  18. VUE3 之 Non-Props 属性

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 1. 概述 墨菲定律告诉我们&#xff1a;人总是容易犯错误的&#xff0c;无论科技发展到什么程度&#xff0c;无论是什么身份…...

    2024/4/14 8:22:32
  19. 第11章:图像金字塔

    第11章&#xff1a;图像金字塔一、理论基础&#xff1a;1. 向下采样&#xff1a;2. 向上采样&#xff1a;二、pyrDown函数使用&#xff1a;三、pyrUp函数及使用&#xff1a;四、采样可逆性研究五、拉普拉斯金字塔1. 定义&#xff1a;2. 应用&#xff1a;什么是图像金子塔&#…...

    2024/4/7 16:00:08
  20. Spring Boot Starter 和 ABP Module

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 Spring Boot 和 ABP 都是模块化的系统&#xff0c;分别是Java 和.NET 可以对比的框架。模块系统是就像乐高玩具一样&#xf…...

    2024/4/18 20:56:14

最新文章

  1. 若依前后端分离部署nginx

    1、v.sj 2、生产环境修改 3、退出登录修改 4、路由改为hash模式 5、nginx配置 location /gldhtml/ {alias D:/java/tool/nginx-1.19.6/project/jxal/html/; } location /jxal/ {proxy_pass http://localhost:8081/; }...

    2024/5/7 11:01:44
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. Mac brew 安装软件

    Mac brew 安装软件 homebrew 速度慢 将brew 切换到国内镜像源 # 速度一般 # 步骤一 cd "$(brew --repo)" git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git# 步骤二 cd "$(brew --repo)/Library/Taps/homebrew/homebr…...

    2024/5/3 9:32:52
  4. 解决前端性能瓶颈:高效处理大量数据渲染与复杂交互的策略与优化方法

    ✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、分页加载数据 二、虚拟滚动 三、懒加载 四、数据缓存 五、减少重绘和回流 …...

    2024/5/6 13:05:55
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/7 5:50:09
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/6 9:21:00
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在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