1. 复杂映射

1.1 结果映射

1.1.1 基础概念

  • resultType : 如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中
  • resutlMap : 如果实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中

1.1.2 代码案例

  • UserMapper.xml

    <?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">
    <mapper namespace="cn.knightzz.mapper.UserMapper"><resultMap id="UserResultMap" type="cn.knightzz.entity.User"><!-- 封装主键字段 --><id property="uid" column="id"></id><!-- 配置普通字段 --><result property="usernameABC" column="username"></result><result property="birthdayABC" column="birthday"></result><result property="sexABC" column="sex"></result><result property="addressABC" column="address"></result></resultMap><select id="findUserById" parameterType="int" resultMap="UserResultMap">select *from userwhere id = #{id};</select>
    </mapper>
    
  • 实体类

    package cn.knightzz.entity;import java.util.Date;/*** @author 王天赐* @title: User* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/15 22:00*/
    public class User {/*** 用户id*/private Integer uid;/*** 用户名称*/private String usernameABC;/*** 用户生日*/private Date birthdayABC;/*** 性别*/private String sexABC;/*** 地址*/private String addressABC;// ....
    }
  • 测试代码

    package cn.knightzz;import cn.knightzz.entity.User;
    import cn.knightzz.mapper.UserMapper;
    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 org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;public class MybatisTest {@Testpublic void findUserById() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream);// 开启自动提交SqlSession sqlSession = factory.openSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.findUserById(1);System.out.println(user);sqlSession.close();}
    }

1.2 参数注入

1.2.1 参数注入的三种方式

  • 使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数

    <mapper namespace="com.lagou.mapper.UserMapper"> <select id="findByIdAndUsername1" resultType="user"> <!-- select * from user where id = #{arg0} and username = #{arg1} --> select * from user where id = #{param1} and username = #{param2} </select> 
    </mapper>
    
  • 使用注解,引入 @Param() 注解获取参数

    public interface UserMapper { public List<User> findByIdAndUsername2(@Param("id") Integer id,@Param("username") String username); }
    
  • 使用pojo对象传递参数 推荐

    • User实体类

      package cn.knightzz.entity;import java.util.Date;public class User {/*** 用户id*/private Integer id;/*** 用户名称*/private String username;/*** 用户生日*/private Date birthday;/*** 性别*/private String sex;/*** 地址*/private String address;
      }
    • UserMapper接口

      public List<User> findByIdAndUsername(User user);
      
    • UserMapper.xml

      <mapper namespace="com.lagou.mapper.UserMapper"> <select id="findByIdAndUsername" parameterType="cn.knightzz.entity.User" resultType="cn.knightzz.entity.User"> select * from user where id = #{id} and username = #{username} </select> </mapper>
      

1.3 模糊查询

1.3.1 需求

  • 需求 : 根据 username 查询 user 表

1.3.2 代码案例

  • UserMapper.xml

    <?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">
    <mapper namespace="cn.knightzz.mapper.UserMapper"><resultMap id="UserResultMap" type="cn.knightzz.entity.User"><!-- 封装主键字段 --><id property="uid" column="id"></id><!-- 配置普通字段 --><result property="usernameABC" column="username"></result><result property="birthdayABC" column="birthday"></result><result property="sexABC" column="sex"></result><result property="addressABC" column="address"></result></resultMap><select id="findUserById" parameterType="int" resultMap="UserResultMap">select *from userwhere id = #{id};</select><select id="findUserByName" parameterType="string" resultMap="UserResultMap">select *from userwhere username like #{username};</select>
    </mapper>
    
  • UserMapper

    package cn.knightzz.mapper;import cn.knightzz.entity.User;import java.util.List;public interface UserMapper {/*** 根据id查询用户* @param id 用户id* @return*/public User findUserById(int id);/*** 根据用户名查询用户* @param username* @return*/public User findUserByName(String username);
    }
  • 测试代码

        @Testpublic void findUserByName() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream);// 开启自动提交SqlSession sqlSession = factory.openSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.findUserByName("%应%");System.out.println(user);sqlSession.close();}
    

