day01-MyBatis

学习目标

  • 能够了解什么是框架
  • 掌握Mybatis框架开发快速入门
  • 掌握Mybatis框架的基本CRUD操作
  • 掌握Mybatis的参数深入
  • 掌握SqlMapConfig.xml配置文件

第一章-框架概述

知识点-框架概述

目标:能够了解什么是框架

路径

  1. 什么是框架
  2. 框架要解决的问题
  3. 分层开发下的常见框架

讲解

什么是框架

​ 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构建及构建实例间交互的方法,另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从墓地方面给出的定义

简而言之,框架是软件(系统)的半成品,框架封装了很多的细节,使开发者可以使用简单的方式实现功能,大大提高开发效率

​ eg:开发项目当做表演节目,框架当做舞台,我们开发者当做演员,演员不需要关注舞台怎么搭建的,关注点在于怎么把节目表演的好看

框架要解决的问题

​ 框架要解决的最重要的一个问题是 技术整合的问题,在J2EE的框架中,有着各种各样的技术,不同的软件企需要从J2EE中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险将会直接对应用造成冲击.而应用是软件企业的核心,是竞争力的关键所在,因此应该讲应用自身的设计和具体的实现技术解耦.这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术是应用的底层支撑,他不应该直接对应用产生影响

​ 框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层

分层开发下的常见框架

​ 通过分层更好的实现了各个部分的职责,在每一层将再细化出不同的框架,分别解决各层关注的问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DjJzp8v6-1594173442917)(F:\Nickcode\NoteImage\image-20200706215752404.png)]

小结

  1. 框架:软件半成品,封装了很多细节,让我们开发项目更加的快速和高效
  2. 三层架构下面常见架构
    • web层:Struts2.SpringMVC
    • 业务层:Spring
    • 持久层:Hibernate,MyBatis

知识点-MyBatis框架概述

目标:能够了解什么是MyBatis

路径

  1. jdbc程序回顾
  2. MyBatis框架概述

3.讲解

3.1jdbc 程序回顾

3.1.1程序回顾
  • 注册驱动
  • 获得连接
  • 创建预编译sql语句对象
  • 设置参数,执行
  • 处理结果
  • 释放资源
public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//1.加载数据库驱动 Class.forName("com.mysql.jdbc.Driver");//2.通过驱动管理类获取数据库链接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123456");//3.定义 sql 语句 ?表示占位符  String sql = "select * from user where username = ?";//4.获取预处理 statementpreparedStatement = connection.prepareStatement(sql);//5.设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值preparedStatement.setString(1, "王五");//6.向数据库发出 sql 执行查询,查询出结果集resultSet = preparedStatement.executeQuery();//7.遍历查询结果集while (resultSet.next()) {System.out.println(resultSet.getString("id") + ""+resultSet.getString(" username"));}} catch (Exception e) {e.printStackTrace();} finally {//8.释放资源if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}

jdbc问题分析

  1. 数据库创建连接,释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可以解决此问题
  2. Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql改动需要改变java代码
  3. 使用preparedStatement向占位符传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护
  4. 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便

MyBatis框架概述

MyBatis是一个优秀的基于java的持久层框架,它内部封装了 jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动,创建连接,创建statement等繁杂的过程

​ MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql1的动态参数进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为java对象并返回

​ 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc.api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作

官网: http://www.mybatis.org/mybatis-3/

小结

  1. 为什么要学习MyBatis?

    ​ 不管是JDBC还是JDBCTemplate都有一些缺点,在MyBatis都进行了解决

    ​ 工作里面Dao以MyBatis或者SpringDataJPA为主

  2. 什么是MyBatis?

    ​ 是持久层的一个框架,封装了JDBC,用MyBatis操作数据库,性能很优秀,可以让SQL和java代码分离

第二章-MyBatis入门

案例-MyBatis快速入门

需求:使用MyBatis查询所有的用户,封装到List集合

分析

​ 0.创建数据库

  1. 创建Maven工程(jar),添加坐标
  2. 创建pojo
  3. 创建Dao接口
  4. 创建Dao映射文件(编写sql语句)
  5. 创建SqlMapConfig.xml(配置四个基本项)
  6. 编写Java代码操作数据库

实现

