09【MyBatis多表关联查询】

news2024/11/24 8:53:13

文章目录

  • 三、MyBatis多表关联查询
    • 3.1 表的关系
    • 3.2 一对一查询
      • 3.2.1 搭建环境
      • 3.2.2 需求分析
      • 3.2.3 dao接口
      • 3.2.3 mapper.xml
      • 3.2.4 测试
      • 3.2.5 配置MyBatis一对一关系
        • 1)传统映射:
        • 2)使用`association`标签映射
    • 3.3 一对多查询
      • 3.3.1 需求分析
      • 3.3.2 dao接口
      • 3.3.3 mapper.xml
      • 3.3.4 测试
    • 3.4 多对多关联
      • 3.4.1 需求分析
      • 3.4.2 建立表
      • 3.4.3 实体类
      • 3.4.4 dao
      • 3.4.5 实现User到Role的多对多
      • 3.4.6 实现Role到User的多对多

三、MyBatis多表关联查询

3.1 表的关系

表关系有如下几种

  • 一对多

  • 多对一(MyBatis就是一对一)

  • 一对一

  • 多对多(一对多+一对多)

  • 举例一:

一对多:一个部门下有多个员工

部门与员工的关系:一对多

多对一:多个员工属于一个部门。

员工与部门的关系:多对一

单独拿出一个员工来说,他都只能属于一个部门。所以,在mybatis中把多对一看成了一对一

  • 举例二:

一个用户对应一个身份证号码。那么用户与身份证号码关系就是一对一

  • 举例三:

多对多:一个老师教多个学生。

老师与学生的关系:一对多

一个学生有多个老师。

学生与老师:一对多,这种双向一对多,就是多对多。

3.2 一对一查询

3.2.1 搭建环境

  • SQL脚本:
drop table if exists dept;

CREATE TABLE `dept`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门名称',
  `location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门地址',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 ;

INSERT INTO `dept` VALUES (1, '研发部', '中国台湾');
INSERT INTO `dept` VALUES (2, '市场部', '中国香港');
INSERT INTO `dept` VALUES (3, '行政部', '中国钓鱼岛');
INSERT INTO `dept` VALUES (4, '销售部', '中国江西');

drop table if exists emp;
CREATE TABLE `emp`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '员工姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '员工年龄',
  `addr` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '籍贯',
  `salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '薪资',
  `dept_id` int(11) NULL DEFAULT NULL COMMENT '部门id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `emp` VALUES (1, '张三', 20, '广西来宾', 7600.00, 1);
INSERT INTO `emp` VALUES (2, '李四', 22, '浙江绍兴', 6800.00, 4);
INSERT INTO `emp` VALUES (3, '小明', 25, '广东云浮', 6600.00, 2);
INSERT INTO `emp` VALUES (4, '小红', 23, '河南信阳', 7000.00, 3);
INSERT INTO `emp` VALUES (5, '张明', 25, '山东临沂', 8000.00, 1);

Emp实体类:

package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    private Integer id;
    private String name;
    private Integer age;
    private String addr;
    private Double salary;

    // 一个员工属于一个部门
    private Dept dept;
}

Dept实体类:

package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
    private Integer id;
    private String name;
    private String location;

    // 一个部门下有多个员工
    private List<Emp> empList;
}

3.2.2 需求分析

表关系:

在这里插入图片描述

我们以前的理解是,部门和员工的关系是一对多,员工和部门的关系是多对一;

但是我们拿出单个员工来说,一个员工只属于一个部门,因此在MyBatis中,多对一的关系简化成了一对一;

案例需求:查询所有员工信息,关联查询所属部门信息;在查询过程中,即使有的员工还没有部门也需要查询这个员工的信息,此时在查询过程中,员工表应该是主表;

  • 分析SQL语句:
select e.*,d.* from emp e left join dept d on e.dept_id=d.id

3.2.3 dao接口

  • EmpDao:
public interface EmpDao {
	List<Emp> findAll();
}

3.2.3 mapper.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="com.dfbz.dao.EmpDao">

    <select id="findAll" resultType="emp">
        select e.*,d.* from emp e left join dept d on e.dept_id=d.id
    </select>