1.3.3 ${} 与 #{} 区别【笔试题】

  • #{} :表示一个占位符号

    • 通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,
    • #{} 可以有效防止sql注入。
    • #{} 可以接收简单类型值或pojo属性值。
    • 如果parameterType传输单个简单类型值, #{} 括号中名称随便写。
  • ${} :表示拼接sql

    • 通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入
      问题。
    • ${} 可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,
    • ${} 括号中只能是value

2. 映射文件

2.1 返回主键

2.1.1 基本概念

  • 很多情况下, 我们有这样的需求 : 向数据库中插入一条数据后希望能够立刻拿到这条数据

2.1.2 useGeneratedKeys

  • 我们可以通过设置 useGeneratedKeys 的值来设置 查询返回的主键的值

  • useGeneratedKeys="true" 声明返回主键 keyProperty="id" 把返回主键的值,封装到实体的id属性中, 注意 这个实体是指的是参数的对象的 id 值, 并不是直接返回的值

  • 注意:只适用于主键自增的数据库,mysqlsqlserver 支持,oracle不支持

  • 实体类 User

    package cn.knightzz.entity;import java.util.Date;/*** @author 王天赐* @title: User* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/15 22:00*/
    public class User {/*** 用户id*/private Integer id;/*** 用户名称*/private String username;/*** 用户生日*/private Date birthday;/*** 性别*/private String sex;/*** 地址*/private String address;// .... get / set
    }
  • UserMapper.xml 配置

    <?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">
    <mapper namespace="cn.knightzz.mapper.UserMapper"><!--useGeneratedKeys="true" 声明返回主键 keyProperty="id" 把返回主键的值,封装到实体的id属性中,注意 这个实体是指参数的对象--><insert id="saveUser" parameterType="cn.knightzz.entity.User" useGeneratedKeys="true" keyProperty="id">insert into user(username, birthday, sex, address)values (#{username}, #{birthday}, #{sex}, #{address})</insert>
    </mapper>
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.User;
    import cn.knightzz.mapper.UserMapper;
    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 org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;public class MyBatisMapperTest {private SqlSession sqlSession;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);this.sqlSession = build.openSession(true);}@Testpublic void saveUser() {UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setUsername("KKK");user.setSex("男");user.setBirthday(new Date());user.setAddress("河南");mapper.saveUser(user);System.out.println(user);sqlSession.close();}
    }

2.1.3 selectKey

  • selectKey 适用范围广,支持所有类型数据库

  • 原理是 : 使用 SELECT LAST_INSERT_ID(); SQL内置的函数, 可以查询最近一次插入数据的主键id

  • 常用配置

    • keyColumn="id" 指定主键列名
    • keyProperty="id" 指定主键封装到实体的id属性中
    • resultType="int" 指定主键类型
    • order="AFTER" 设置在sql语句执行前(后),执行此语句
  • UserMapper.xml

    <?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">
    <mapper namespace="cn.knightzz.mapper.UserMapper"><!--selectKey 适用范围广,支持所有类型数据库 keyColumn="id" 指定主键列名 keyProperty="id"指定主键封装到实体的id属性中 resultType="int"指定主键类型 order="AFTER" 设置在sql语句执行前(后),执行此语句--><insert id="saveUserBySelectKey" parameterType="cn.knightzz.entity.User" useGeneratedKeys="true" keyProperty="id"><selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">SELECT LAST_INSERT_ID();</selectKey>insert into user(username, birthday, sex, address)values (#{username}, #{birthday}, #{sex}, #{address})</insert>
    </mapper>
    
  • UserMapper

    package cn.knightzz.mapper;import cn.knightzz.entity.User;import java.util.List;public interface UserMapper {/*** 插入用户数据* @param user* @return 返回主键*/public void saveUser(User user);/*** 通过 selectKey 的方式返回主键* @param user*/public void saveUserBySelectKey(User user);
    }
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.User;
    import cn.knightzz.mapper.UserMapper;
    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 org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void saveUserBySelectKey() {user.setUsername("KKK222");user.setSex("女");user.setBirthday(new Date());user.setAddress("河南");mapper.saveUserBySelectKey(user);System.out.println(user);sqlSession.close();}
    }

2.2 动态SQL