准备工作

  • 数据库

    CREATE DATABASE day01_mybatis;
    USE day01_mybatis;
    CREATE TABLE t_user(uid int PRIMARY KEY auto_increment,username varchar(40),sex varchar(10),birthday date,address varchar(40)
    );INSERT INTO `t_user` VALUES (null, 'zs', '男', '2018-08-08', '北京');
    INSERT INTO `t_user` VALUES (null, 'ls', '女', '2018-08-30', '武汉');
    INSERT INTO `t_user` VALUES (null, 'ww', '男', '2018-08-08', '北京');
    
  • 创建maven工程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yzil3A9Y-1594173442923)(…/…/…/…/Nickcode/NoteImage/1594100571268.png)]

  • 导入坐标

      <dependencies><!--MyBatis坐标--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!--单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies>
    
  • 创建User实体类 User.java

    package com.itheima.bean;import java.io.Serializable;
    import java.util.Date;public class User implements Serializable {private int uid; //用户idprivate String username;// 用户姓名private String sex;// 性别private Date birthday;// 生日private String address;// 地址public User() {}public User(int uid, String username, String sex, Date birthday, String address) {this.uid = uid;this.username = username;this.sex = sex;this.birthday = birthday;this.address = address;}public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"uid=" + uid +", username='" + username + '\'' +", sex='" + sex + '\'' +", birthday=" + birthday +", address='" + address + '\'' +'}';}
    }
  • 创建UserDao接口

    • UserDao接口就是我们的持久层接口(也可以写成UserMapper),我们就写成UserDao,具体代码如下:
    public interface UserDao {public List<User> findAll();
    }
  • 创建UserDao.xml映射文件

    • 注意:该文件放在com/itheima/dao里面,不要写成com.itheima.dao

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oioCYJrC-1594173442926)(…/…/…/…/Nickcode/NoteImage/1594100869346.png)]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--namespace属性:接口的全限定类名-->
    <mapper namespace="com.itheima.dao.UserDao"><!--select标签:查询id属性:方法名resultType:写方法返回值类型(如果是list,直接写类的全限定名)标签体:sql语句--><select id="findAll" resultType="com.itheima.bean.User">select * from t_user;</select>
  • 创建SqlMapConfig.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><!--配置连接数据库的环境 default:指定使用哪一个环境--><environments default="development"><environment id="development"><!--配置事务:MyBatis事务使用的是JDBC--><transactionManager type="JDBC"/><!--配置连接池:POOLED(使用连接池,MyBatis内置的) UNPOOLED(不使用连接池--><dataSource type="POOLED"><!--四个基本项--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/day01_mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--引入映射文件,resource属性:映射文件的路径--><mapper resource="com/itheima/dao/UserDao.xml"/></mappers>
    </configuration>
    
  • 测试

    public class DbTest {@Testpublic void fun01() throws IOException {//1.读取SqlMapConfig.xml获得输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(is);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.获得UserDao代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//5.调用方法List<User> list = userDao.findAll();System.out.println(list);//6.释放资源sqlSession.close();is.close();}}

小结

步骤

  1. 创建Maven工程,导入坐标(需要驱动坐标)
  2. 创建pojo
  3. 创建Dao接口
  4. 创建Dao映射文件(sql语句)
  5. 创建SqlMapConfig.xml主配置文件(四个基本项+导入映射文件)
  6. 编写java代码

注意事项

  1. 需要导入驱动坐标
  2. Dao映射文件目录应该写/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lAeMm97-1594173442929)(…/…/…/…/Nickcode/NoteImage/1594101175541.png)]

知识点-Mapper动态代理方式规范

目标:掌握Mapper动态代理方式规范

路径

  1. 入门案例回顾
  2. 规范
  3. Java代码里面用到的设计模式

讲解

  • 入门案例回顾

    • Mapper.xml(映射文件)

      ​ 定义mapper映射文件UserDao.xml,需要修改namespace的值为UserDao接口全限定名.将UserDao.xml放在classpath的xxx.xxx.dao目录下

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpVPhmYM-1594173442931)(…/…/…/…/Nickcode/NoteImage/1594101591803.png)]

    • Mapper.java(dao接口)

    public interface UserDao {/*** 查询所有的用户* @return*/public List<User> findAll();
    }
    • 测试
    public class DbTest {/*** 查询所有用户信息* @throws IOException*/@Testpublic void fun01() throws IOException {//1.读取SqlMapConfig.xml获得输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(is);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.获得UserDao代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//5.调用方法List<User> list = userDao.findAll();System.out.println(list);//6.释放资源sqlSession.close();is.close();}}
    

代理方式规范

Mapper接口开发需要遵循以下规范:

  1. Mapper.xml文件中的namespace必须和mapper(Dao)接口的全限定名相同
  2. Mapper.xml文件中的select,update等标签id的值必须和mapper(Dao)接口的方法名相同
  3. Mapper.xml文件中的select,update等标签的parameterType必须和mapper(Dao)接口的方法的形参类型相对应
  4. Mapper.xml文件中select,update等标签的resultType必须和mapper(Dao)接口的方法的返回值类型对应
  5. Mapper.xml文件的文件名尽量和mapper(Dao)接口的名字一样
  6. Mapper.xml文件的路径尽量和mapper(Dao)接口的路径在同一层目录

java代码里面的设计模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pfrGRwi-1594173442934)(…/…/…/…/Nickcode/NoteImage/1594102388038.png)]

