Mybatis框架概述

前端框架

  1. 前端开发的框架
    Angular.js,React.js,Vue.js

  2. 前端UI框架
    方便后端人员实现精美的前端页面搭建——Extjs,jquery ui,easy ui,bootstrap,layui

  3. 后端框架
    表现层框架(Controller):servlet
    struts,xwork,struts2,springmvc

在SpringMVC编程中一般分为四层:

1.表示层:(jsp、html 主要就是界面的展示)
2.控制层:(Contoller、Action)控制界面跳转
3.业务层:(Service)调用DAO层,实现解耦合目的,虽然不要它也可以运行项目,但是会使项目后期的延展和维护变得困难
4.持久层:(DAO)也叫数据访问层,实现对数据库的访问

持久层框架(Dao)JDBC:Hibernate(hql),ibtais(xml),Mybatis
整合框架:EJB,spring

SSH:struts/struts2 spring hibernate

SSM:springmvc spring mybatis

Mybatis是一个优秀的持久层框架,它对jdbc几乎所有的数据库操作进行了封装(包括加载驱动、创建connection、创建statement、手动设置参数、结果集检索等繁琐操作),使开发者只需要关注SQL本身。

Mybatis框架搭建

准备工作

创建学生表,创建基础数据

创建学生表:
Navicat创建数据库学生表
在学生表中添加基础信息
对应数据库表构造Student类:

package com.sinosoft.domain;public class Student {private String id;private String name;private Integer age; //Integer可以表示空值public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id='" + id + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}

框架搭建

准备工作完成后开始进行框架搭建:

  1. 创建项目,搭建包结构
  2. 导入mybatis相关jar包和MySQL驱动包
  3. 导入log4j相关jar包
  4. 在src根下创建mybatis主配置文件mybatis-config.xml,搭建配置文件结构——dbcp,c3p0,druid alibaba 文档第三页 如下1-1
  5. 创建mapper包结构,创建SQL映射文件XxxMapper.xml 文档第四页 如下1-2
  6. 在src根下引入log4j属性文件
  7. 搭建测试程序,测试根据ID查单条——关键语句 模板在文档第二页 如下1-3

1-1:

<?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><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/test"/><property name="username" value="root"/><property name="password" value="123"/></dataSource></environment></environments><mappers>
<!--        <mapper resource="org/mybatis/example/BlogMapper.xml"/>--></mappers>
</configuration>

1-2:

<?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="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>

1-3:

	String resource = "org/mybatis/example/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

数据库运行测试

框架搭建好后,进行数据库运行测试:

package com.sinosoft.test;import com.sinosoft.domain.Student;
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;
import java.util.List;public class Test1 {public static void main(String[] args) {String resource = "mybatis-config.xml";//输入流InputStream inputStream = null;try {//通过加载Mybatis的主配置文件mybatis-config.xml,创建输入流对象inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}/*SqlSessionFactoryBuilder:SqlSessionFactory的建造者,通过该建造者对象调用建造方法,为我们创建一个SqlSessionFactory对象sqlSessionFactory对象唯一的作用就是为我们创建SqlSession对象*/SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//我们未来所有的操作,使用的都是SqlSeeion对象//例如增删改查,处理事务等等,都是统一使用session对象来完成SqlSession session = sqlSessionFactory.openSession();/*需求:根据id查单条如果取得的是单挑记录,我们调用的是selectOne方法参数1:根据命名空间,sqId的形式找到我们需要使用的sql语句参数2:我们要为sql语句中传递的参数*/Student s = session.selectOne("test1.getById","A0002");System.out.println(s);session.close();//查询学生信息表中所有的记录List<Student> sList = session.selectList("test1.getAll");for(Student s:sList){System.out.println(s);}session.close();//数据库添加操作Student s = new Student();s.setId("A0005");s.setName("cxk");s.setAge(66);int count = session.insert("test1.add",s);System.out.println("================="+count);session.commit(); //mybatis是手动提交事务session.close();//数据库修改操作Student s = new Student();s.setId("A0001");s.setName("sjkskks");s.setAge(111);session.update("test1.update",s);session.commit();session.close();//数据库删除操作session.delete("test1.delete","A0004");session.commit();session.close();}
}

对应的mapper.xml映射中的sql语句代码为:

<?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="test1"><!--namespace:命名空间不同的mapper映射文件使用namespace来做区分不同的mapper映射文件所使用的namespace的命名不允许出现重复sql语句必须要写在相应的标签当中<insert>:在标签对中写insert开头的sql语句,处理添加操作<update>:在标签对中写update开头的sql语句,处理修改操作<delete>:在标签对中写delete开头的sql语句,处理删除操作<select>:在标签对中写select开头的sql语句,处理查询操作parameterType:为sql语句传递的参数resultType:为sql语句操作后返回的结果类型注意在未来实际项目开发中,所有的标签必须要写id属性<selsct>标签parameterType可以省略不写resultType属性必须得写对于<insert><update><delete>这3个标签通常我们只写id属性,其他属性一概不写--><select id="getById" parameterType="java.lang.String" resultType="com.sinosoft.domain.Student">select * from student where id=#{id}</select><!--如果返回的是多条记录,那么resultType返回值类型,应该写为集合的泛型--><select id="getAll" resultType="com.sinosoft.domain.Student">select * from student</select><insert id="add" parameterType="com.sinosoft.domain.Student">insert into student(id,name,age) values (#{id},#{name},#{age})</insert><update id="update" parameterType="com.sinosoft.domain.Student">update student set name=#{name},age=#{age} where id=#{id}</update><delete id="delete">delete from student where id=#{id}</delete></mapper>

MyBatis结合dao层的开发

结合原始dao的开发

MyBatis对dao层动态代理的支持

我们以前用过动态代理,我们是在业务层使用的,在业务层使用动态代理是为了实现事务管理,业务层的动态代理是我们自己手写的,业务层之所以使用动态代理,是因为业务层本身就是用来处理业务逻辑的,事务相关的代码,不方便放在业务层处理,所以我们想到使用代理类帮业务层去处理。

现在我们要在dao层也要加入动态代理。dao层之所以创建代理类,是因为写dao层实现类本身就是一种不方便,在结合了MyBatis动态代理机制后,以后的实际项目开发,dao层的impl就不写了。Mybatis的动态代理不用我们自己手写,在Mybatis中已经集成好的一种机制,我们直接拿来使用就可以。

开发规则:

  1. 在Mapper.xml中将namespace设置为UserDao.java接口的权限定名
	<mapper namespace="sinosoft.dao.StudentDao">

配置mapper映射的namespace接口名称

  1. 将Mapper.xml中statement的id和UserDao.java接口的方法名保持一致
	<select id="getById" parameterType="java.lang.String" resultType="com.sinosoft.domain.Student">select * from student where id=#{id}</select><insert id="save">insert into student(id,name,age) values(#{id},#{name},#{age})</insert>

配置mapper中的执行sql语句的id名称与接口中的方法名称

  1. 将Mapper.xml中statement的parameterType和UserDao.java接口的方法输入参数类型保持一致
    传入参数类型
    接口中方法输入参数类型

  2. 将Mapper.xml中statement的resultType和UserDao.java接口的方法输出结果类型保持一致
    输出结果类型
    接口方法的返回结果类型
    返回学生类

  3. Dao业务层动态代理提交事务。
    将事务处理直接写进ServiceIMPL中,而获取成员属性的时候直接从Dao层中的UserDao的接口中获取并转换成session对象。之后将Dao层中的DaoIMPL删除,将mapper.xml配置文件放入Dao层中,更改mapper.xml中的namespace路径映射到UserDao.class中,最后再将mybatis-config.xml中的mapper源路径更新一下

需要变动的地方
更改获取的对象
更改mapper.xml中的namespace
更改mybatis-config.xml中的mapper resourse

MyBatis全局配置文件

  1. properties:

    加载数据库连接属性文件

配置文件
数据库驱动配置文件

  1. settings全局配置参数

    Mybatis框架运行设置一些全局配置参数,比如:开启二级缓存,开启延迟载等等
    详细参考:mybatis-settings.docx
    注意:设置全局参数会影响mybatis框架运行,要谨慎设置

<!--设置与数据库交互的环境,可以在此处配置二级缓存,配置查询延迟加载策略等等配置的目的是为了更加有效的查询表中的记录在实际项目开发中,settings的设置基本没用因为settings对于查询的优化,得到的效果不明显对于海量级别的数据,使用settings配置优化,起不到任何的效果对于数据量较少的项目,对于查询的效率要求的比较低,也没有必要使用settings配置如果遇到了海量级别的数据,我们该如何去提高查询的效率呢?基础操作:对于常用的查询条件的字段,设置索引(相当于在书里加目录)高级操作:使用nosql数据库,redis(缓存数据库)专业操作:搜索引擎solar和Elasticsearch针对于电商行业--><settings><setting name="" value=""/></settings>
  1. typeAliases

    设置类型别名,框架默认支持的别名,参见Mybatis默认支持的别名.docx

    表示为mapper映射文件中的domain起别名

<typeAliases><!--方式1:为指定的类分别起别名,别名的命名由我们自己来决定type:要为哪个domain起别名, 填写包,类名称alias:别名的名字-->
<!--   <typeAlias type="com.sinosoft.domain.Student" alias="stu"/>--><!--方式2:使用package标签批量起别名别名是Mybatis默认为我们取好的,命名不是由我们自己决定,别名为类名(类名的字母不区分大小写)虽然字母不区分大小写,但是还是要按照约定俗成的规则来进行填写name:指定一个包结构,表示在该包下,所有的domain自动起好了别名--><!--总结:(1)如果未来实际项目开发中,如果公司需要使用起别名的机制,我们要用批量起别名的方式(2)在市场上也有很多企业崛起使用Mybatis起别名的机制公司会认为将domain写成全路径,可以有效的提供代码的可读性--><package name="com.sinosoft.domain"/></typeAliases>

指定mapper映射文件路径:

<mappers><!--方式1:使用resource属性,指定mapper映射文件<mapper resource="com/sinosoft/dao/StudentDao.xml"/>--><!--方式2:使用class属性,找到dao层接口的全路径<mapper class="com.sinosoft.dao.StudentDao"/>--><!--方式3:批量注册,name属性,指向dao层的包,表示在该dao包下,所有的mapper映射文件自动注册--><!--总结:未来实际项目开发中,我们一定是批量注册mapper映射文件--><package name="com.sinosoft.dao"/></mappers>

Mybatis映射文件

  1. 设置参数类型:

    parameterType用于设置输入参数的Java类型,parameterType的值为参数类型的Java类型或者别名,Sql语句获取参数的值使用#{}或者${},使用时可省略

    (1)使用简单数据类型(8基本数据类型+String)为参数
    (2)使用引用数据类型为参数
    (3)使用domain对象类为参数
    (4)使用map为参数

package com.sinosoft.test;import com.sinosoft.dao.StudentDao;
import com.sinosoft.util.SqlSessionUtil;public class Test2 {public static void main(String[] args) {StudentDao studentDao = SqlSessionUtil.getSession().getMapper(StudentDao.class);//        //1.测试:parameterType,使用简单数据类型 String
//        Student s = studentDao.select1("A0001");
//        System.out.println(s);//2.测试,parameterType使用简单数据类型int//查询出所有年龄为23岁的学员的详细信息
//        List<Student> sList = studentDao.select2(11);  //返回List集合,因为年龄11的不仅仅只有一个
//        for (Student s:sList){
//            System.out.println(s);
//        }//3.测试parameterType//需求:查询出姓名为wsc,年龄为18岁的学员信息/*绝对不可以同时为sql语句传递多个参数*/
//        List<Student> studentList = studentDao.select3("wsc",18);
//        for (Student s:studentList){
//            System.out.println(s);
//        }//如果我们要为sql语句传递多个参数,我们应该将多个参数封装到一个domain对象中,或者是打包到一个map集合中//4.测试parameterType,使用domain为参数Student s//需求:查询出姓名为wsc,年龄为18岁的学员信息
//        Student s = new Student();
//        s.setName("wsc");
//        s.setAge(18);
//        List<Student> sList = studentDao.select4(s);
//        for (Student ss:sList){
//            System.out.println(ss);
//        }//5.测试parameterType,使用map为参数//需求:查询出姓名为wsc,年龄为18岁的学员信息
//        Map<String,Object> map = new HashMap<String,Object>();
//        map.put("name","wsc");
//        map.put("age",18);
//        List<Student> sList = studentDao.select5(map);
//        for (Student ss:sList){
//            System.out.println(ss);
//        }/*总结:在实际项目开发中,使用domain引用类型,或者是使用map集合类型都可以为sql语句同时传递多个参数一般情况下,我们使用的domain就可以了当domain不符合需求的情况下,我们一定要考虑使用map来传值例子:需求:请查询出姓名为wsc,班级为一年一班的学员的详细信息select from studentjoin classroom con s.classroomId=c.idwhere s.name=#{wsc} and c.name={一年一班}在实际项目开发中,一定要学会使用为sql传值的这几种方式但是对于在<select>中的parameterType属性,一般我们都是省略不写的*/}
}

对应的mapper.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.sinosoft.dao.StudentDao"><!--<select id="getAll" resultType="Student">select * from student;</select><select id="getById" parameterType="java.lang.String" resultType="com.sinosoft.domain.Student">select * from student where id=#{id}</select><insert id="save">insert into student(id,name,age) values(#{id},#{name},#{age})</insert>--><!--对于parameterType:java.lang.String好使String好使string好使strinG好使STRING好使str不好使省略不写好使--><!--使用简单类型(8大基本数据类型+String)为参数在#{}中的标识符可以随意去写但是虽然可以随意写,还是要写的有意义--><select id="select1" parameterType="string" resultType="Student">select * from student where id=#{id};</select><select id="select2" parameterType="int" resultType="Student">select * from student where age=#{age};</select><select id="select3" resultType="Student">select * from student where name=#{name} and age=#{age};</select><!--如果我们为sql语句传递的参数类型为一个domain引用类型,那么#{}中的标识符必须是domain类的属性名--><select id="select4" parameterType="Student" resultType="Student">select * from student where name=#{name} and age=#{age};</select><!--如果我们为sql语句传递的参数类型为一个map类型那么#{}中的标识符必须是map的key--><select id="select5" parameterType="map" resultType="Student">select * from student where name=#{name} and age=#{age};</select></mapper>
  1. #{}与${}
    使用在sql语句中的符号
    (1)#{}:表示占位符,可以有效防止sql注入,使用#{}设置参数无需考虑参数的类型

    (2):表示拼接符,无法防止sql注入,使用{}:表示拼接符,无法防止sql注入,使用sql使{}设置参数必须考虑参数的类型

${}拼接的使用

对应的mapper.xml映射文件
mapper.xml的映射文件

(3)传递简单类型参数:如果获取简单类型参数,#{}中可以使用value或其他名称。如果获取简单类型参数,中只能使用value。注意引号的引入select∗fromstudentwhereid=‘{}中只能使用value。注意引号的引入 select * from student where id=‘使valueselectfromstudentwhereid={value}’

(4) 在没有特殊要求的情况下,通常使用#{}占位符

(5)有些情况必须使用,比如:需要动态拼接表名,select∗from{},比如:需要动态拼接表名,select*fromselectfrom{tablename},比如:动态拼接排序字段:select*from tablename order by ${username} desc

(6)重点案例:
使用${}执行like模糊查询
使用#{}执行like模糊查询

//7.测试:Like模糊查询 方式1:使用${}了解即可/*List<Student> sList = studentDao.select7("s");for (Student ss:sList){System.out.println(ss);}*///8.测试:Like模糊查询 方式1:使用#{} 了解/*List<Student> sList = studentDao.select8("%s%");for(Student ss:sList){System.out.println(ss);}*///9.测试:Like模糊查询 方式1:使用#{} 掌握/*List<Student> sList =  studentDao.select9("s");for (Student ss:sList){System.out.println(ss);}*/

对应的mapper.xml映射

	<select id="select7" resultType="Student">select * from student where name like '%${value}%';</select><select id="select8" resultType="Student">select * from student where name like #{"%s%"};</select><!--'%'空格#{}空格'%'以上空格不能省略--><select id="select9" resultType="Student">select * from student where name like '%' #{name} '%';</select>
  1. resultType
    设置返回值类型:
    (1)返回简单类型
//10.测试:resultType返回String类型//需求:查询出编号为A0001的学员的姓名/*String name = studentDao.select10("A0001");System.out.println(name);*///11.测试:resultType返回String类型集合//需求:查询出所有学生的姓名/*List<String> sList = studentDao.select11();for (String name:sList){System.out.println(name);}*///12.测试:resultType返回int类型//需求:查询出表中一共有多少条信息/*int count = studentDao.select12();System.out.println(count);*/

对应的mapper.xml映射

	<select id="select10" resultType="String">select name from student where id=#{id};</select><select id="select11" resultType="String">select name from student;</select><select id="select12" resultType="int">select count(*) from student;</select>

(2)返回pojo(domain Student)

//13.测试:resultType 返回domain引用类型Student
//        Student student = studentDao.select6("A0001");
//        System.out.println(student);

对应的mapper.xml映射文件

	<select id="select6" resultType="Student">select * from student where id='${value}';</select>

(3)返回hashmap(注意返回值类型)

 //14.测试:resultType 返回map类型/** <select id="" resultType="Student">select * from student;</select>* 当执行了sql语句后,通过查询得到的结果id,name,age* 根据返回值的类型,会自动为我们创建出来一个该类型的对象,由该对象将查询的结果封装起来** Student s1 = new Student();* s.setId("A0001");* s.setName("sjkskks");* s.setAge(23);** 当查询出来了第二条记录,根据返回值类型,再一次创建出来一个对象,封装第二条记录的值* Student s2 = new Student();* s.setId("A0002");* s.setName("lh");* s.setAge(11);** Student s6 = new Student();* s.setId("A0006");* s.setName("SA");* s.setAge(2);** 多条记录封装成为了多个Student对象* Mybatis系统会自动创建出来一个List集合来保存这些对象* List<Student> sList = new ArrayList();* sList.add(s1);* sList.add(s2);* ...* sList.add(s6);*** --------------------------------------------------** <select id="" resultType="Student">select * from student;</select>** 当执行了sql语句之后,通过查询得到的结果id,name,age* 根据返回值类型,map会自动为我们创建出来一个该类型的对象,由该对象将查询的结果封装起来* Map<String,Object> map1 = new HashMap<>();* map1.put("id","A0001");* map1.put("name","sjkskks");* map1.put("age","23");** 当查询出来了第二条记录,根据返回值类型,再一次创建出来一个对象,封装第二条记录的值** 当执行了sql语句之后,通过查询得到的结果id,name,age* 根据返回值类型,map会自动为我们创建出来一个该类型的对象,由该对象将查询的结果封装起来* Map<String,Object> map2 = new HashMap<>();* map1.put("id","A0002");* map1.put("name","lh");* map1.put("age","11");* ...* ...* map6.put()...;***多条记录封装成为了多个map对象*Mybatis系统会自动创建出来一个map集合来保存这些对象* List<Map<String,Object>> mapList = new ArrayList<>();* mapList.add(map1);* mapList.add(map2);* ...* mapList.add(map6);** 对于sql语句查询的结果,我们使用domain来封装这些结果,很方便,为何还使用map呢??* 因为对于查询的结果有很多的情况,使用domain来封装不了,所以我们使用map来保存结果** 例如:*   需求:根据姓名来分组,查询出来每一个姓名对应的数量*   叫sjkskks的多少人,叫lh的多少人*   ...** select name,count(*)* from student* group by name** 对于以上查询结果,使用domain能封装结果值吗?* 不能,因为domain有name属性,但是没有count属性** 所以返回map一定可以保存查询得到的结果** *//*List<Map<String, Object>> mapList = studentDao.select14();for (Map<String, Object> map : mapList) {Set<String> set = map.keySet(); //将键值拆开for (String key : set) {System.out.println("key:" + key);System.out.println("value:" + map.get(key));   //通过拆开的键值来遍历查找map中的value值}System.out.println("---------------------------------------");}*/

对应的mapper.xml映射

	<select id="select14" resultType="map">select * from student;</select>

(4)当查询字段名和pojo属性名不一致时的解决方案
a.为字段起别名,别名为类中属性名

//15.测试,resultType 当数据库表字段名称和domain类属性名称不一致时的处理,方式一:起别名/*List<Student> studentList = studentDao.select15();for (Student name:studentList){System.out.println(name);}*/

对应的mapper.xml映射

<!--resultMap 是用来做数据库表字段和类属性名一一对应关系所用的标签id:resultMap标签对的唯一标识,将来在使用该resultMap标签的时候,使用id来找到这组标签type:指定一个类型,要与数据库表一一对应,建立起表字段和类属性的名字一一匹配的关系--><select id="select15" resultType="Student">selectid,fullname as name,agefrom student;</select>

b.使用resultMap在mapper.xml映射文件中将表字段与domain类属性名称建立起一一匹配的关系

//16.测试,resultType 当数据库表字段名称和domain类属性名称不一致时的处理,方式二:使用resultMap/*List<Student> studentList = studentDao.select16();for (Student name:studentList){System.out.println(name);}*/

对应的mapper.xml映射

<!--resultMap 是用来做数据库表字段和类属性名一一对应关系所用的标签id:resultMap标签对的唯一标识,将来在使用该resultMap标签的时候,使用id来找到这组标签type:指定一个类型,要与数据库表一一对应,建立起表字段和类属性的名字一一匹配的关系--><resultMap id="stuMap" type="Student"><!--id标签:用来配置主键的对应关系result标签:用来配置普通字段对应关系的对于student表,表结构是一个id,两个普通字段所以需要一个id标签,两个result标签property属性:配置的是类中的属性名column属性:配置的是表中的字段名这样就能够建立起类属性的表字段一一对应的关系--><id property="id" column="id"/><result property="name" column="fullname"/><result property="age" column="age"/></resultMap><select id="select16" resultMap="stuMap">select * from student;</select>

Mybatis动态SQL机制

使用动态sql,动态拼接sql语句
情况1:如果查询数据什么都不填
String sql = “select * from tbl”;
情况2:只填写了姓名
String sql = “select * from tbl where name like ?”;
情况3:只填写了姓名与性别
String sql = “select * from tbl where name like ? and gender=?”;
情况4:只填写了姓名与性别,年龄
String sql = “select * from tbl where name like ? and gender=? and age=?”;
等等等等。。。。多种查询匹配组合

在实际项目开发中,我们对于这种需求,肯定是要将sql语句写成动态的形式,动态sql语句的核心思想是,有哪个查询条件,就动态的在where关键字后面挂载哪个查询条件

String sql = “select * from tbl”;
if(name != null) {
sql += “where name like ?”;
}
if(gender != null) {
sql += “and gender=?”;
}

where if 标签的使用:
实现代码如下:

//17.测试,动态sql where标签+if标签Student student = new Student();//student.setName("s");student.setAddress("撒");List<Student> studentList = studentDao.select17(student);for (Student s:studentList){System.out.println(s);}}

对应的mapper.xml映射:

<select id="select17" parameterType="Student" resultType="Student">select * from student<!--where标签:当where标签在使用的时候,必须要搭配where标签对中的if标签来使用当通过if标签的判断,如果有查询条件,则展现where关键字,如果没有查询条件则不展现where关键字--><where><if test="name!=null and name!= ''">name like '%' #{name} '%'</if><if test="address!= null and address!=''">and address like '%' #{address} '%'</if></where></select>

foreach标签的使用:
实现代码如下:

		//18.测试:动态sql foreach标签//查询编号为A0001,A0002,A0003的学员信息String strArr[] = {"A0001", "A0002", "A0003"}; //前端往后端传用数组,后端往前端传用集合List<Student> studentList = studentDao.select18(strArr);for (Student student : studentList) {System.out.println(student);}

对应的mapper.xml映射文件:

	<select id="select18" resultType="Student">select * from studentwhere id in<!--foreach标签:用来遍历传递来的数组参数collection:标识传递参数的类型array:数组List:集合item:每一次遍历出来的元素,在使用该元素的时候,需要用在#{}中open:拼接循环开始符号close:拼接循环结束的符号separator:元素与元素之间的分割符--><foreach collection="array" item="id" open="("  close=")" separator=",">#{id}</foreach></select>

mybatis中的sql片段的使用:
实现代码如下:

		//19.测试:sql片段Student s = studentDao.select19("A0001");System.out.println(s);

对应的mapper.xml映射:

	<!--使用sql标签制作sql片段sql片段的作用是用来代替sql语句中的代码如果你的mapper映射文件中的sql语句某些代码出现了大量的重复,我们可以使用sql片段来代替他们id:sql片段的唯一标识,将来找到sql片段使用id来进行定位将来的实际项目开发中,使用sql片段用来代替重复率高,且复杂的子查询select * from studentwhere name=(select xxxxxxxxxx(select .....))注意:对于sql片段在同一个mapper下,大量的出现重复的子查询的几率不高,所以一般情况下没有使用sql片段的必要在实际项目开发中,如果你大量的使用sql片段,会大大的降低sql语句的可读性在很多企业中,干脆摒弃使用sql片段的机制--><sql id="sql1">select * from student</sql><select id="select19" resultType="Student"><include refid="sql1"/> where id=#{id}</select>

Mybatis多表联查

关联学生表和班级表:

  1. 查询出学生姓名和班级名称
    新建班级表:
    新建班级表
    班级表的信息
    实现代码如下:
		//20.测试:多表联查  查询出学生姓名和班级名称//多表联查返回的数据有时候不能用domain来返回,所以最好用mapList<Map<String,Object>> mapList = studentDao.select20(); for (Map<String,Object> map:mapList){Set<String> set = map.keySet();   //key不可重名for (String key:set){System.out.println("key:"+key);System.out.println("value:"+map.get(key));}System.out.println("--------------------------------------------------");}

对应mapper.xml映射文件如下:

	<select id="select20" resultType="map">selects.name as sname,c.name as cnamefrom student sjoin  classroom con s.classroomId=c.id</select>
  1. 查询出学生和班级所有信息,加VO(Value Object)
    实现代码如下:
		//21.测试:多表联查 查询出学生和班级所有信息,加VO/** 在实际项目开发中,如果需要为前端展现的数据,使用一个domain类型不足以表现出来这些数据* 这时,我们可以考虑使用两种技术来实现* 分别为:*   使用map以及使用vo** 例如我们现在的需求*      查询出学生和班级所有信息*      得到的结果  使用学生的domain或者班级的domain都不能够封装这些结果*      所以我们可以使用map去保存这些信息*      同时我们也可以使用vo类来保存这些信息**      vo指的是创建出来一个类,这个类中的属性是完全由我们自己去定义,属性会保存所有需要展现的信息,*      例如我们现在的这个例子,我们可以使用vo来封装所有与学生和班级相关的信息**      vo*           student*           classroom* */List<StudentAndClassroomVo> voList = studentDao.select21();for (StudentAndClassroomVo vo:voList){System.out.println(vo);}

对应的mapper.xml映射文件为:

 	<select id="select21" resultType="com.sinosoft.vo.StudentAndClassroomVo">selects.id sid,s.name sname,s.age sage,s.address saddress,c.id cid,c.name cnamefrom student sjoin classroom con s.classroomId=c.id</select>
  1. 查询出带有字母Z的学生和班级所有信息
    实现代码如下:
		//22.测试:多表联查 查询出带有字母z的学生和班级所有信息List<StudentAndClassroomVo> voList = studentDao.select22("s");for (StudentAndClassroomVo vo:voList){System.out.println(vo);}/** 实际项目开发中,如果要为前端同时提供多组值,那么我们应该使用map还是vo呢?* 如果前端的需求的重复率不高,那么我们选择临时使用map就可以了* 如果前端对于该需求的重复率较高,那么我们可以创建一个vo类来使用,非常方便* */

对应的mapper.xml映射文件:

	<select id="select22" resultType="com.sinosoft.vo.StudentAndClassroomVo">selects.id sid,s.name sname,s.age sage,s.address saddress,c.id cid,c.name cnamefrom student sjoin classroom con s.classroomId=c.idwhere s.name like '%' #{name} '%'</select>

Mybatis工具包(ServiceFactory等)

工具包
SqlSessionUtil的实现代码如下:

package com.sinosoft.util;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;public class SqlSessionUtil {private SqlSessionUtil(){}private static  SqlSessionFactory sqlSessionFactory;static {String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}private static ThreadLocal<SqlSession> t = new ThreadLocal<SqlSession>();  //因为在声明的时候已经确定好了泛型,创建对象的时候jvm会自动进行类型转换//取得sqlsession对象public static SqlSession getSession(){SqlSession session = t.get();if (session == null){session = sqlSessionFactory.openSession();t.set(session);}return session;}//关闭sqlsession对象public static void myClose(SqlSession session){if(session != null){session.close();t.remove(); //这句必须加,非常容易忘,不然会在ThreadLocal存在遗留}}}

TransactionInvocationHandler的代码实现如下:

package com.sinosoft.util;import org.apache.ibatis.session.SqlSession;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class TransactionInvocationHandler implements InvocationHandler {//target:zsprivate Object target;public TransactionInvocationHandler(Object target){this.target = target;}//代理类的业务方法//代表李四的表白方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {SqlSession session = null;Object obj = null;try{session = SqlSessionUtil.getSession();//处理业务逻辑//method.invoke,代表张三的表白方法obj = method.invoke(target,args);//处理业务逻辑完毕后,提交事务session.commit();}catch(Exception e){session.rollback();e.printStackTrace();}finally {SqlSessionUtil.myClose(session);}return obj;}//取得李四对象public Object getProxy(){//取得代理类对象return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}
}

ServiceFactory的代码实现如下:

package com.sinosoft.util;public class ServiceFactory {//传递张三对象,得到李四对象的过程public static Object getService(Object service){return new TransactionInvocationHandler(service).getProxy();}
}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. .Net 面试题 汇总(五)

    1、简述javascript中的“、、”的区别&#xff1f; 赋值 比较是否一般相等 "3"3 //会做类型的隐式转换&#xff0c;true 比较是否严格相等 "3"3 //先比较类型,再进行值比较&#xff0c;false 2、看下列代码输出为何&#xff1f;解释原因var a null;alert(…...

    2024/4/20 18:54:07
  2. 前端知识总结大全

    ~XML~ ~Extensible Markup Language~ ~可扩展的标记语言~ 1:历史1998年由w3c推出&#xff0c;专门用来负责数据的封装和传输&#xff0c;和html不同&#xff08;html主要用来负责数据的展示&#xff0c;而xml就像一个仓库一样仅仅负责数据封装&#xff09;&#xff0c;xml没有任…...

    2024/4/20 18:54:06
  3. .net知识

    1、简述javascript中的“、、”的区别&#xff1f; 赋值 比较是否一般相等 "3"3 //会做类型的隐式转换&#xff0c;true 比较是否严格相等 "3"3 //先比较类型,再进行值比较&#xff0c;false 2、看下列代码输出为何&#xff1f;解释原因var a null;ale…...

    2024/4/20 18:54:05
  4. 弄双眼皮哪种最好呢

    ...

    2024/5/8 17:17:23
  5. 前端技术盘点以及 2016 年技术发展方向

    09 年之前&#xff0c;JavaScript 还处于对自身语言的完善过程中&#xff0c;而到了 09年&#xff0c;JavaScript 类库已经颇为成熟&#xff0c;jQuery/Prototype//Dojo等都已经发布了好几个stable版本&#xff0c;各大类库也是相互吸收优点&#xff0c;不断完善并提高自身性能…...

    2024/4/21 7:13:06
  6. .Net学习总结

    第1阶段WEB前端A&#xff1a;HTML&CSS基础 1.前端页面有哪三层构成&#xff0c;分别是什么&#xff1f;作用是什么? a.结构层&#xff1a;由 HTML 或 XHTML 之类的标记语言负责创建&#xff0c;仅负责语义的表达。解决了页面”内容是什么”的问题。 b.表示层&#xff1a;由…...

    2024/4/21 7:13:05
  7. jsp开发在线聊天系统源代码下载

    原文:jsp开发在线聊天系统源代码下载源代码下载地址:http://www.zuidaima.com/share/1550463726832640.htm这个java的聊天系统,功能简单,有具体的操作形式.首页:http://localhost:端口/项目名称/index.jsp聊天页在firefox下登陆后有bug,在chrome下没问题,大家注意下。另外…...

    2024/4/21 7:13:05
  8. 近几年前端技术盘点以及 2016 年技术发展方向

    Web 发展了几十个春秋&#xff0c;风起云涌&#xff0c;千变万化。我很庆幸自己没有完整地经历过这些年头&#xff0c;而是站在前人的肩膀上行走。Web 技术发展的速度让人感觉那几乎不是继承式的迭代&#xff0c;而是一次又一次的变革&#xff0c;一次又一次的创造。这几年的前…...

    2024/4/21 7:13:04
  9. mysql 创建索引,删除索引的sql语句 【转】

    create unique index customer_info_index1 on customer_info(number);--创建唯一索引create index customer_info_index2 on customer_info(name);--创建索引drop index user_info_index1 on user_info; --删除索引mysql查询表结构的语句show columns from talbe_name;...

    2024/4/21 7:13:02
  10. .NET面试宝典

    第1阶段&#xff1a;HTML&c#基础 1、简述 private、 protected、 public、 internal 修饰符的访问权限。 private : 私有成员, 在类的内部才可以访问。 protected : 保护成员&#xff0c;该类内部和继承类中可以访问。 public : 公共成员&#xff0c;完全公开&#xff…...

    2024/4/21 7:13:01
  11. 切开双眼皮一般做多宽的

    ...

    2024/4/21 7:13:01
  12. 初中级程序员面试题

    自己整理的&#xff0c;也有摘自网络上的&#xff0c;如有侵权&#xff0c;请联系&#xff0c;我及时删除。1、简述javascript中的“、、”的区别&#xff1f; 赋值 比较是否一般相等 "3"3 //会做类型的隐式转换&#xff0c;true 比较是否严格相等 "3"3 …...

    2024/4/21 7:12:59
  13. ASP.NET基础

    1、请解释ASP。NET中的web页面与其隐藏类之间的关系&#xff1f; 一个ASP.NET页面一般都对应一个隐藏类&#xff0c;一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明如下&#xff1a; <% Page language"c#" Codebehind"Tst1.aspx…...

    2024/5/8 21:49:13
  14. 做窄双眼皮埋线重庆疗华美

    ...

    2024/4/21 7:13:02
  15. 面试-1

    面试-1 面试-1 1、简述 private、 protected、 public、 internal 修饰符的访问权限。 private : 私有成员, 在类的内部才可以访问。 protected : 保护成员&#xff0c;该类内部和继承类中可以访问。 public : 公共成员&#xff0c;完全公开&#xff0c;没有访问限制。 interna…...

    2024/4/20 10:42:09
  16. 面试-5

    .NET面试宝典 1、简述 private、 protected、 public、 internal 修饰符的访问权限。 private : 私有成员, 在类的内部才可以访问。 protected : 保护成员&#xff0c;该类内部和继承类中可以访问。 public : 公共成员&#xff0c;完全公开&#xff0c;没有访问限制。 internal…...

    2024/4/21 7:12:56
  17. HTML5BASIC_day01

    1、HTMLCSSUI2、Javascript3、HTML5COREAJAXJquery4、Bootstrap,Angular JS其他框架 1、HTMLCSS3BASICPROUIPROCSS3CORE1、Internet 1&#xff09;什么是Internet&#xff1f; ---是全球性计算机互联网络&#xff0c;是由若干终端(PC,移动端)以及 特殊的传输介质而组成的一个网…...

    2024/4/21 7:12:55
  18. 东大 熊猛 内双有时出现双眼皮一有一没的

    ...

    2024/4/21 7:12:53
  19. 腾讯手机QQ兴趣部落使用的Abstract.js框架初探

    #导言 手机QQ的兴趣部落是一个类似百度贴吧的兴趣导向社区平台&#xff0c;在手机QQ上拥有与QQ空间同等地位的入口位置&#xff0c;上线一年以来利用手机QQ的庞大活跃用户量也已经有了一定程度的规模&#xff0c;同时也推出了PC端网页版本&#xff0c;在百度贴吧过度商业化以至…...

    2024/4/21 7:12:53
  20. javascript 新兴的API

    javascript 新兴的API 分类&#xff1a; javascript2012-12-31 16:02 215人阅读 评论(0) 收藏 举报很多的API都有着特定的前缀&#xff0c;例如微软的ms&#xff0c;谷歌和safari的webkit。这些新兴的API去掉前面的前缀后&#xff0c;剩下的部分是一样的。 requestAnimationFra…...

    2024/4/20 18:54:12

最新文章

  1. C51版本Keil + STC-ISP 实现第一盏灯,从创建到实现

    创建项目 1. 新建项目 Project -> New uVision Project 2.1 新建文件夹 2.2 输入文件名称, 并保存 3.1 选择当前位STC芯片的开发板&#xff0c;选择STC MCU Database 搜素具体芯片型号&#xff0c;进行配置&#xff1a; 3.2 选择通过搜索框搜索到stc相关芯片信息 如果st…...

    2024/5/8 22:55:52
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/7 10:36:02
  3. 基于ArrayList实现简单洗牌

    前言 在之前的那篇文章中&#xff0c;我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此&#xff0c;便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间&#xff0c;并且可以动态扩容&#xff0c;是一个动态类型的顺序表&…...

    2024/5/8 3:12:43
  4. CTK插件框架学习-事件监听(04)

    CTK插件框架学习-插件注册调用(03)https://mp.csdn.net/mp_blog/creation/editor/136989802 一、主要流程 发送者注册消息事件接收者订阅消息事件接收者相应消息事件 事件监听比插件接口调用耦合性更弱&#xff0c;事件由框架维护&#xff0c;不需要指定发送方和接收方 二、…...

    2024/5/6 8:34:00
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/8 6:01:22
  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/7 14:25:14
  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/7 11:36:39
  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/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

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

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

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

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

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

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

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

    2024/5/8 20:38:49
  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