2.2.1 基本概念

  • 当我们要根据不同的条件,来执行不同的sql语句的时候,需要用到动态sql

2.2.2 动态SQL<if>

  • UserMapper接口

        /*** 根据id后者* @param user* @return*/public User findUserByIdAndUsernameIf(User user);
    
  • UserMapper.xml

        <select id="findUserByIdAndUsernameIf" parameterType="cn.knightzz.entity.User" resultType="cn.knightzz.entity.User">select * from user<where><if test="id != null">AND id = #{id}</if><if test="username != null">AND username = #{username}</if></where></select>
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.User;
    import cn.knightzz.mapper.UserMapper;
    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 org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;/*** @author 王天赐* @title: MyBatisMapperTest* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/17 18:51*/
    public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void findUserByIdAndUsernameIf() {user.setUsername("KKK222");User userByIdAndUsernameIf = mapper.findUserByIdAndUsernameIf(user);System.out.println(userByIdAndUsernameIf);sqlSession.close();}
    }

2.2.3 动态SQL<set>

  • 动态更新user表数据,如果该属性有值就更新,没有值不做处理。

  • UserMapper接口

    /*** 更新用户信息, 使用 set 标签* @param user*/public void updateUserBySet(User user);
    
  • UserMapper.xml

    <?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">
    <mapper namespace="cn.knightzz.mapper.UserMapper"><update id="updateUserBySet" parameterType="cn.knightzz.entity.User">update user<set><if test="username != null">username = #{username}</if><if test="birthday != null">birthday = #{birthday}</if><if test="sex != null">sex = #{sex}</if><if test="address != null">address = #{address}</if></set>where id = #{id}</update>
    </mapper>
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.User;
    import cn.knightzz.mapper.UserMapper;
    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 org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;/*** @author 王天赐* @title: MyBatisMapperTest* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/17 18:51*/
    public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void updateUserBySet() {user.setId(1);user.setUsername("KKK222");mapper.updateUserBySet(user);sqlSession.close();}
    }

2.2.4 动态SQL<foreach>

  • foreach主要是用来做数据的循环遍历
    例如: select * from user where id in (1,2,3) 在这样的语句中,传入的参数部分必须依靠
    foreach遍历才能实现。

  • <foreach>标签用于遍历集合,它的属性:

  • collection:代表要遍历的集合元素

  • open:代表语句的开始部分

  • close:代表结束部分

  • item:代表遍历集合的每个元素,生成的变量名

  • sperator:代表分隔符

  • UserMapper 接口

        /*** 根据id查询用户列表* @param ids* @return*/public List<User> findAllUserById(List<Integer> ids);
    
  • UserMapper.xml 配置

        <select id="findAllUserById" parameterType="java.util.List" resultType="cn.knightzz.entity.User">select * from user<where>/*collection:代表要遍历的集合元素, 通常写 collection 或者 listopen:代表语句的开始部分close:代表结束部分item:代表遍历集合的每个元素,生成的变量名sperator:代表分隔符*/<foreach collection="collection" open="id in (" close=")" item="id" separator=",">#{id}</foreach></where></select>
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.User;
    import cn.knightzz.mapper.UserMapper;
    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 org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;/*** @author 王天赐* @title: MyBatisMapperTest* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/17 18:51*/
    public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void findAllUserById() {List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(2);ids.add(2024);List<User> userList = mapper.findAllUserById(ids);for (User user1 : userList) {System.out.println(user1);}sqlSession.close();}
    }

2.2.5 动态SQL<sql>

  • 映射文件中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

  • 使用方法

    • 提取公用代码

          <sql id="selectUser">select * from user</sql>
      
    • 引入SQL代码

       /* 引入 SQL 片段*/
      <include refid="selectUser"></include>
      
  • 代码示例

        <sql id="selectUser">select * from user</sql><select id="findAllUserById" parameterType="java.util.List" resultType="cn.knightzz.entity.User">/* 引入 SQL 片段*/<include refid="selectUser"></include><where>/*collection:代表要遍历的集合元素, 通常写 collection 或者 listopen:代表语句的开始部分close:代表结束部分item:代表遍历集合的每个元素,生成的变量名sperator:代表分隔符*/<foreach collection="collection" open="id in (" close=")" item="id" separator=",">#{id}</foreach></where></select>
    