小结

  • 代理方式规范
    • dao映射文件里面的namespace必须写到接口类的全限定名
    • dao映射文件select,update标签的id属性必须写dao接口里面的方法名
    • dao映射文件select,update标签的parameterType属性必须和到接口里面的方法里面形参类型一致
    • dao映射文件select,update标签的parameterType属性必须和到接口里面的方法里面返回值类型一致
    • dao映射文件的名字尽量和到接口名一样
    • dao映射文件的路径尽量和接口路径的层级一致

知识点-核心配置文件详解

目标:掌握SqlMapConfig.xml配置文件

路径

  1. 核心配置文件的顺序
  2. properties
  3. typeAliases
  4. Mapper

讲解

核心配置文件的顺序

configuration(配置)

  • properties(引入外部properties文件)
  • settings(全局配置参数)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境集合属性对象)
    • environment(环境子属性对象)
      • transactionManager(事务管理器)
      • dataSource(数据源)
  • databaseIdProvider(数据库厂商标识)
  • mappers(映射器)

properties

步骤:

  1. 抽取四个基本项到jdbc.properties
  2. 在SqlMapConfig.xml使用properties标签引入jdbc.properties
  3. 动态获得赋值
  • jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/day01_mybatis?characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=root
    
  • 引入到核心配置文件

    <configuration><!--配置连接数据库的环境 default:指定使用哪一个环境--><properties resource="jdbc.properties"></properties><environments default="development"><environment id="development"><!--配置事务:MyBatis事务使用的是JDBC--><transactionManager type="JDBC"/><!--配置连接池:POOLED(使用连接池,MyBatis内置的) UNPOOLED(不使用连接池--><dataSource type="POOLED"><!--四个基本项--><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><!--引入映射文件,resource属性:映射文件的路径--><mapper resource="com/itheima/dao/UserDao.xml"/></mappers>
    </configuration>
    

typeAliases(类型别名)

定义单个别名(了解)
  • 核心配置文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80fzcY15-1594173442935)(…/…/…/…/Nickcode/NoteImage/1594104245808.png)]

  • 修改修改UserDao.xml(映射文件)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHMIFoM6-1594173442936)(J:/study/JavaWeb/day41_travel/img/1594104212587.png)]

批量定义别名(重点)

使用package定义的别名: 就是pojo的类名,大小写都可以

  • 核心配置文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTyWwkv3-1594173442937)(…/…/…/…/Nickcode/NoteImage/1594105927429.png)]

  • 修改UserDao.xml(映射文件)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzYYEco3-1594173442938)(…/…/…/…/Nickcode/NoteImage/1594104629147.png)]

Mapper

方式一:引入映射文件路径

<mappers><!--引入映射文件,resource属性:映射文件的路径--><mapper resource="com/itheima/dao/UserDao.xml"/></mappers>

方式二:扫描接口

注:此方式只能用作:代理开发模式,原始dao方式不能使用

  • 配置单个接口

    <!--方式2: 接口类的全限定名 (映射文件和接口名字一致,同一级 麻烦,需要导多个)--><mapper class="com.itheima.dao.UserDao"/>
    
  • 批量配置

    <!--方式3: 直接写包名(映射文件和接口名字一致,同一级 )--><package name="com.itheima.dao"/>
    