</mapper>

3.2.4 测试

package com.dfbz.test;

import com.dfbz.dao.EmpDao;
import com.dfbz.entity.Emp;
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.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo01 {

    private SqlSessionFactory factory;
    private SqlSession session;
    private EmpDao empDao;

    @Before
    public void before() throws IOException {
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        factory = builder.build(is);
        session = factory.openSession(true);
        empDao=session.getMapper(EmpDao.class);
    }

    @After
    public void after() throws IOException {
        session.close();
    }

    @Test
    public void test1() {
        List<Emp> empList = empDao.findAll();

        System.out.println(empList);
    }
}

在这里插入图片描述

3.2.5 配置MyBatis一对一关系

  • 更改SQL语句:
SELECT
	e.id eId,
	e.NAME empName,
	e.age,
	e.addr,
	e.salary,
	e.dept_id deptId,
	d.NAME deptName,
	d.location 
FROM
	emp e
	left JOIN dept d ON e.dept_id = d.id

1)传统映射:

<?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="com.dfbz.dao.EmpDao">

    <resultMap id="empResultMap" type="emp">
        <id column="eId" property="id"></id>
        <result column="empName" property="name"></result>
        <result column="addr" property="addr"></result>
        <result column="salary" property="salary"></result>
        <result column="deptId" property="dept.id"></result>
        <result column="deptName" property="dept.name"></result>
        <result column="location" property="dept.location"></result>
    </resultMap>
    <select id="findAll" resultMap="empResultMap">
        SELECT
        e.id eId,
        e.NAME empName,
        e.addr,
        e.salary,
        e.dept_id deptId,
        d.name deptName,
        d.location
    FROM
        emp e
        LEFT JOIN dept d ON e.dept_id = d.id
    </select>
</mapper>

2)使用association标签映射

<resultMap id="empResultMap" type="emp">
    <id column="eId" property="id"></id>
    <result column="empName" property="name"></result>
    <result column="addr" property="addr"></result>
    
    <!--在使用关系映射时,即使查询出来的列明和实体类的属性名一致,也要手动映射-->
    <result column="salary" property="salary"></result>
    <association property="dept" javaType="com.dfbz.entity.Dept">
        <id column="deptId" property="id"></id>
        <result column="deptName" property="name"></result>
        <!--在使用关系映射时,即使查询出来的列明和实体类的属性名一致,也要手动映射-->
        <result column="location" property="location"></result>
    </association>
    
</resultMap>
<select id="findAll" resultMap="empResultMap">
    SELECT
    e.id eId,
    e.NAME empName,
    e.addr,
    e.salary,
    d.id deptId,
    d.name deptName,
    d.location
FROM
    emp e
    LEFT JOIN dept d ON e.dept_id = d.id
</select>

Tips:映射多表关联的结果集时,即使查询出来的列名与属性名一致,也要建立手动映射关系,否则将会导致查询的值无法映射到对应的列;

3.3 一对多查询

3.3.1 需求分析

需求:查询部门信息以及部门下面所属员工信息

分析:部门和员工的信息为一对多关系,并且查询过程中,如果有的部门没有员工,此时也需要将部门信息查询出来,因此在查询中,部门表应该是主表;

  • 分析SQL语句:
SELECT
	e.id eId,
	e.NAME empName,
	e.addr,
	e.salary,
	e.dept_id deptId,
	d.NAME deptName,
	d.location 
FROM
	emp e
	right JOIN dept d ON e.dept_id = d.id

3.3.2 dao接口

List<Dept> findAll();