2.3 分页插件

2.3.1 plugins插件

  • MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封
    装,使用简单的方式即可获得分页的相关数据
  • 开发步骤:
    1. 导入通用PageHelper的坐标
    2. 在mybatis核心配置文件中配置PageHelper插件
    3. 测试分页数据获取

2.3.2 案例实现

  • 引入 Maven 依赖

            <!-- 分页助手 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>3.7.5</version></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>0.9.1</version></dependency>
    
  • sqlMapConfig.xml 中配置插件

  • 特别注意 : 注意 <plugins> 放置的位置要在 <environment> 前面 <typeAliases> 后面

        <!-- 配置插件 --><plugins><plugin interceptor="com.github.pagehelper.PageHelper"><!--1. 指定方言, 因为不同的数据库部分分页语法不同, 需要指定数据库--><property name="dialect" value="mysql"/></plugin></plugins>
    
  • UserMapper 接口

        /*** 查询所有用户信息* @return*/public List<User> findAll();
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.User;
    import cn.knightzz.mapper.UserMapper;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    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 org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;/*** @author 王天赐* @title: MyBatisMapperTest* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/17 18:51*/
    public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void pageHelper() {// 设置分页参数 :// pageNum : 当前页码// pageSize: 每页显示的数据条数PageHelper.startPage(2, 2);List<User> allUsers = mapper.findAll();for (User allUser : allUsers) {System.out.println(allUser);}PageInfo<User> pageInfo = new PageInfo<User>(allUsers);System.out.println("总条数:" + pageInfo.getTotal());System.out.println("总页数:" + pageInfo.getPages());System.out.println("当前页:" + pageInfo.getPageNum());System.out.println("每页显示长度:" + pageInfo.getPageSize());System.out.println("是否第一页:" + pageInfo.isIsFirstPage());System.out.println("是否最后一页:" + pageInfo.isIsLastPage());sqlSession.close();}
    }

3. MyBatis多表查询

3.1 数据库关系

3.1.1 关系表类型

  • 关系型数据库表关系分为
    • 一对一
    • 一对多
    • 多对多

3.1.2 关系表案例

  • 人和身份证号就是一对一

    • 一个人只能有一个身份证号
    • 一个身份证号只能属于一个人
  • 用户和订单就是一对多,订单和用户就是多对一

    • 一个用户可以下多个订单
    • 多个订单属于同一个用户
  • 学生和课程就是多对多

    • 一个学生可以选修多门课程
    • 一个课程可以被多个学生选修
  • 特例一个订单只从属于一个用户,所以mybatis将多对一看成了一对一

3.2 案例环境

3.2.1 数据库表

DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders`
(`id`        INT(11) NOT NULL AUTO_INCREMENT,`ordertime` VARCHAR(255) DEFAULT NULL,`total`     DOUBLE       DEFAULT NULL,`uid`       INT(11)      DEFAULT NULL,PRIMARY KEY (`id`),KEY `uid` (`uid`),CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`id`)
) ENGINE = INNODBAUTO_INCREMENT = 4DEFAULT CHARSET = utf8;
-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders`
VALUES ('1', '2020-12-12', '3000', '1');
INSERT INTO `orders`
VALUES ('2', '2020-12-12', '4000', '1');
INSERT INTO `orders`
VALUES ('3', '2020-12-12', '5000', '2');
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role`
(`id`       INT(11) NOT NULL AUTO_INCREMENT,`rolename` VARCHAR(255) DEFAULT NULL,`roleDesc` VARCHAR(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE = INNODBAUTO_INCREMENT = 3DEFAULT CHARSET = utf8;
-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role`
VALUES ('1', 'CTO', 'CTO');
INSERT INTO `sys_role`
VALUES ('2', 'CEO', 'CEO');
-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role`
(`userid` INT(11) NOT NULL,`roleid` INT(11) NOT NULL,PRIMARY KEY (`userid`, `roleid`),KEY `roleid` (`roleid`),CONSTRAINT `sys_user_role_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `sys_role` (`id`),CONSTRAINT `sys_user_role_ibfk_2` FOREIGN KEY (`roleid`) REFERENCES `user` (`id`)
) ENGINE = INNODBDEFAULT CHARSET = utf8;
-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role`
VALUES ('1', '1');
INSERT INTO `sys_user_role`
VALUES ('2', '1');
INSERT INTO `sys_user_role`
VALUES ('1', '2');
INSERT INTO `sys_user_role`
VALUES ('2', '2');

3.3 一对一

3.3.1 数据模型

  • 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

  • 一对一查询的需求:查询所有订单,与此同时查询出每个订单所属的用户

  • 查询sql

    select * from orders join user u on u.id = orders.uid
    

3.3.2 代码案例

  • OrderMapper 接口

    package cn.knightzz.mapper;import cn.knightzz.entity.Order;import java.util.List;/*** @author 王天赐* @title: OrderMapper* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/19 11:24*/
    public interface OrderMapper {/*** 查询订单信息以及订单对应的用户信息* @return*/public List<Order> findAllWithUser();
    }
  • Order 实体类

    package cn.knightzz.entity;import java.util.Date;/*** @author 王天赐* @title: Oder* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/19 11:19*/
    public class Order {/*** 订单id*/private Integer id;/*** 订单时间*/private Date orderTime;/*** 金额*/private double money;/*** 订单所属的用户信息*/private User user;// ... get / set
    }
  • OrderMapper.xml

    需要注意的是 <association property="user" 的 user 指的是 实体类Order的User对象的属性值

    映射实体类属性可以使用 <association property="user" javaType="cn.knightzz.entity.User">

    <?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">
    <mapper namespace="cn.knightzz.mapper.OrderMapper"><!--一对一(多对一)使用association标签关联property="user" 封装实体的属性名javaType="user" 封装实体的属性类型--><resultMap id="orderReturnMap" type="cn.knightzz.entity.Order"><!-- 定义主键 --><id property="id" column="id"></id><result property="orderTime" column="ordertime"></result><result property="money" column="total"></result><!--property : Order 表中 User 对象的属性名javaType : User 对象的属性类型全路径--><association property="user" javaType="cn.knightzz.entity.User"><!-- 封装主键 --><id property="id" column="id"></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></association></resultMap><select id="findAllWithUser" resultMap="orderReturnMap">select *from ordersjoin user u on u.id = orders.uid</select></mapper>
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.Order;
    import cn.knightzz.entity.User;
    import cn.knightzz.mapper.OrderMapper;
    import cn.knightzz.mapper.UserMapper;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    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 org.junit.After;
    import org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;/*** @author 王天赐* @title: MyBatisMapperTest* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/17 18:51*/
    public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;private OrderMapper orderMapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);orderMapper = sqlSession.getMapper(OrderMapper.class);}@Testpublic void findAllWithUser(){List<Order> allWithUsers = orderMapper.findAllWithUser();for (Order allWithUser : allWithUsers) {System.out.println(allWithUser);}}@Afterpublic void destroy(){sqlSession.close();}
    }

3.4 一对多

3.4.1 数据模型

  • 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

  • 一对多查询的需求:查询所有用户,与此同时查询出该用户具有的订单

  • 查询sql

    select *, o.id as oid from user left join orders o on user.id = o.uid
    

3.4.2 代码案例

  • UserMapper 接口

    /*** 查询所有用户信息以及其订单信息* @return*/public List<User> findAllWithOrder();
    
  • User 实体类

    package cn.knightzz.entity;import java.util.Date;
    import java.util.List;/*** @author 王天赐* @title: User* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/15 22:00*/
    public class User {/*** 用户id*/private Integer id;/*** 用户名称*/private String username;/*** 用户生日*/private Date birthday;/*** 性别*/private String sex;/*** 地址*/private String address;/*** 订单列表*/private List<Order> orderList;
    }
  • UserMapper.xml 配置

    <resultMap id="userReturnMap" type="cn.knightzz.entity.User"><!-- 设置 用户表主键与属性映射--><id property="id" column="id"></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><collection property="orderList" ofType="cn.knightzz.entity.Order"><!-- 定义主键 --><id property="id" column="oid"></id><result property="orderTime" column="ordertime"></result><result property="money" column="total"></result></collection></resultMap><select id="findAllWithOrder" resultMap="userReturnMap">select *, o.id as oid from user left join orders o on user.id = o.uid</select>
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.Order;
    import cn.knightzz.entity.User;
    import cn.knightzz.mapper.OrderMapper;
    import cn.knightzz.mapper.UserMapper;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    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 org.junit.After;
    import org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;/*** @author 王天赐* @title: MyBatisMapperTest* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/17 18:51*/
    public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;private OrderMapper orderMapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);orderMapper = sqlSession.getMapper(OrderMapper.class);}@Testpublic void findAllWithOrder(){List<User> allWithOrders = mapper.findAllWithOrder();for (User allWithOrder : allWithOrders) {System.out.println(allWithOrder);}}@Afterpublic void destroy(){sqlSession.close();}
    }

3.5 多对多

3.5.1 数据模型

  • 用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

  • 多对多查询的需求:查询所有用户同时查询出该用户的所有角色

  • 查询SQL

            select *from userleft join sys_user_role sur on user.id = sur.useridinner join sys_role sr on sur.roleid = sr.id
    

3.5.2 代码案例

  • UserSysRole实体类
package cn.knightzz.entity;import java.util.Date;
import java.util.List;public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;/*** 表示的当前用户关联的角色列表*/private List<SysRole> roleList;}
package cn.knightzz.entity;public class SysRole {private Integer id;private String roleName;private String roleDesc;// get /set ...
}
  • UserMapper 接口

        /*** 查找用户以及其权限列表* @return*/public List<User> findAllWithRole();
    
  • UserMapper.xml 配置`

    <resultMap id="userRoleListMap" type="cn.knightzz.entity.User"><!-- 设置 用户表主键与属性映射--><id property="id" column="id"></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><collection property="roleList" ofType="cn.knightzz.entity.SysRole"><!-- 定义主键 --><id property="id" column="roleid"></id><result property="roleName" column="rolename"></result><result property="roleDesc" column="roleDesc"></result></collection></resultMap><select id="findAllWithRole" resultMap="userRoleListMap">select *from userleft join sys_user_role sur on user.id = sur.useridinner join sys_role sr on sur.roleid = sr.id</select>
    
  • 测试代码

    package cn.knightzz.test;import cn.knightzz.entity.Order;
    import cn.knightzz.entity.User;
    import cn.knightzz.mapper.OrderMapper;
    import cn.knightzz.mapper.UserMapper;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    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 org.junit.After;
    import org.junit.Before;
    import org.junit.Test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;/*** @author 王天赐* @title: MyBatisMapperTest* @projectName spring-aop-01* @description:* @website http://knightzz.cn/* @github https://github.com/knightzz1998* @date 2022/1/17 18:51*/
    public class MyBatisMapperTest {private User user = new User();private SqlSession sqlSession;private UserMapper mapper;private OrderMapper orderMapper;@Beforepublic void init() throws IOException {InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);sqlSession = build.openSession(true);mapper = sqlSession.getMapper(UserMapper.class);orderMapper = sqlSession.getMapper(OrderMapper.class);}@Testpublic void findAllWithRole(){List<User> allWithRoles = mapper.findAllWithRole();for (User allWithRole : allWithRoles) {System.out.println(allWithRole);}}@Afterpublic void destroy(){sqlSession.close();}
    }

