Mybatis

环境:

  • JDK 1.8
  • Mysql 5.7
  • Maven 3.6.1
  • IDEA

文档链接:

https://mybatis.org/mybatis-3/zh/index.html

文章目录

  • Mybatis
    • 1、 简介
      • 1.1、 什么是 MyBatis?
      • 1.2、 持久化
      • 1.3、 持久层
      • 1.4、 优点
    • 2、第一个Mybatis程序
      • 2.1、 搭建环境
      • 2.2、 创建模块
      • 2.3、 编写代码
      • 2.4、编写测试类
      • 2.5、作用域和生命周期
    • 3、 CRUD
      • 3.1、namespace
      • 3.2、select、Insert、Update、Delete
    • 4、配置解析
      • 4.2、属性(properties)
      • 4.3、 类型别名(typeAliases)
      • 4.4、设置(settings)
      • 4.5、其他配置
      • 4.6、映射器(mappers)
    • 5、结果映射(resultMap)
    • 6、日志
      • 6.1、STDOUT_LOGGING
      • 6.2、 LOG4J
    • 7、分页
      • 7.1、 sql语句执行
      • 7.2、 mybatis执行
      • 7.3、 分页插件 pageHelper
    • 8、使用注解开发
    • 9、多对一处理
      • 1、按照查询嵌套处理(子查询)
      • 2、按照结果嵌套查询(联表查询)
    • 10、一对多
      • 1、按照结果嵌套查询
      • 2、按照查询嵌套查询
    • 11、动态Sql
      • 1、 if
      • 2、choose、when、otherwise
      • 3、trim、where、set
      • 4、foreach
    • 12、Mybatis缓存
      • 12.1、一级缓存
      • 12.2 二级缓存
    • 13、缓存顺序
    • 14、ehcache
      • 1、导包
      • 2、添加配置文件 ehcache.xml
    • 15、Mybatis执行流程

1、 简介

1.1、 什么是 MyBatis?

  • MyBatis 是一款优秀的持久层框架

  • 它支持自定义 SQL、存储过程以及高级映射

  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

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

任何获得Mybatis:

  • maven仓库:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version>
</dependency>

1.2、 持久化

  • 持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。
  • 持久化的方式: 数据库(jdbc)、IO文件

1.3、 持久层

完成持久化工作的代码块。

1.4、 优点

  • 简单易学、灵活
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的ORM字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供XML标签,支持编写动态sql

2、第一个Mybatis程序

2.1、 搭建环境

数据库:

create DATABASE 'mybatis';USE 'mybatis';CREATE TABLE `users` (`id` int(20) NOT NULL PRIMARY KEY,`name` VARCHAR(30) DEFAULT NULL,`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO `users` VALUES(1, '小明', '123456'),(2, '小黄', '123456'),(3, '小花', '123456');

新建maven项目:

  1. 删除src 将这个工程作为父工程
  2. 配置pom.xml文件
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

2.2、 创建模块

  1. 新建一个子模块

子模块的pom.xml:

<parent><artifactId>mybatis-demo</artifactId><groupId>com.zzp</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion><artifactId>mybatis-01</artifactId>

父工程中多了一个modules

<modules><module>mybatis-01</module>
</modules>
  1. 编写MybatisUtils工具类

    public class MybatisUtils {private static  SqlSessionFactory sqlSessionFactory;static{try {//1. 获取SqlSessionFactory对象String resoursePath = "mybatis-config.xml";InputStream resourceAsStream = Resources.getResourceAsStream(resoursePath);sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}// 2. 获取SqlSession对象// SqlSession对象中包含了面向数据库执行sql命令的所有方法public static SqlSession getSqlSession () {return sqlSessionFactory.openSession();}
    }

2.3、 编写代码

  1. 编写实体类 pojo

  2. 编写dao层

  3. 编写xml 由原来的接口实现类变成现在的 xxxmapper.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">
    <!--namespace  对应的接口-->
    <mapper namespace="com.zzp.dao.UserDao"><!--resultType  返回结果--><select id="getUserList" resultType="com.zzp.pojo.Users">select * from users where id = #{id}</select></mapper>

2.4、编写测试类

注意:

  1. 问题1

org.apache.ibatis.binding.BindingException: Type interface com.zzp.dao.UserMapper is not known to the MapperRegistry.

解决办法:

在xml配置文件中注册mapper

<!--每一个Mapper.xml都需要在这里注册-->
<mappers><mapper resource="com/zzp/dao/UserMapper.xml"></mapper></mappers>
  1. 问题2

    java.lang.ExceptionInInitializerError

    解决办法:

    没有读取到UserMapper.xml文件,在pom.xml中新增

    <build><resources><resource><directory>src/main/resourses</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource></resources>
    </build>
  2. 问题3

    com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 2 字节的 UTF-8 序列的字节 2 无效。

    解决办法:

    在pom.xml文件新增项目编码格式的配置

    <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

2.5、作用域和生命周期

不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的***并发问题***。

  • SqlSessionFactoryBuilder

    这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。

  • SqlSessionFactory

    SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在。最简单的就是使用单例模式或者静态单例模式。

  • SqlSession

    每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

image-20200527173655157

3、 CRUD

3.1、namespace

​ namespace中的包名要和Mapper的接口报名一致。

image-20200527092058834

3.2、select、Insert、Update、Delete

选择查询语句:

  • id:对应namespace中的方法名
  • resultType:sql语句执行返回值
  • parameterType:参数类型

注意: 增删改(Insert、Update、Delete)的操作需要提交事务才能完成数据库的修改工作。

4、配置解析

  • mybatis-config.xml

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息

    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
    environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)

4.1、环境配置(environments)

​ MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置。

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

    <environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?        useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="1q2w3e4r"/></dataSource></environment></environments>

注意一些关键点:

  • 默认使用的环境 ID(比如:default=“development”)。
  • 每个 environment 元素定义的环境 ID(比如:id=“development”)。
  • 事务管理器的配置(比如:type=“JDBC”)。
  • 数据源的配置(比如:type=“POOLED”)。

事务管理器

​ 在 MyBatis 中有两种类型的事务管理器:

  1. JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域

  2. MANAGED – 基本不用了

 提示: 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

数据源(dataSource)

​ dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

​ 有三种内建的数据源类型(UNPOOLED、POOLED(常用)、JNDI)。

4.2、属性(properties)

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。

  • 编写一个db.properties文件

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username=root
    password=1q2w3e4r
    
  • 在外部进行属性配置

    <properties resource="db.properties"><property name="password" value="123456"/>
    </properties>
  • 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值

    <dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
    </dataSource>

    注意:

    ​ 如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:

    • 首先读取在 properties 元素体内指定的属性。
    • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
    • 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

    因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。

4.3、 类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写。

指定类名:

<typeAliases><typeAlias type="com.zzp.pojo.Users" alias="Users"></typeAlias>
</typeAliases>

指定包: MyBatis 会在包名下面搜索需要的 Java Bean

<typeAliases><package name="com.zzp.pojo"/>
</typeAliases>

注解:

@Alias("hello")
public class Users {

每一个在包 com.zzp.pojo 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.zzp.pojo.Users 的别名为 users;若有注解,则别名为其注解值

4.4、设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

设置名 描述 有效值
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true|false
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true|false
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 LOG4J|SLF4J…

4.5、其他配置

  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
    • mybatis-generator-core
    • mybatis-plus

4.6、映射器(mappers)

  • 方式一

    <mappers><mapper resource="com/zzp/dao/UserMapper.xml"></mapper>
    </mappers>
  • 方式二

    使用class文件绑定

    <mappers><mapper class="com.zzp.dao.UserMapper"></mapper>
    </mappers>
  • 方式三

    使用包名进行绑定

    <mappers><package name="com.zzp.dao"/>
    </mappers>

注意:

​ 使用方式二和方式三有两个注意点: 1. 接口和Mapper配置文件必须同名; 2.接口和Mapper配置文件必须在同一个包下。

5、结果映射(resultMap)

可以解决数据库字段名和Pojo中属性名称不同的问题。

  • 起别名

    <select id="getUserList" resultType="hello">select id, name, pwd as password from mybatis.users
    </select>
  • resultMap

    ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

6、日志

在Mybatis中具体使用哪一种日志,在setting种配置。

6.1、STDOUT_LOGGING

    <settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings>

6.2、 LOG4J

了解log4j:

  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件等
  • 我们也可以控制每一条日志的输出格式
  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
  • 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
  1. 导入依赖包

    <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
    </dependency>
  2. 添加log4j.properties文件

    log4j.rootLogger=DEBUG,console,file#控制台输出的相关设置
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    log4j.appender.console.Target = System.out
    log4j.appender.console.Threshold=DEBUG
    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=[%c]-%m%n#文件输出的相关设置
    log4j.appender.file = org.apache.log4j.RollingFileAppender
    log4j.appender.file.File=./log/log.log
    log4j.appender.file.MaxFileSize=10mb
    log4j.appender.file.Threshold=DEBUG
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n#日志输出级别
    log4j.logger.org.mybatis=DEBUG
    log4j.logger.java.sql=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.ResultSet=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
  3. 配置log4j为日志的实现

    <settings><setting name="logImpl" value="LOG4J"/>
    </settings>
  4. 在项目种使用

    • 导包

      import org.apache.log4j.spi.LoggerFactory;
    • new一个日志对象 参数为当前类

      private static Logger logger = Logger.getLogger(UserDaoTest.class);
    • 日志级别

      @Test
      public void test2() {logger.info("info: 111111");logger.debug("debug: 22222");logger.error("error: 33333");
      }
    • 日志文件

      image-20200528104849541

      生成的日志文件会存放到对应的目录下

      image-20200528104936190

7、分页

为了前端的显示美化;为了减少数据的处理量

7.1、 sql语句执行

select * from users limit 0, 2;

7.2、 mybatis执行

  • 接口

    List<Users> getUserListByLimit (Map<String, Integer> map);
  • xml配置

    <select id="getUserListByLimit" resultType="com.zzp.pojo.Users">select * from mybatis.users limit #{startIndex}, #{pageSize}
    </select>
  • 测试

    @Test
    public void test3(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);Map<String, Integer> map = new HashMap<String, Integer>();map.put("startIndex", 0);map.put("pageSize", 2);List<Users> userList = userMapper.getUserListByLimit(map);for (Users users : userList) {System.out.println(users);}
    }

7.3、 分页插件 pageHelper

8、使用注解开发

1、 编写接口类

@Select("select id, name, pwd from users where id = #{id}")
Users getUserById(int id);

2、 配置核心配置文件

<mappers><mapper resource="com/zzp/dao/UserMapper.xml"></mapper>
</mappers>

3、 编写测试类

@Test
public void test4(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);Users user = userMapper.getUserById(1);System.out.println(user);
}

注解开发的本质是反射。底层是动态代理。

@Param注解

  • 基本类型和String类型的参数, 需要加上这个注解
  • 引用类型不需要加
  • 如果只有一个基本类型的话,可以不加这个注解,但是建议加上
  • sql中引用的变量名称对应的值就是@Param中设定的属性名

#{} 和 ${}的区别:

  • ${param}传递的参数会被当成sql语句中的一部分,比如传递表名,字段名

    例子:(传入值为id) order by ${param}

    ​ 则解析成的sql为:order by id

  • #{parm}传入的数据都当成一个字符串,会对自动传入的数据加一个双引号

    例子:(传入值为id) select * from table where name = #{param}

    ​ 则解析成的sql为: select * from table where name = “id”

  • 为了安全,能用#的地方就用#方式传参,这样可以有效的防止sql注入攻击

9、多对一处理

1、按照查询嵌套处理(子查询)

<resultMap id="StudentTeacher" type="Student"><result property="id" column="id"></result><result property="name" column="name"></result><!--复杂类型的属性 我们需要单独处理 对象 association 集合 collection--><association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/></resultMap><select id="getList" resultMap="StudentTeacher">select * from mybatis.student</select><select id="getTeacher" resultType="Teacher">select * from mybatis.teacher where id = #{id}</select>

2、按照结果嵌套查询(联表查询)

<select id="getList2" resultMap="StudentTeacher2">select s.id as sid, s.name as sname, t.name as tname from mybatis.student s, mybatis.teacher t where s.tid = t.id
</select><resultMap id="StudentTeacher2" type="Student"><result property="id" column="sid"></result><result property="name" column="sname"></result><!--复杂类型的属性 我们需要单独处理 对象 association 集合 collection--><association property="teacher" javaType="Teacher"><result property="name" column="tname"></result></association>
</resultMap>

10、一对多

1、按照结果嵌套查询

<select id="getTeacher" resultMap="StudentTeacher">select t.id tid, t.name tname, s.id sid, s.name sname from mybatis.teacher t, mybatis.student s where s.tid = t.id and t.id = #{id}
</select><resultMap id="StudentTeacher" type="Teacher"><result property="id" column="tid"></result><result property="name" column="tname"></result><!--复杂类型的属性 我们需要单独处理 对象 association 集合 collection--><collection property="students" ofType="Student"><result property="id" column="sid"></result><result property="name" column="sname"></result></collection>
</resultMap>

2、按照查询嵌套查询

<select id="getTeacher2" resultMap="Teacher2">select * from mybatis.teacher where id = #{id}
</select><resultMap id="Teacher2" type="Teacher"><result property="id" column="id"></result><result property="name" column="name"></result><collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudentByTid"></collection>
</resultMap><select id="getStudentByTid" resultType="Student">select * from mybatis.student where tid = #{tid}
</select>

整理:

  • association: 关联 用于处理多对一的情况 可以理解为一个对象(例如一个学生中的老师)

  • collection: 集合 用于处理一对多的情况 可以理解为一个集合 (例如老师中的学生列表)

  • javaType : 是指我们pojo实体类中的属性类型

  • ofType : 指的是映射到List或者Map中的类型,也就是泛型中的约束类型

11、动态Sql

​ 根据不同的条件,生成不同的sql语句。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

1、 if

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if>
</select>

​ 这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果 。

2、choose、when、otherwise

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and author.name != null">AND author_name like #{author.name}</when><otherwise>AND featured = 1</otherwise></choose>
</select>

​ 只想从多个条件中选择一个使用。

3、trim、where、set

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG<where><if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where>
</select>

​ where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

<update id="updateAuthorIfNecessary">update Author<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="email != null">email=#{email},</if><if test="bio != null">bio=#{bio}</if></set>where id=#{id}
</update>

set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

<trim prefix="SET" suffixOverrides=",">...
</trim><trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim>

4、foreach

<select id="selectPostIn" resultType="domain.blog.Post">SELECT *FROM POST PWHERE ID in<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach>
</select>

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

提示: 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

12、Mybatis缓存

  • ​ Mybatis包含一个非常强大的查询缓存特性,它可以非常方便的定制和配置缓存。缓存可以极大的提升查询效率。

  • ​ Mybatis系统中默认定义了两级缓存:一级缓存二级缓存

    • 默认情况下,只有一级缓存开启。(SqlSession级别的,也称本地缓存)

    • 二级缓存需要手动开启和配置,它是基于namespace级别的缓存

    • 为了提高拓展性,Mybatis定义了缓存接口Cache,我们可以通过实现Cache接口来自定义二级缓存

12.1、一级缓存

测试一级缓存:

SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher2(1);System.out.println(teacher);
System.out.println("------------------------------");Teacher teacher2 = mapper.getTeacher2(1);
System.out.println(teacher2);sqlSession.close();

image-20200603190505517

可以看到,只开启了一次连接,第二次直接再缓存中取出来的。

  • 缓存失效的原因:
    1. 查询不同的东西
    2. 增删改操作
    3. 查询不同的mapper.xml
    4. 手动清空缓存 sqlSession.clearCache();

12.2 二级缓存

​ 默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

<cache/>    
  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
  1. 自定义cache配置:
<cacheeviction="FIFO"flushInterval="60000"size="512"readOnly="true"/>

​ 这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

可用的清除策略有:

  • LRU – 最近最少使用:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
  1. 使用二级缓存步骤:
  • 增加配置,开启全局缓存
<settings><setting name="cacheEnabled" value="true"/>
</settings>
  • 在Mapper中开启二级缓存
<cache/>  
  • 测试:

    需要将实体类序列化;

  1. 小结
  • 只要开启了二级缓存,在一个mapper中就有效
  • 所有的数据先放在一级缓存下
  • 当会话提交或者关闭的时候,会提交到二级缓存中

13、缓存顺序

image-20200603195731246

14、ehcache

1、导包

<dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.1.0</version>
</dependency>

2、添加配置文件 ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"><!-- 磁盘缓存位置 --><diskStore path="./tmpdir/Tmp_ehcache"/><!-- 默认缓存 --><defaultCachemaxEntriesLocalHeap="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"maxEntriesLocalDisk="10000000"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"><persistence strategy="localTempSwap"/></defaultCache><!-- helloworld缓存 --><cache name="HelloWorldCache"maxElementsInMemory="1000"eternal="false"timeToIdleSeconds="5"timeToLiveSeconds="5"overflowToDisk="false"memoryStoreEvictionPolicy="LRU"/>
</ehcache>

15、Mybatis执行流程

1、 通过Resources加载配置好的mybatis-config.xml配置文件。

String resoursePath = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resoursePath);

2、 创建SqlSessionFactory对象

sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

​ 通过SqlSessionFactoryBuilder的build方法生成的SqlSessionFactory对象。

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);} finally {ErrorContext.instance().reset();try {inputStream.close();} catch (IOException e) {// Intentionally ignore. Prefer previous error.}}}

​ XMLConfigBuilde用来解析XML文件的一个构建者,通过他的parse()方法解析mybatis配置文件。

public Configuration parse() {if (parsed) {throw new BuilderException("Each XMLConfigBuilder can only be used once.");}parsed = true;parseConfiguration(parser.evalNode("/configuration"));return configuration;
}

​ 解析configuration节点下的子节点:

image-20200604181213961

​ 然后我们发现parse()解析完成后,他返回了一个configuration对象,它是用来存放mybatis核心配置文件解析完成后的结果。

public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);
}

​ 返回了一个build方法,把刚才的返回值configuration作为参数传入这个方法中,并返回了一个DefaultSqlSessionFactory对象,这是SqlSessionFactory的实现类,用来生产defaultSqlSession对象。

3、获取一个SqlSession对象

​ 调用openSession()方法:

// SqlSession对象中包含了面向数据库执行sql命令的所有方法
public static SqlSession getSqlSession () {return sqlSessionFactory.openSession();
}

​ 具体实现:
image-20200604181614776

​ Transaction对象:获取xml中的environment节点,通过这些参数transactionFactory就帮我们产生了transaction。

​ executor执行器,是个接口(一般用SimpleExecutor来执行,实现类),他是mybatis的核心执行器,相当于jdbc中的statement,发送sql语句并执行。

4、jdk动态代理生成mapper接口的代理对象

​ 通过DefaultSqlSession的getMapper()来生成。

TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

​ 其实是通过mapperRegistry的对象,它里面是一个knownMappers的HashMap,用于存储配置文件中的mappers标签的每个mapper接口。
image-20200604185526668
image-20200604185458426
​ 通过JDK动态代理,帮mapper接口生成代理实现类
image-20200604190111278

5、执行mapper下的方法
​ 代理对象的业务方法执行其实走的是MapperProxy的invoke方法。
image-20200604190539747
​ 通过判断sql的执行类型,选择对应的方法:
image-20200604190647861
​ 这里以查询为例:
image-20200604190820643
​ DefaultSqlSession中,走executor的query方法
image-20200604190940456
​ 如果开启了二级缓存,走CachingExecutor的query方法,先从二级缓存中获取。
image-20200604191316118
​ 如二级缓存中没有数据,走delegate(BaseExecutor)的query方法 ,也就是一级缓存localCache,如果一级缓存没有数据,则走queryFromDatabase方法查数据库。
image-20200604191353483
​ 从数据库查到数据,放入到一级缓存中
image-20200604191519415

​ 一级缓存底层是个PerpetualCache类型的HashMap。

总结一下

​ mybatis运行时要先通过resources把核心配置文件也就是mybatis.xml文件加载进来,然后通过xmlConfigBulider来解析,解析完成后把结果放入configuration中,并把它作为参数传入到build()方法中,并返回一个defaultSQLSessionFactory。我们再调用openSession()方法,来获取SqlSession,在构建SqlSession的同时还需要transaction和executor用于后续执行操作。

流程图:

image-20200604191754956

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

相关文章

  1. golang反射之遍历struct字段及内容

    package mainimport ("fmt""reflect" )type BaseData struct {// mysqlDbUrl string `yaml:"db_url" name:"数据库地址"`DbUser string `yaml:"db_user" name:"数据库用户名"`DbPassWord string `yaml:&…...

    2024/4/15 5:27:23
  2. AD如何快速更改元件库器件的颜色

    如何你想在原理图库中快速修改元件的颜色,一根根线去点肯定是太慢了。可能第一反应就是查找相似,把颜色不是目标颜色全部选中,然后统一更改。但是在原理图库中,这一做法是行不通的。例如下图:可以在右上方找到筛选器,先选中Lines改成自己想要的颜色,再选中Pins统一更改颜…...

    2024/4/15 5:27:24
  3. 顺时针打印列表

    顺时针打印列表根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]] 的对应输出 [1,2,3,6,9,8,7,4,5] 可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。我的解法: class Solution:def spiralOrder(self, matrix: List[List[int]]) -> Li…...

    2024/4/24 10:52:15
  4. 5000行python代码+可视化60W数据,告诉你知乎用户不为人知的事

    友情提示:文末有...一次完整的python分析+可视化展示,是什么样的?比如我想知道知乎用户的学历,是否都是985呢?我还想知道知乎最受关注的话题都是些什么?高端人士都喜欢看什么书呢?“人在XX,刚下飞机?”这句话出现的频率有多高呢?最快的方法是用python爬虫然后加BI可视…...

    2024/4/25 11:56:23
  5. EDIUS无法打开文件的问题

    EDIUS在导入素材的时候,偶尔会报错,是什么原因引起的呢?要如何解决EDIUS无法打开文件的问题,并且导入素材有什么注意点?下面,小编给大家详细讲讲这个问题。 咨询方式:135-201-24168 微信:dibluexs EDIUS导入素材无法打开文件提示框如下:原因分析: 从上图可以看出该视…...

    2024/4/24 10:52:14
  6. ELK(ElasticSearch+Kibana) + Logstash docker部署

    用docker-compose部署 version: 2 services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.6.0container_name: elasticsearch7.6.0environment:- discovery.type=single-node- "ES_JAVA_OPTS=-Xms512m -Xmx512m"volumes:- esdata:/usr/sha…...

    2024/4/24 10:52:13
  7. 创建一个空的Pandas DataFrame,然后填充它?

    本文翻译自:Creating an empty Pandas DataFrame, then filling it? Im starting from the pandas DataFrame docs here: http://pandas.pydata.org/pandas-docs/stable/dsintro.html 我从这里的pandas DataFrame文档开始: http ://pandas.pydata.org/pandas-docs/stable/ds…...

    2024/4/24 10:52:05
  8. 每日一篇(5)--打开新页面的方式

    打开新页面有多种方式,以下会详细介绍关于js基础的window打开方式//window.open打开方式 window.open("http://www.baidu.com/", "_blank");//这是在新窗口打开 window.open("http://www.baidu.com/", "baidu");//这是在新窗口打开且…...

    2024/4/24 10:52:04
  9. [记录]PreferenceFragmentCompat 去除左边空白正确方法

    在PreferenceFragmentCompat中应用Preference,如果不设置ICON,左边会有很大一个空白,如果你到网上搜索解法,一般都如如下博文: https://blog.csdn.net/csdn0lan/article/details/88760088 实际上,正确的方式应该是通过设置属性来解决: <Preferenceapp:key="logo…...

    2024/4/24 10:52:03
  10. idea中maven侧边栏中plugins出现红线错误

    如果你改了以下地方不好使如果你改了setting.xml里仓库地址还不好使。。 试试我的暴力方法~只需一步 【我的飘红plugin为site部分】 从你的本地仓库(我的如图是D:\backup\mvnRe)打开飘红的Plugin地址,暴力删除 即可!!! 别忘记点击此处重新下载一下啦...

    2024/4/24 10:52:04
  11. CGI与FastCGI

    CGI与FastCGI为什么学习什么是CGICGI在LAMP/LNMP架构中的作用CGI的不足FastCGI的出现FastCGI的技术原理在PHP模块中的实现对进程的管理模式总结参考资源 为什么学习 在学习HTTP协议和实现的过程中,接触到CGI程序。在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM、FastCGI和CG…...

    2024/4/24 10:52:08
  12. Synchronized 的原理

    Synchronized代码块是由一对monitorenter(持有monitor对象)/monitorexit(释放monitor对象)指令实现的,monitor对象是同步的基本实现。而synchronized方法,JVM使用ACC_SYNCHRONIZED访问标志来判断是否是一个同步方法,从而执行相应的同步调用。Java6之前,monitor的实现是…...

    2024/4/24 10:52:01
  13. 云原生时代, Kubernetes 多集群架构初探

    为什么我们需要多集群?近年来,多集群架构已经成为“老生常谈”。我们喜欢高可用,喜欢异地多可用区,而多集群架构天生就具备了这样的能力。另一方面我们也希望通过多集群混合云来降低成本,利用到不同集群各自的优势和特性,以便使用不同集群的最新技术(如 AI、GPU 集群等)…...

    2024/4/24 10:51:59
  14. Zigbee----初识OSAL,协议栈运行机制

    OSAL通过轮询的方式查找任务是否执行:函数指针,执行任务处理函数:找到系统启动函数 进入系统处理函数 以SampleApp.c→uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )为例:应用层事件返回值:return (events ^ SYS_EVENT_MSG);#define SYS_EVENT_MSG …...

    2024/4/24 10:52:01
  15. [网络安全课程实验]:PGP加密解密

    目录实验名称: PGP 加密解密 一、实验目的二、实验环境三、实验内容与实验要求四、实验过程与分析加密文件使用PGP磁盘加密磁盘五、实验结果总结实验名称: PGP 加密解密 一、实验目的1、了解PGP加密解密原理;2、能够熟练使用PGP对文件进行加密解密。二、实验环境链接…...

    2024/4/19 11:10:04
  16. Oracle-rollup()函数[转载]

    参考学习了:http://blog.itpub.net/519536/viewspace-610995http://blog.csdn.net/huang_xw/article/details/6402396rollup()是group by的一个扩展函数,初步的感觉是,可以多个列进行group by,然后分别进行统计。示例:1. 日志表,按操作类型统计:SELECT l.operate_type,c…...

    2024/4/19 4:17:39
  17. JVM实用参数CMS收集器

    HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间。该目标对于大多数交互式应用很重要,比如web应用。在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器的操作和使用它时可能出现的主要挑战。就像吞吐量收集器(参见本系列的第6部分),CMS收集器…...

    2024/4/15 5:27:38
  18. 2.4 垃圾回收机制实例

    a = 1 print ( id(a),type(a),a) a = 2 print ( id(a),type(a),a )给a赋值2后,1就会成为垃圾回收机制的对象...

    2024/4/15 5:27:35
  19. B2C电商项目(第六天、Elasticsearch商品上架添加索引、商品下架删除索引库、商品搜索、多条件分页搜索、排序、高亮显示)

    一、商品上架索引库导入数据 1.1、需求分析 商品上架将商品的sku列表导入或更新索引库。 1.2、实现思路 (1)在数据监控微服务中监控tb_spu表的数据,当tb_spu发生更改且is_marketable为1时,表示商品 上架,将spu的id发送到rabbitmq。 (2)在rabbitmq管理后台创建商品上架交…...

    2024/4/20 23:44:44
  20. 批处理添加路由表

    @echo offfor /F "tokens=3" %%* in (route print ^| findstr "\<0.0.0.0\>") do set "gw=%%*"ipconfig /flushdnsroute add 1.0.1.0 mask 255.255.255.0 %gw% metric 5 route add 1.0.2.0 mask 255.255.254.0 %gw% metric 5 。。。取第一…...

    2024/4/26 0:29:37