3.3.3 mapper.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="com.dfbz.dao.DeptDao">

    <resultMap id="deptResultMap" type="dept">
        <id column="deptId" property="id"></id>
        <result column="deptName" property="name"></result>
        
        <!-- 在使用关系映射时,即使查询出来的列明和实体类的属性名一致,也要手动映射 -->
        <result column="location" property="location"></result>

        <!--
            property: Dept对象中的属性
            ofType:集合中的泛型类型
        -->
        <collection property="empList" ofType="com.dfbz.entity.Emp">
            <id column="eId" property="id"></id>
            <result column="empName" property="name"></result>
            <result column="addr" property="addr"></result>
                
            <!-- 在使用关系映射时,即使查询出来的列明和实体类的属性名一致,也要手动映射 -->
            <result column="salary" property="salary"></result>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="deptResultMap">
        SELECT
            e.id eId,
            e.NAME empName,
            e.addr,
            e.salary,
            e.dept_id deptId,
            d.NAME deptName,
            d.location
        FROM
            emp e
            right JOIN dept d ON e.dept_id = d.id
    </select>
</mapper>

3.3.4 测试

@Test
public void test2() {
    List<Dept> deptList = deptDao.findAll();
    System.out.println(deptList);
}

3.4 多对多关联

3.4.1 需求分析

示例:用户和角色

​ 一个用户可以有多个角色

​ 一个角色可以赋予多个用户

步骤:

​ 1、建立两张表:用户表,角色表让用户表和角色表具有多对多的关系。需要使用中间表,中间表需要外键引用用户表、角色表。

​ 2、建立两个实体类:用户实体类和角色实体类让用户和角色的实体类能体现出来多对多的关系各自包含对方一个集合引用

​ 3、建立两个配置文件用户的配置文件角色的配置文件

​ 4、实现配置:

​ 当我们查询用户时,可以同时得到用户所包含的角色信息

​ 当我们查询角色时,可以同时得到角色的所赋予的用户信息

3.4.2 建立表