小结

  1. 顺序

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FnE0AV0u-1594173442940)(…/…/…/…/Nickcode/NoteImage/1594106187191.png)]

  2. properties(属性)

    • 定义jdbc.properties,建议这个key写前缀

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XdC6dug-1594173442941)(…/…/…/…/Nickcode/NoteImage/1594106274813.png)]

  3. typeAliases

    • 批量取别名
    <typeAliases><!--方式二: 批量取别名, 以包为单位;
    name属性: 包名 【当前包里面的所有的类都有别名了, 别名就是类的名字, 忽略大小写, 建议直接写类名】
    --><package name="com.itheima.bean"/></typeAliases>
    

    建议直接写类名

  4. mappers

    • 批量导入映射

      <mappers><!--方式1:引入映射文件,resource属性:映射文件的路径--><!--<mapper resource="com/itheima/dao/UserDao.xml"/>--><!--方式2: 接口类的全限定名 (映射文件和接口名字一致,同一级 麻烦,需要导多个)--><!--<mapper class="com.itheima.dao.UserDao"/>--><!--方式3: 直接写包名(映射文件和接口名字一致,同一级 )--><package name="com.itheima.dao"/></mappers>
      

      映射文件和接口名字一致,同一级

第三章-MyBatis进阶

案例-使用MyBatis完成CRUD

需求:使用MyBatis完成CRUD

分析

  1. 查询 定义select标签
  2. 更新 定义update标签
  3. 删除 定义delete标签
  4. 增加 定义insert标签

标签里面的id属性就写方法名

标签体里面就写sql语句

标签里面的parameterType要和方法的参数类型一致

标签里面的resultType要和方法的返回值类型一致

实现

新增用户