最新文章

  1. 数字IC后端先进工艺设计实现之TSMC 12nm 6Track工艺数字IC后端实现重点难点盘点

    大家知道咱们社区近期TSMC 12nm ARM Cortexa-A72(1P9M 6Track Metal Stack)已经开班。这里小编要强调一点:不要认为跑了先进工艺的项目就会很有竞争力&#xff01;如果你仅仅是跑个先进工艺的flow&#xff0c;不懂先进工艺在数字IC后端实现上的不同点&#xff0c;为何有这样的不…...

    2024/4/27 15:35:13
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. STL--vector有哪些应用场景

    vector 在 C 中是一种非常灵活和强大的容器&#xff0c;适用于多种不同的应用场景。以下是一些常见的应用场景&#xff1a; 1 动态数据集合&#xff1a;当你不确定数据集的大小&#xff0c;或者数据集的大小会随时间变化时&#xff0c;vector 是理想的选择。例如&#xff0c;在…...

    2024/4/27 10:37:14
  4. Stable Diffusion 本地部署教程

    Stable Diffusion 是一个开源的本地部署的软件&#xff0c;用于在本地网络中进行消息传递和同步。下面是 Stable Diffusion 的本地部署教程&#xff1a; 安装稳定扩散软件&#xff1a;首先&#xff0c;您需要从 Stable Diffusion 的官方网站或 GitHub 页面上下载并安装 Stable …...

    2024/4/26 12:59:46
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

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

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

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

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

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

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

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

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

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

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

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/4/26 16:00:35
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

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

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

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

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

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

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/4/27 8:32:30
  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