DROP TABLE IF EXISTS `role`;
CREATE TABLE `role`  (
  `id` int(11) NOT NULL,
  `role_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `role_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `id`(`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `role` VALUES (1, '保洁', '扫地');
INSERT INTO `role` VALUES (2, '厨师', '做饭');
INSERT INTO `role` VALUES (3, '保安', '维护治安');

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `birthday` date NULL DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (1, '张三', '1999-02-04', '男', '佛山');
INSERT INTO `user` VALUES (2, '李四', '1998-01-15', '女', '湛江');

DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role`  (
  `uid` int(11) NOT NULL COMMENT '用户编号',
  `rid` int(11) NOT NULL COMMENT '角色编号',
  PRIMARY KEY (`uid`, `rid`) USING BTREE,
  INDEX `FK_Reference_10`(`rid`) USING BTREE,
  CONSTRAINT `FK_Reference_10` FOREIGN KEY (`rid`) REFERENCES `role` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `FK_Reference_9` FOREIGN KEY (`uid`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user_role` VALUES (1, 1);
INSERT INTO `user_role` VALUES (2, 1);
INSERT INTO `user_role` VALUES (1, 2);
INSERT INTO `user_role` VALUES (2, 2);
INSERT INTO `user_role` VALUES (2, 3);

3.4.3 实体类

  • User:
package com.dfbz.entity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int  id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    // 一个用户,有多个角色
    private List<Role> roles;
}
  • Role:
package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Role {
    private int  roleId;
    private String roleName;
    private String roleDesc;

    // 一个角色,对应多个用户
    private List<User> users;
}

3.4.4 dao

  • UserDao:
public interface UserDao {
    List<User> findAll();
}
  • RoleDao:
public interface RoleDao {
    List<Role> findAll();
}

3.4.5 实现User到Role的多对多

  • SQL语句:
SELECT
	u.*,
	r.id rid,
	r.role_name,
	r.role_desc 
FROM
	USER u
	LEFT JOIN user_role ur ON u.id = ur.uid
	LEFT JOIN role r ON r.id = ur.rid
  • mapper.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="com.dfbz.dao.UserDao">
    <resultMap id="userResultMap" type="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="roles" ofType="role">
            <id property="roleId" column="rid"></id>
            <result property="roleName" column="role_name"></result>
            <result property="roleDesc" column="role_desc"></result>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="userResultMap">
    select
        u.*,
        r.id rid,
        r.role_name,
        r.role_desc
    
        from user u
        left join user_role ur on u.id=ur.uid
        left join role r on r.id=ur.rid
    </select>
</mapper>

测试类:

@Test
public void test3() {
    List<User> userList = userDao.findAll();
    System.out.println(userList);
}

3.4.6 实现Role到User的多对多

  • SQL语句:
SELECT
	r.*,
	u.id uid,
	u.username,
	u.birthday,
	u.sex,
	u.address 
FROM
	role r
	LEFT JOIN user_role ur ON r.id = ur.rid
	LEFT JOIN USER u ON u.id = ur.uid
  • mapper.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="com.dfbz.dao.RoleDao">

    <resultMap id="roleResultMap" type="role">
        <id property="roleId" column="id"></id>
        <result property="roleName" column="role_name"></result>
        <result property="roleDesc" column="role_desc"></result>
        <collection property="users" ofType="user">
            <id property="id" 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>
        </collection>
    </resultMap>

    <select id="findAll" resultMap="roleResultMap">
        select
            r.*,
            u.id uid,
            u.username,
            u.birthday,
            u.sex,
            u.address

        from role r
            left join user_role ur on r.id=ur.rid
            left join user u on u.id = ur.uid
    </select>
</mapper>
  • 测试类:
@Test
public void test4() {
    List<Role> roleList = roleDao.findAll();
    System.out.println(roleList);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/47420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round #799 (Div. 4) H. Gambling

翻译&#xff1a; 玛丽安在赌场。赌场里的游戏是这样的。 在每一轮之前&#xff0c;玩家在1到109之间选择一个数字。在那之后&#xff0c;一个有109个面的骰子被滚动&#xff0c;这样就会出现1到109之间的随机数。如果玩家猜对了数字&#xff0c;他们的钱就会翻倍&#xff0c…

C++原子操作和互斥锁性能(速度)对比

先说结论&#xff1a;原子操作性能&#xff08;速度&#xff09;强于互斥锁&#xff0c;下面用例子进行说明。 编写测试demo&#xff0c;开启两个线程&#xff0c;对全局变量n分别进行自增、自减操作&#xff0c;计算执行时间。 首先看没有用任何手段进行互斥的情况&#xff0c…

Springboot生成Word/EXECL/PPTX文档

目录 一、概述 二、使用介绍 第一种Poi-tl&#xff1a; 1、介绍 2、功能 第二种Poi: 什么是POI 二进制分布 源码分发 一、概述 Word模板引擎&#xff1a;使用Word模板和数据生成对应的Word文档。 方案移植性功能性易用性 Poi-tl Java跨平台 Word模板引擎&#…

【uniapp小程序】路由跳转navigator传参封装

文章目录&#x1f34d;前言&#x1f34b;正文1、看官网1.1 navigator API 介绍1.2、路由跳转参数传递1.3、五种常见的跳转方式1.3.1 uni.navigateTo(OBJECT)1.3.2 uni.redirectTo(OBJECT)1.3.3 uni.reLaunch(OBJECT)1.3.4 uni.switchTab(OBJECT)1.3.5 uni.navigateBack(OBJECT)…

Ensp用windows回环口连接cloud配置

Ensp模拟通过本机&#xff08;windows&#xff09;用python脚本批量配置华为数通设备时&#xff0c;为了避免对内网资源的浪费最好用回环口&#xff08;loopback&#xff09;。 一、windows开启loopback虚拟接口 概要&#xff1a; right click on window start menu icon an…

【C++】类型转换

目录 一、C语言风格类型转换 二、C风格类型转换 1.static_case 2.reinterpret_case 3、const_case 4、dynamic_case 三、RTTI 总结 一、C语言风格类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返…

N-Gram模型介绍

N-gram是一种基于统计语言模型的算法&#xff0c;基本思想是将文本内容按照字节进行大小为N的滑动窗口操作&#xff0c;形成了长度是N的字节片段序列。 每一个字节片段称为gram&#xff0c;对所有gram的出现频度进行统计&#xff0c;并且按照事先设定好的阈值进行过滤&#xf…

PowerQuery:使用正则表达式

博客来源于我的语雀专栏&#xff1a;R 语言 语雀 更多内容同步更新请关注我的语雀&#xff1a;令平子 语雀 参考资料&#xff1a;部分已引用到各段落 在Power Query中使用正则表达式 Power query 自定义正则表达式函数 新建空白查询&#xff0c;粘贴以下代码&#xff0c;使用…

gcc: error trying to exec ‘cc1plus‘: execvp: no such file or directory

该问题是缺少gcc文件&#xff0c;或者gcc与g版本不匹配问题 问题来源1&#xff1a;系统文件的缺失或者不匹配 按照如下方法测试 安装主要是利用apt-get安装&#xff0c;如果没有root权限的话&#xff0c;只能下载源码进行编译安装&#xff0c;然后添加路径环境&#xff0c;安…

JavaWeb简单实例——Ajax请求

简单介绍&#xff1a; 在上一章节我们展示了关于jQuery的一些基本操作&#xff0c;接下来我们就要进行Ajax的一些基础操作&#xff0c;在真正执行操作之前&#xff0c;我们还需要一点前置的准备&#xff0c;就是关于发送和请求JSON数据的准备。 请求JSON数据&#xff1a; JS…

板卡测评 | 基于TI AM5708开发板——ARM+DSP多核异构开发案例分享

本次测评板卡是创龙科技旗下的TL570x-EVM,它是一款基于TI Sitara系列AM5708ARM Cortex-A15+浮点DSPC66x处理器设计的异构多核SOC评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。 评估板接口资源丰富,引出…

你还不懂《顺序表》?那就不要错过这篇文章!!!

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《java练级之旅》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我…

怎样翻译文本?这三种翻译方法我经常使用

大家是不是还在将收到的文本或资料一句一句地复制到浏览器去翻译&#xff0c;再将翻译结果粘贴回文内呢&#xff1f;这种方法固然可以&#xff0c;但要是遇到需要翻译的文本内容比较多的情况时&#xff0c;就会很浪费时间和精力&#xff0c;如果恰好被英语不好的小伙伴遇到这种…

NoSQL数据库之Redis2

Redis 事务 事务的基础概念 关于事务最常见的例子就是银行转账&#xff0c;A 账户给 B 账户转账一个亿 (T1)&#xff0c;买一块地盖房子。在这种交易的过程中&#xff0c;有几个问题值得思考&#xff1a; 如何同时保证上述交易中&#xff0c;A账户总金额减少一个亿&#xff…

[附源码]Python计算机毕业设计Django的毕业生就业系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

蜂鸟E203学习笔记(四)——取指

1.1 取值概述 1.1.1 如何快速取指 首先要保证存储器的读延时足够小&#xff0c;通常使用指令紧耦合存储器&#xff08;ITCM&#xff09;和指令缓存器&#xff08;ICache&#xff09;。 ITCM通常使用离处理核很近的SRAM因此实现极短的延时。但是没有过大的存储空间&#xff0…

社区系统项目复盘-2

文章目录登录模块注册登录账号设置登录模块 重要知识点&#xff1a; ThreadLocal&#xff0c;Hostholder采用Threadlocal持有用户信息&#xff0c;用于代替session对象 ThreadLocal采用线程隔离的方式存放数据&#xff0c;可以避免多线程之间出现数据访问冲突。ThreadLocal提…

小程序全局配置文件以及常用配置项

一、window常用配置 1.小程序根目录下的app.json文件时小程序的全局配置文件。常用配置项如下&#xff1a; ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的tabBar效果 ④ style 是否启用新版的组件样式 …

【Spring项目中的Service理解】

目录 1. Spring项目中的核心组成部分 2. Spring项目中的Service 2.1 Service的功能作用 2.2 Service的实现 1. Spring项目中的核心组成部分 项目的核心组成部分图解&#xff1a; 2. Spring项目中的Service 2.1 Service的功能作用 Service是项目中用于处理业务逻辑的&#x…

【学习笔记66】JavaScript的深浅拷贝

一、赋值 只要是引用数据类型, 那么在赋值的时候, 就是引用地址的传递// 赋值:字符串const s1 123;let s2 s1; // 赋值console.log(s2 s1); // trues2 456;console.log(s1); // 123console.log(s2); // 456 let o1 { a: 1 };let o2 o1; // 赋值console.log…