实现步骤
  • UserDao中添加新增方法

    /*** 新增用户* @param user*/void add(User user);
    
  • 在UserDao.xml文件中加入新增配置

    <!--新增用户 parameterType属性: 参数的类型; 赋值的时候直接写对象里的属性名 --><insert id="add" parameterType="com.itheima.bean.User" >insert into t_user(username,sex,birthday,address) values (#{username},#{sex},#{birthday},#{address});</insert><!--我们可以发现,这个**sql**语句中使用**#{}**字符, #{}代表占位符,我们可以理解是原来**jdbc**部分学来的**?**, 他们都是代表占位符, 具体的值是由**User**类的**username**属性来决定的parameterType** 属性: 代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称
    -->
    
  • 测试类中的测试方法

    /*** 新增用户* @throws IOException*/@Testpublic void fun02() throws IOException {//1.读取SqlMapConfig.xml获得输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(is);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.获得UserDao代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//5.调用方法User user = new User("张三丰", "男", new Date(), "武当山");userDao.add(user);//想获得保存user的id【需要取到数据库里面保存的id, 需要配置】System.out.println(user.getUid());sqlSession.commit();//6.释放资源sqlSession.close();is.close();}
    
新增用户id1的返回值

​ 新增用户后,同时还要返回当前新增用户的id值,因为id是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长 auto_increment 的值来返回

  • 方式一 SelectKey获取主键
属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性。
resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。

UserDao.xml

    <!--parameterType属性: 参数的类型 ;  赋值的时候直接写对象里面的属性名--><insert id="save" parameterType="com.itheima.bean.User"><!--presultType: 主键类型; keyProperty:pojo里面对应的id的属性名; order属性: 指定是在目标的sql语句之前还是之后执行 --><selectKey resultType="int" keyProperty="uid" order="AFTER">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO t_user(username,sex,birthday,address)VALUES(#{username},#{sex},#{birthday},#{address})</insert>
  • 方式二属性配置

    UserDao.xml

<insert id="add" parameterType="com.itheima.bean.User" keyProperty="uid" useGeneratedKeys="true">insert into t_user(username,sex,birthday,address) values (#{username},#{sex},#{birthday},#{address});</insert>
新增用户id的返回值(字符串类型)
<insert id="add" parameterType="com.itheima.bean.User" keyProperty="uid" useGeneratedKeys="true">insert into t_user(username,sex,birthday,address) values (#{username},#{sex},#{birthday},#{address});</insert>

修改用户

  • UserDao添加修改方法

    public interface UserDao {/*** 更新用户* @param user*/void  update(User user);
    }
    
  • 在UserDao.xml文件加入修改配置

    <!--修改用户--><update id="update" parameterType="com.itheima.bean.User">UPDATE t_user SET username=#{username},sex=#{sex},birthday= #{birthday},address= #{address} where uid = #{uid};</update>
    
  • 测试类的方法

    /*** 修改用户信息* @throws IOException*/@Testpublic void fun03() throws IOException {//1.读取SqlMapConfig.xml获得输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(is);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.获得UserDao代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//5.调用方法User user = new User("王不二","女",new Date(),"广西");user.setUid(1);userDao.update(user);sqlSession.commit();//6.释放资源sqlSession.close();is.close();}
    

删除用户

  • UserDao中添加删除方法

    public interface UserDao {/*** 删除用户* @param uid*/void delete(int uid);
    }
    
  • 在 UserDao.xml 文件中加入新增配置

    <!--删除用户--><delete id="delete" parameterType="int">DELETE FROM t_user WHERE uid = #{uid};</delete>
    
  • 添加测试类中的测试方法

    /*** 删除用户* @throws IOException*/@Testpublic void fun04() throws IOException {//1.读取SqlMapConfig.xml获得输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(is);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.获得UserDao代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//5.调用方法userDao.delete(7);sqlSession.commit();//6.释放资源sqlSession.close();is.close();}
    

模糊查询

方式一:
  • UserDao中添加查询方法

    public interface UserDao {/*** 模糊查询* @param firstName* @return*/List<User> findByFirstName(String firstName);
    }
    
  • 在 UserDao.xml 文件中加入新增配置

    <!--模糊查询--><select id="findByFirstName" parameterType="string"resultType="User">select * FROM t_user where username like #{firstName};</select>
    
  • 添加测试类中的测试方法

     /*** 模糊查询* @throws IOException*/@Testpublic void fun05() throws IOException {//1.读取SqlMapConfig.xml获得输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(is);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.获得UserDao代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//5.调用方法List<User> list = userDao.findByFirstName("张%");System.out.println(list);sqlSession.commit();//6.释放资源sqlSession.close();is.close();}
    
方式二
  • UserDao中添加查询方法

    public interface UserDao {/*** 模糊查询* @param firstName* @return*/List<User> findByFirstName02(String firstName);
    }
    
  • 在 UserDao.xml 文件中加入新增配置

    <!--模糊查询--><select id="findByFirstName02" parameterType="string"resultType="User">select * FROM t_user where username like '${value}%';</select>
    

    ​ 我们在上面将原来的**#{}占位符,改成了value.:,{value}**.注意:如果用模糊查询的这种写法,那么**{value}**的写法就是固定的,不能写成其他名字

  • 添加测试类中的测试方法

    /*** 模糊查询* @throws IOException*/@Testpublic void fun06() throws IOException {//1.读取SqlMapConfig.xml获得输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(is);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.获得UserDao代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//5.调用方法List<User> list = userDao.findByFirstName02("张");System.out.println(list);sqlSession.commit();//6.释放资源sqlSession.close();is.close();}
    
  • 注意:有test测试包的前提下,此src/test/java下的包名需要与src/main/java里边定义的包名一致。

#{}与${}的区别(面试)
  1. **#{}**表示一个占位符
    • 通过**#{}**可以实现preparedStatement向占位符设置值,自动进行java类型和数据库类型的转换
    • #{} 可以防止sql注入
    • **#{}**可以接收简单类型值(基本类型,String)或pojo属性值
    • 如果parameterType传输单个简单类型值(基本类型,String),**#{}**括号中可以是value或其他任意名称
  2. **${}**表示拼接sql串
    • 通过**${}**可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换
    • **${}**不能防止sql注入
    • **${}**可以接收简单类型值或pojo属性值
    • 如果parameterType传输单个简单类型值,${}括号中只能是value

工具类的抽取

public class MyBatisUtil {private static SqlSessionFactoryBuilder builder;private static SqlSessionFactory sqlSessionFactory;static {//1.读取SqlMapConfig.xml获得输入流InputStream is = null;try {is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SqlSessionFactorybuilder = new SqlSessionFactoryBuilder();sqlSessionFactory = builder.build(is);} catch (IOException e) {e.printStackTrace();} finally {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 获得SqlSession* @return*/public static SqlSession openSqlSession(){//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();return sqlSession;}/*** 释放资源* @param sqlSession*/public static void close(SqlSession sqlSession){if (sqlSession != null){sqlSession.close();}}
}

小结

CRUD

  1. 新增 insert标签
  2. 删除 delete标签
  3. 修改 update标签
  4. 查询 select标签
  5. 获得主键 selectKey标签或者insert标签配置属性(keyProperty,useGeneratedkeys)

注意事项

  • 通过**,(,),{}**获得的值,参数类型是简单类型(字符串,基本类型),必须写 **{value}**

知识点-parameterType深入

目标:掌握MyBatis的参数深入(parameterType)

路径

  1. 传递简单类型
  2. 传递pojo对象
  3. 传递pojo包装对象类型

讲解

传递简单类型

  • 基本的类型,字符串
  • 直接写**#{任意字段}或者${value}**

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ar1ET6YS-1594173442942)(F:\Nickcode\NoteImage\image-20200707205846520.png)]

传递pojo对象

MyBatis使用ognl表达式解析对象字段的值,#{} 或者**${}**括号中的值为pojo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HiPlpvwD-1594173442943)(F:\Nickcode\NoteImage\image-20200707210106618.png)]

传递pojo包装对象类型

​ 开发中通过pojo传递查询条件,查询条件是 综合的查询条件,不仅包括用户查询条件还包括其他的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数.Pojo类中包含pojo

京东查询的例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCjE16us-1594173442945)(F:\Nickcode\NoteImage\1539830569011.png)]

需求:根据用户id查询用户信息,查询条件放到QueryVo的user属性中

  • QueryVo
public class QueryVo {private User user;public void setUser(User user) {this.user = user;}public User getUser() {return user;}
}
  • UserDao接口
public interface UserDao {/*** 复杂参数查询* @return*/List<User> findByQueryVo(QueryVo queryVo);}
  • UserDao.xml文件
<mapper namespace="com.itheima.dao.UserDao"><select id="findByQueryVo" resultType="com.itheima.bean.User" parameterType="com.itheima.bean.QueryVo">SELECT * FROM t_user WHERE uid > #{user.uid}</select>
</mapper>
  • 测试代码
   @Testpublic void fun01() throws Exception {SqlSession sqlSession = SqlSessionFactoryUtils.openSession();UserDao userDao = sqlSession.getMapper(UserDao.class);QueryVo queryVo = new QueryVo();User user = new User();user.setUid(2);queryVo.setUser(user);List<User> list = userDao.findByQueryVo(queryVo);System.out.println(list);sqlSession.close();}

小结

  1. 传递简单类型 #{任意字段}或者${value}
  2. 传递pojo对象 **#{pojo属性名}**或者#{pojo属性名}
  3. 传递pojo包装对象类型 #{pojo对象名.属性名}

知识点_resultType深入

目标:掌握MyBatis的参数深入(resultType)

路径

  1. 输出简单类型
  2. 输出pojo类型
  3. 输出pojo列表
  4. resultMap结果类型

讲解

输出简单类型

​ 直接写对应的Java类型.eg:返回int

<select id="findCount" parameterType="int" resultType="int">SELECT  COUNT(*) FROM t_user
</select>

输出pojo]对象

直接写当前pojo类的全限定名.eg:返回User

<select id="findByUid" parameterType="int" resultType="com.itheima.bean.User">select * from t_user where uid = #{uid}
</select>

输出pojo列表

直接写出当前pojo类的全限定名.eg:返回Listlist

<select id="findAll" resultType="com.itheima.bean.User">select * from t_user
</select>

resultMap结果类型

​ resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功.

​ 如果sql查询列名和pojo的属性名不一致,可以通过resultMap将字段名和属性作为一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中

​ resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询.

​ 通过改别名的方式,现在返回结果集的列名已经与Use类的属性名不同了

select uid uid_,username username_,birthday birthday_,sex sex_,address address_ from t_user where uid = #{id}
  • UserDao.java
public interface UserDao {/*** 根据uid查询* @param uid* @return*/User findByUid(int uid);}
  • UserDao.xml

    <!--根据uid查询--><select id="findByUid" parameterType="int" resultMap="findByUidMap">select uid uid_,username username_,birthday birthday_,sex sex_,address address_ from t_user where uid = #{id}</select><resultMap id="findByUidMap" type="com.itheima.bean.User"><id property="uid" column="uid_"></id><result property="username" column="username_"></result><result property="birthday" column="birthday_"></result><result property="sex" column="sex_"></result><result property="address" column="address_"></result></resultMap><!--id:此属性表示查询结果集的唯一标识,非常重要.如果多个字段为复合唯一约束则定义多个idtype:当前resultMap封装后返回的结果property:表示User类的属性column:表示sql查询出来的字段名.(column和property放在一块表示将sql查询出来的字段映射到指定的pojo类属性上)-->
    

小结

  1. 输出简单类型 直接写类型名 eg:int,String
  2. 输出pojo对象 直接写pojo对象类型 eg:User
  3. 输出pojo列表 写列表的泛型的类型 eg:List 写User不是写List
  4. resultMap结果类型
    • 处理查询出来的列名和JavaBean的属性名不一致
    • 处理复杂的映射(多表间的映射封装)
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. nacos文档

    Nacos预研 一、前言 为什么要做Spring Cloud Alibaba Nacos调研? ​ spring cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新,而其他的众多组件预计会在今年停止维护。所以急需其他的一些替代产…...

    2024/4/16 6:28:20
  2. 【HDFS篇08】NameNode故障处理

    记住,你的记忆效率=线索数量*线索质量NameNode故障处理 问题场景:只配置了一个NameNode作为主节点,当它宕掉后如何恢复数据呢? 方法一:拷贝SNN数据到NN存储数据的目录中kill -9 NameNode进程删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)rm -rf …...

    2024/4/16 6:28:15
  3. Maven报错:Failed to read artifact descriptor for xxx:jar解决过程

    Maven报错:Failed to read artifact descriptor for xxx:jar解决过程 描述:springboot+maven项目,在解决配置文件热部署的问题时,引入Spring cloud相关的包,本地测试无问题,同样的代码和jar包到内网研发环境pom报错Failed to read artifact descriptor,按照网上相关文章重…...

    2024/4/16 6:28:40
  4. DOCKER启动提示 RESPONSE FROM DAEMON: OCI RUNTIME CREATE FAILED: CONTAINER WITH ID EXISTS:XXX:UNKNOWN

    环境:Ubuntu 18.0.4Docker问题描述:系统异常重启,在启动docker容器时提示如下错误信息:其中8adf是我的容器id的头四个字母。解决办法: 1、执行find / -name "8adfcb497827c65a7c8c05dc745f206af2679f2333112570124e8d1af581a7fe"8adfcb497827c65a7c8c05dc745f20…...

    2024/5/4 7:41:58
  5. ArcGIS字段按照条件批量赋值

    基于python的字段条件批量分类赋值Reclss() 1.确定值的条件分类赋值 Script Code: def Reclass(f): if f == -1: return "A" elif f == 0: return "B" 计算时 值=函数调用 Reclass(!参数f !) 2.确定条件范围的条件赋值…...

    2024/4/16 6:29:36
  6. Niushop 成为 ThinkPHP 官方生态合作伙伴

    感谢Thinkphp官方推荐Niushop开源商城成为TP生态伙伴。ThinkPHP框架,是由上海顶想公司开发维护的MVC结构的开源PHP框架,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。Niushop开源商城全系列产品基于TP开发。安全、稳定、高效。也是TP生态圈重…...

    2024/4/17 15:33:49
  7. 程序人生 - 程序员学习新技术是要看书还是看视频?

    视频地址:https://video.csdnimg.cn/0f4a616cbc62480bab20710413c3c5bc/abfa514e8c96d43efe38634e11cdd1eb-ld.mp4?auth_key=1594172474-7599af75b3ab430a987a8c8d4345e775-0-72a46890537a629f6ad4fd750596bfdc...

    2024/4/7 15:01:56
  8. Jenkins集成GitLab

    Jenkins免密拉取GitLab项目 1.在Jenkins上为GitLab创建一个专有的拉取代码的账号 Jenkins需要构建哪些项目就在GitLab给予账号相应权限 我这里已经创建过Jenkins用户,下面用它登录后添加SSH-KEY2.在Jenkins服务器上生成ssh-key[root@jenkins ~]# ssh-keygen -t rsa Generating…...

    2024/4/18 14:14:01
  9. 面试题 16.11. 跳水板

    难度:简单你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。示例:输入: shorter = 1 longer = 2 k = 3 输出:…...

    2024/4/26 11:18:35
  10. 教你如何选择c#计算机毕业设计题目(带参考选题)

    楼主有几千套作品原创,可以提供大家参考学习,如果作品没有找到合适自己的作品,评论留下题目,或者站内私信我。 有时间看到机会给你发,最新的课题 选择用c#语言去做程序,那就要先确定要求,是要做网站还是系统,做网站的话就带有前端的,前端一般用html或者html5。如果做系…...

    2024/4/16 6:28:35
  11. Modelsim仿真问题归纳

    1 命令行窗口打印Waiting for lock 问题: 使用modelsim时,命令行窗口打印如下,导致仿真无法进行下午:原因: 猜测可能是破解的问题,具体原因不确定 解决方法: 删除work目录下的_lock文件,可以删除整个work目录重新执行仿真脚本即可...

    2024/4/16 6:29:16
  12. HCIA 实验06 OSPF

    OSPF1、实验拓扑2、实验需求3、配置思路及验证结果3.1 配置设备名称和 IP 地址3.2 配置 OSPF Router-id,并按照区域进行宣告3.3 配置 DR 优先级3.5 配置接口验证3.6 实验结果验证 1、实验拓扑2、实验需求如图所示,配置设备名称和IP地址 a) 设备Ra与设备Rb之间的互联地址按照1…...

    2024/4/16 6:28:30
  13. 网站优化真的和服务器有关系吗?

    服务器物理位置: 服务器有国内和国外服务器之分,如果想要国内用户体验效果更佳,对引擎更友好,国内服务器确实是最佳选择;但是对于一些站长来说,国内服务器要备案是比较废时间和精力的,免备案的国外服务器就是站长们另外的选择了。 服务器稳定性: 在网站运行期间,网站稳…...

    2024/4/19 18:39:34
  14. linux内核通知链基础

    1.通知链表简介 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间…...

    2024/4/16 6:29:36
  15. 设计模式 | 最佳实践

    设计模型 设计模式 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、…...

    2024/4/16 6:29:26
  16. python/java/php/net/安卓/小程序机模拟管理系统的实现功能需求(带功能流程图)

    系统实现的功能 系统主要实现:ATM管理、存取款管理、用户查询、查询统计等功能, 1ATM管理模块:存款、取款、开户、销户、修改信息; 2取款机信息管理方面:管理员管理查询和维护、客户查询和取款等功能; 3用户查询模块:用户希望便于查询自己ATM的信息。 4用户操作模块:存…...

    2024/4/16 6:29:26
  17. leetcode238. 除自身以外数组的乘积

    // 遍历两次,一次乘左边的数,一次乘右边的数 class Solution {public int[] productExceptSelf(int[] nums) {int[] result = new int[nums.length];int k = 1;for (int i = 0; i < result.length; i++) {result[i] = k;// 此时数组存储的是除去当前元素左边的元素乘积k =…...

    2024/4/20 11:45:30
  18. docker容器(centos7)中rpm离线方式安装mysql镜像

    以mysql 5.6为例进行操作首先,下载mysql的rpm文件,主要包含3个rpm包: MySQL-client-5.6.41-1.el7.x86_64.rpm MySQL-devel-5.6.41-1.el7.x86_64.rpm MySQL-server-5.6.41-1.el7.x86_64.rpm3个rpm包的地址 https://download.csdn.net/download/Charlie_jun/12587145 https://…...

    2024/4/17 19:01:34
  19. java后端给实体类设置默认值

    要在后端给实体类设置默认值,有两种行之有效且快速的方法:1 private String orderPrice=“0”;//定义类的属性时进行赋值2.在get/set方法中进行判断并赋值private String orderPrice;//定义类的属性/** get set方法* String.trim() 返回字符串的副本,忽略前导空白和尾部空…...

    2024/4/20 16:48:28
  20. Problem I: 我没碰它自己就坏了

    Description 电脑坏了,机房的电脑坏了,机房的电脑全坏了。。。。不是我干的!! 机房的电脑因为未知的原因现在全都连不上网了。。。幸好维修是免费的 四叶草的人已经来到了现场进行电脑的修理作业,但是由于机房的电脑质量不是很好,修好后的电脑只能与距离它不超过 d 米的其…...

    2024/4/17 5:13:54

最新文章

  1. 【C++】深入剖析C++11 initializer_list 新的类功能 可变模板参数

    目录 一、std::initializer_list 1、std::initializer_list是什么类型 2、std::initializer_list 的应用场景 ①给自定义容器赋值 ② 传递同类型的数据集合 二、新的类功能 1、默认成员函数 2、关键字default 3、关键字delete 三、可变参数模板 一、std::initialize…...

    2024/5/4 13:11:48
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. [Spring Cloud] gateway全局异常捕捉统一返回值

    文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…...

    2024/5/3 22:05:18
  4. ChatGPT 赚钱初学者指南(上)

    原文&#xff1a;The Beginner’s Guide to Earning Money Online with ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一章&#xff1a;理解基础知识 什么是 ChatGPT&#xff1f; 在人工智能与人类对话相遇的数字织锦中&#xff0c;ChatGPT 作为一个突出…...

    2024/5/3 4:17:57
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

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

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

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/5/3 23:10:03
  9. 【外汇早评】日本央行会议纪要不改日元强势

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

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

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

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

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

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

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

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

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

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

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

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

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

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

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

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

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

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

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

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

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/4/30 9:42:49
  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