4. MyBatis嵌套查询

4.1 基本概念

  • 嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一

    起。

4.2 优缺点

  • 优点:简化多表查询操作
  • 缺点:执行多次sql语句,浪费数据库性能
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 解决JSP中文乱码问题

    大家在JSP的开发过程中&#xff0c;经常出现中文乱码的问题&#xff0c;可能一至困扰着大家&#xff0c;现把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。首先了解一下Java中文问题的由来&#xff1a; Java的内核和class文件是基于unicode的&#xff0c;这使Ja…...

    2024/4/27 22:13:07
  2. 在虚拟机CentOS 7环境下安装MySQL5.6.36

    近两天&#xff0c;在Linux系统的学习中&#xff0c;遇到了不少问题&#xff0c;对于我这样一个刚接触Linux系统的新手来说&#xff0c;是有点不友好。这篇文章&#xff0c;主要总结困扰我两天的Linux下安装MySQL的问题&#xff0c;也就是对网上查阅的一些资料的一个总结。如果…...

    2024/4/27 21:46:07
  3. 【CentOS 7 64位】linux文件系统命令行操作

    【CentOS 7 64位】linux文件系统&命令行操作 本文图片来源网络或学术论文&#xff0c;文字部分来源网络与学术论文&#xff0c;仅供学习使用。 目录 一、linux的系统架构 二、文件命令行操作 1、网络连接命令 -ifconfig命令 -route命令 -ping命令 -traceroute命令…...

    2024/4/28 0:14:26
  4. 无法量化互联网技术团队的工作?请使用人效指标

    来啦&#xff0c;请坐。 我是老杨。如果你有强化管理能力&#xff0c;量化技术产出&#xff0c;提升技术效能&#xff0c;打造技术团队等需求&#xff0c;那么这套课程会为你揭开技术管理的神秘面纱&#xff0c;可以让“妈妈再也不用担心你的工作了”。 这是《数字化技术管理的…...

    2024/4/14 13:26:00
  5. GWAS中常用格式“ped/map”和“tped/tfam”

    参考资料来源&#xff1a; http://zzz.bwh.harvard.edu/plink/data.shtml#tr plink常用格式&#xff1a;PED/MAP PED文件&#xff1a;包含每个样本的基本信息&#xff08;族系、名称、性别等&#xff09;、表现型信息&#xff08;phenotype&#xff09;、这个样本所含的所有SN…...

    2024/4/20 13:47:41
  6. 2021年危险化学品生产单位安全生产管理人员复审考试及危险化学品生产单位安全生产管理人员模拟考试题库

    题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;危险化学品生产单位安全生产管理人员复审考试是安全生产模拟考试一点通生成的&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危险化学品生产单位安全生产管…...

    2024/4/5 4:59:14
  7. 怎修改软件到期时间

    怎修改软件到期时间Pulsar 采用发布-订阅(pub-sub)的设计模式 。 该设计模式中&#xff0c;producer 发布消息到 topic&#xff0c; Consumer 订阅 topic、处理发布的消息&#xff0c;并在处理完成后发送确认。 一旦创建订阅&#xff0c;即使 consumer 断开连接&#xff0c;Pu…...

    2024/4/20 16:11:31
  8. 如何配置Jupyter文件的保存位置

    打开命令行&#xff0c;输入jupyter notebook --generate-config 复制上方路径&#xff0c;打开jupyter_notebook_config.py文件 在文件jupyter_notebook_config.py中找到#c.NotebookApp.notebook_dir 条目 4.换成自己的工程目录 以后在Jupyter新建的文件就默认保存在修改…...

    2024/4/20 2:36:12
  9. 攻防世界python-trade

    攻防世界python-trade的文件在 python反编译 - 在线工具 中打开 https://tool.lu/pyc/ 脚本 import base64 correct XlNkVmtUI1MgXWBZXCFeKYAaXNt lflag base64.b64decode(correct) #这里encode加密&#xff0c;decode解密 flag for i in lflag:xchr((i-16)^32)flag x…...

    2024/4/19 19:53:32
  10. Idea新建项目配置

    File Encoding都改成UTF-8 Git环境配置成你电脑上的git环境 Maven配置 Runner java Compiler...

    2024/4/14 13:26:05
  11. 第一个SpringMVC程序

    SpringMVC 回顾Servlet 1.新建一个Maven工程父工程&#xff01;导入pom依赖 <!-- 依赖--><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope&…...

    2024/4/14 13:25:35
  12. 【Leetcode栈与队列】验证括号序列是否合法

    文章目录1.问题描述2.解决方案解法一&#xff1a;使用栈解法二&#xff1a;计数法1.问题描述 验证一串括号序列是否合法&#xff0c;比如 “()” 合法&#xff0c;“()())(” 不合法 2.解决方案 解法一&#xff1a;使用栈 boolean judge_stack(String str){Stack<Characte…...

    2024/4/14 13:27:25
  13. MySQL性能优化:due to type or collation conversion on field

    MySQL性能优化&#xff1a;due to type or collation conversion on field一、问题介绍有两张表A&#xff0c;和B&#xff0c;都有个一字段 DEV_CODE数据规模&#xff0c;在10万条左右查询A表中的DEV_CODE&#xff0c;并且DEV_CODE没有在B表的DEV_CODE中问题现象&#xff1a;慢…...

    2024/4/14 13:26:50
  14. C++ 和 Java中默认的类和方法修饰符 的区别

    示例代码要么使用 public 访问修饰符&#xff0c;要么就没使用修饰符&#xff08;默认访问权限&#xff08;default access&#xff09;&#xff09;。默认访问权限没有关键字&#xff0c;通常被称为包访问权限&#xff08;package access&#xff09;&#xff08;有时也称为 f…...

    2024/4/19 14:07:03
  15. Python项目实战 10.2:性能优化:MySQL读写分离

    目录 一、主从同步 二、Django实现MySQL读写分离 一、主从同步 分别在两台centos 7系统上安装mysql 5.7 本文示例的两台服务器分别为 主服务器&#xff1a;192.168.2.111 从服务器&#xff1a;192.168.2.112 1. 分别在这两个服务器上创建 wangye_mall 数据库 关于新建数据库…...

    2024/4/14 13:27:05
  16. 作业十一

    ...

    2024/4/14 13:28:46
  17. 快乐源泉 >>>>>>

    这就是传说中的仪式感...

    2024/4/14 13:26:45
  18. 使用JD-GUI批量反编译Java文件

    第一步下载&#xff1a;jd——gui 第二步&#xff1a;将批量转换的class文件压缩 第三步&#xff1a; jd_gui file菜单- open file 选择第二步的压缩包 第四步&#xff1a;jd_gui file菜单 sava all sources 就导出了 第五步&#xff1a;解压就批量生成了反编译的java文件...

    2024/4/19 14:35:14
  19. jupyter中导入seaborn遇到的问题

    最开始想着安装seaborn 用pip 安装好了&#xff0c; pip list 也能显示 seaborn0.11.2 但是用jupyter 打开发现&#xff0c;弹出一些其他问题&#xff0c;什么numpy、pandas不行&#xff08;我感觉像是各个包之间不匹配&#xff09;。 后来尝试用conda安装&#xff0c;结果显示…...

    2024/4/19 16:21:35
  20. 奇技淫巧:解决Thymeleaf序列化对象到页面js块long型丢失精度问题

    问题描述&#xff1a; Thymeleaf可以直接把对象json序列化到页面js块里&#xff0c;作为js对象使用&#xff0c;由于后台id使用的是雪花算法&#xff0c;生成的id存的是long型&#xff0c;Thymeleaf使用的是jackson序列化&#xff0c;因此long型默认序列化后对js来说是Number类…...

    2024/4/14 13:26:50

最新文章

  1. 人工智能|推荐系统——推荐大模型最新进展

    近年来,大语言模型的兴起为推荐系统的发展带来了新的机遇。这些模型以其强大的自然语言处理能力和丰富的知识表示,为理解和生成复杂的用户-物品交互提供了新的视角。本篇文章介绍了当前利用大型语言模型进行推荐系统研究的几个关键方向,包括嵌入空间的解释性、个性化推荐的知…...

    2024/4/28 3:35:06
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 最新AI智能系统ChatGPT网站源码V6.3版本,GPTs、AI绘画、AI换脸、垫图混图+(SparkAi系统搭建部署教程文档)

    一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…...

    2024/4/25 2:00:46
  4. 如何系统地自学Python?

    Python作为一种简单易学且功能强大的编程语言&#xff0c;已经成为许多人入门编程的首选语言。对于想要自学Python的初学者来说&#xff0c;如何有系统地自学Python是一个重要的问题。 本文将介绍一种系统自学Python的方法&#xff0c;帮助初学者快速入门&#xff0c;并逐步提…...

    2024/4/27 18:25:23
  5. 【外汇早评】美通胀数据走低,美元调整

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

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

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

    2024/4/28 3:28:32
  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/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/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024/4/27 23:24:42
  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