MyBatis 关联查询

news2025/2/2 2:55:23

目录

一、一对一查询(sqlMapper配置文件)

1、需求:

2、创建account和user实体类

3、创建AccountMapper 接口

4、创建并配置AccountMapper.xml

5、测试

二、一对多查询(sqlMapper配置文件)

1、需求:

2、创建user和account实体类

3、创建UserMapper 接口

4、创建并配置UserMapper.xml

5、测试

三、多对多查询(sqlMapper配置文件)

1、需求:

2、创建role、user实体类

3、创建RoleMapper 接口

4、创建并配置RoleMapper.xml

5、测试

四、MyBAtis注解

1、基本常用的注解有:

2、复杂关系的注解(一对一、一对多/多对一、多对多关系)

五、一对一查询(注解)

六、一对多查询(注解)

一对多反过来测试

六、多对多关系注解方式的查询数据


关联查询

当访问关系的一方时,如果需要查看与之关联的另一方数据,则必须使用表链接查询,将查询到的另一方数据,保存在本方的属性中

实体间的关系(拥有 has、属于 belong)

  • OneToOne:一对一关系(account ←→ user)

  • OneToMany:一对多关系(user ←→ account)

  • ManyToMany:多对多关系(user ←→ role)

关联查询的语法

  • 指定“一方”关系时(对象),使用< association javaType="" >
  • 指定“多方”关系时(集合),使用< collection ofType="" >

一、一对一查询(sqlMapper配置文件)

1、需求:

查询账户(account)信息,关联查询用户(user)信息。

分析:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。

2、创建accountuser实体类

Account.java

public class Account implements Serializable {

    private Integer id;
    private Integer uid;
    private Double money;
     // 另外一方
    private User user;

   //get set toString方法此处省略
}

User.java

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

 //get set toString方法此处省略
}
3、创建AccountMapper 接口
public interface AccountMapper {
    Account getAccountById(Integer id);
}
4、创建并配置AccountMapper.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.by.mapper.AccountMapper">
    <resultMap id="getAccountByIdResult" type="com.by.pojo.Account">
        <id column="aid" property="id"></id>
        <result column="uid" property="uid"></result>
        <result column="money" property="money"></result>
        <!--
            一对一使用association标签指定数据的封装规则
            property="user":Account的属性名
            javaType="com.by.pojo.User":等价于resultType
        -->
        <association property="user" javaType="com.by.pojo.User">
            <id column="id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="birthday" property="birthday"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
    <select id="getAccountById" parameterType="int" resultMap="getAccountByIdResult">
        SELECT a.id aid, a.uid uid, a.money money, u.* FROM account a LEFT JOIN user u ON a.uid=u.id WHERE a.id=#{id}
    </select>
</mapper>
5、测试
 /**
     * 一对一:一个Account 对 一个User
     */
    @Test
    public void testGetAccountById(){
       //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
       InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //创建sqlSession
        SqlSession sqlSession = sessionFactory.openSession();


        AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
        Account account = accountMapper.getAccountById(1);
        System.out.println(account);

       //释放资源
        sqlSession.close();
        inputStream.close();
    }

二、一对多查询(sqlMapper配置文件)

1、需求:

查询所有用户(user)信息及用户关联的账户(account)信息。

分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来,此时左外连接查询比较合适。

2、创建useraccount实体类

User.java

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //对应多方,需要用集合
    private List<Account> accountList;


 //get set toString方法此处省略
}

Account.java

public class Account implements Serializable {

    private Integer id;
    private Integer uid;
    private Double money;
     // 另外一方
    private User user;

   //get set toString方法此处省略
}
3、创建UserMapper 接口
public interface UserMapper {
    User getUserById(Integer id);
}
4、创建并配置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="com.by.mapper.UserMapper">

    <resultMap id="getUserByIdResult" type="com.by.pojo.User">
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="address" property="address"/>
        <result column="sex" property="sex"/>
        <result column="birthday" property="birthday"/>

        <!--一堆多使用collection标签指定数据的封装规则-->
        <collection property="accountList" ofType="com.by.pojo.Account">
            <id column="aid" property="id"></id>
            <result column="uid" property="uid"></result>
            <result column="money" property="money"></result>
        </collection>
    </resultMap>

    <select id="getUserById" parameterType="int" resultMap="getUserByIdResult">
        SELECT u.*, a.id aid, a.uid uid, a.money money FROM user u LEFT JOIN account a ON u.id=a.uid WHERE u.id=#{id}
    </select>
</mapper>
5、测试
    /**
     * 一对多:一个user 对 多个Account
     */
    @Test
    public void testGetUserById(){
       //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
       InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //创建sqlSession
        SqlSession sqlSession = sessionFactory.openSession();


         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserById(41);
        System.out.println(user);

       //释放资源
        sqlSession.close();
        inputStream.close();
    }

三、多对多查询(sqlMapper配置文件)

1、需求:

查询角色及角色赋予的用户信息。

分析:一个用户可以拥有多个角色,一个角色也可以赋予多个用户,用户和角色为双向的一对多关系,多对多关系其实我们看成是双向的一对多关系。

2、创建role、user实体类

Role.java
public class Role {
    private Integer id;
    private String roleName;
    private String roleDesc;

   //对应多方,需要用集合
    private List<User> userList;


 //get set toString方法此处省略

}

User.java

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

 //get set toString方法此处省略
}
3、创建RoleMapper 接口
public interface RoleMapper {
    Role getRoleById(Integer id);
}
4、创建并配置RoleMapper.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.by.mapper.RoleMapper">

    <resultMap id="getRoleByIdResultMap" type="com.by.pojo.Role">
        <id column="rid" property="id"></id>
        <result column="role_name" property="roleName"></result>
        <result column="role_desc" property="roleDesc"></result>

        <!--
            一对多使用collection标签指定数据的封装规则
            property="userList":pojo的属性
            ofType="com.by.pojo.User":集合的泛型,等价于resultType
        -->
        <collection property="userList" ofType="com.by.pojo.User">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="birthday" property="birthday"></result>
        </collection>
    </resultMap>

    <select id="getRoleById" parameterType="int" resultMap="getRoleByIdResultMap">
        SELECT
            r.id as rid,r.role_name,r.role_desc,
            u.*
        FROM
            user_role ur
                JOIN role r ON ur.rid=r.id
                JOIN user u ON ur.uid=u.id
        WHERE
            r.id=#{id}
    </select>
</mapper>
5、测试
  /**
     * 多对多:一个user 对 多个role   一个role 对 多个user
     */
    @Test
    public void testGetUserById(){
       //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
       InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //创建sqlSession
        SqlSession sqlSession = sessionFactory.openSession();

    @Test
    public void testGetRoleById(){
        RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
        Role role = roleMapper.getRoleById(1);
        System.out.println(role);
    }


       //释放资源
        sqlSession.close();
        inputStream.close();
    }

四、MyBAtis注解

1、基本常用的注解有:

@Insert: 实现新增

@Update:实现更新

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result一起使用,封装多个结果的集合(其内使用@Result处理当前对象的基本属性,再处理返回值)

@ResultMap:实现引用@Results定义的封装

@One:实现一对一结果集 封装

@Many:实现一对多结果集封装

@SelectProvider:实现动态SQL映射

@CacheNamespace:实现注解二级缓存的使用

注意:复杂的注解不好编写的情况下可以使用Mapper文件配合使用

2、复杂关系的注解(一对一、一对多/多对一、多对多关系)

相关注解介绍 :
@Results注解:
@Results代替了标签< resultMap> 该注解中可以使用单个@Result注解,也可以使用@Result集合

格式:

@Results ({@Result () , @Result ()}) 或者@Result (@Result())

@Result 注解:
@Result注解代替了< id> 标签和< result>标签

@Result 中 的 属性介绍:
id 是否是主键字段

column 数据库中列的名

property 需要装配的属性名

one 需要使用 @One 注解 (@Result (one = @One) ())

many 需要使用的@Many 注解 (@Result (many = @many) ())

@One 注解(一对一):
代替了< association>标签,是多表查询的关键,在注解中用来制定子查询返回单一对象

@One 注解属性介绍:
select 指定用来多表查询 的 sqlmapper

fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。

语法格式:

@Result(column = " “,property=” ",one=@Onet(select = " "))

@Many 注解(多对一)
代替了< Collection>标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。

注意:聚集元素用来处理"一对多"的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList)但是注解中可以不定义;

语法格式:

@Result(property=" “,column=” “,many=@Many(select=” "))

五、一对一查询(注解)

在HusbandMapper.java接口中使用注解进行查询注入数据

HusbandMapper.java

package com.etime.mapper;

import com.etime.pojo.Husband;
import com.etime.pojo.Wife;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface HusbandMapper {
    //使用一对一关系注解实现查询
    @Select("select * from husband")//查询所有丈夫的信息
    //将信息放入结果集合中
    @Results({
            @Result(property = "hid",column = "hid"),//设置字段属性对应的数据库列名
            @Result(property = "hname",column = "hname"),
            @Result(property = "wid",column = "wid"),
            //对根据丈夫表内的对应妻子wid到妻子表中查找妻子的信息
            @Result(property = "wife",javaType = Wife.class,column = "wid",
                    one=@One(select = "com.etime.mapper.WifeMapper.getWifeByWid"))
    })
    List<Husband> getAllHusband();
}

在WifeMapper.java中进行注解的使用,对妻子的基本数据进行数据查取

package com.etime.mapper;

import com.etime.pojo.Wife;
import org.apache.ibatis.annotations.Select;

public interface WifeMapper {
    //通过@Select查询注解的方方式获取到妻子的基本数据
    @Select("select * from wife where wid=#{wid}")
    Wife getWifeByWid(int wid);
}

对妻子和丈夫的一对一的关系进行测试

//使用一对一关系注解查询丈夫和妻子的基本信息
    @Test
    public void t07(){
        SqlSession sqlSession =sqlSessionUtil.getSqlSession();
        HusbandMapper husbandMapper = sqlSession.getMapper(HusbandMapper.class);
        List<Husband> list = husbandMapper.getAllHusband();
        list.forEach(System.out::println);
        sqlSession.close();
    }

六、一对多查询(注解)

这里即将的测试的关系是多个学生属于同一班的关系

创建学生实体类

package com.etime.pojo;

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

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
    private int sid;
    private String sname;
    private int cid;
    //创建一个班级类的属性给到学生实体类,不同的学生来自不同的班,多个学生属于同一个班级
    private Classes classes;
}

创建班级实体类

package com.etime.pojo;

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


@NoArgsConstructor
@AllArgsConstructor
@Data
public class Classes {
    private int cid;
    private String cname;
}

在StudentMapper.java接口中使用注解的方式处理查询语句一查查询到的数据 问题,并处理 查询到的班级classes返回的值

package com.etime.mapper;

import com.etime.pojo.Classes;
import com.etime.pojo.Student;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface StudentMapper {
    //使用@Select查询所有学生信息
    @Select("select * from student")
    //使用@Results注解处理查询到的学生实体类中的基本属性以及对应的班级信息
    //并通过one = @One 的方式把查询到接收到的返回班级实体类进行处理
    @Results({
            @Result(property = "sid",column = "sid"),
            @Result(property = "sname",column = "sname"),
            @Result(property = "cid",column = "cid"),
            @Result(property = "classes",javaType = Classes.class,column = "cid",
            one = @One(select = "com.etime.mapper.ClassesMapper.getClassesByCid"))
    })
    List<Student> getAllStudent();
}

在ClassesMapper.java中使用注解的方式根据班级id查询班级的相关信息

ClassesMapper.java

package com.etime.mapper;

import com.etime.pojo.Classes;
import org.apache.ibatis.annotations.Select;

public interface ClassesMapper {
    //使用@Select注解的方式通过查询返回值为班级对象给到学生实体类做数据处理的StudentMapper接口的one = @One处理
    @Select("select * from classes where cid=#{cid}")
    Classes getClassesByCid(int cid);
}

编写测试

@Test
    public void t08(){
        SqlSession sqlSession = sqlSessionUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> list = studentMapper.getAllStudent();
        list.forEach(System.out::println);
        sqlSession.close();
    }

由上面的准备我们将测试多对一查询的情况

一对多反过来测试

对代码进行修改测试查看是否书写更简便些

修改学生实体类

Student.java

package com.etime.pojo;

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

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
    private int sid;
    private String sname;
    private int cid;
}

对班级实体类进行修改

Classes.java

package com.etime.pojo;

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

import java.util.List;


@NoArgsConstructor
@AllArgsConstructor
@Data
public class Classes {
    private int cid;
    private String cname;
    List<Student> stuList;
}

对学生类的数据获取接口做修改

public interface StudentMapper {
    //使用@Select查询所有学生信息
    @Select("select * from student where cid=#{cid}")
    Student getStudentByCid(int cid);
}

对班级类进行数据获取进行数据处理

package com.etime.mapper;

import com.etime.pojo.Classes;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface ClassesMapper {
    //使用@Select注解的方式通过查询返回值为学生对象给到班级实体类做数据处理的ClassesMapper接口的many = @Many多条数据处理
    //其实由这里可以看出来多对一和一对多是差不多的看是哪一个为主体
    //这里返回来处理的是集合所以javaType给到的是List.call 数据做处理的也是@Many注解(注意many=@Many别误解为多对多)
    @Select("select * from classes")
    @Results({
            @Result(property = "cid",column = "cid"),
            @Result(property = "cname",column = "cname"),
            @Result(property = "stuList",javaType = List.class,column = "cid",
                    many = @Many(select = "com.etime.mapper.StudentMapper.getStudentByCid"))
    })
     List<Classes> getAllClasses();
}

由上可知的一对多的方式进行的数据查询可以看出,其实两种方式都差不多,只是看是怎么看他们之间的关系型,以谁为主体

六、多对多关系注解方式的查询数据

众所周知的学生和课程之间是常见的多对多的关系,接下来就以学生关系来测试多对多的关系

创建课程实体类

package com.etime.pojo;

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

@AllArgsConstructor
@Data
@NoArgsConstructor
public class Course {
    private int courseid;
    private String coursename;
}

创建学生实体类对象

Student.java

package com.etime.pojo;

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

import java.io.Serializable;
import java.util.List;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student implements Serializable {
    private int sid;
    private String sname;
    private int cid;
    private List<StudentCourse> studentCourseList;
}

创建学生和课程的关系表的实体类

StudentCourse.java

package com.etime.pojo;

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

@NoArgsConstructor
@AllArgsConstructor
@Data
public class StudentCourse {
    private int scid;
    private int sid;
    private int courseid;
    private Course course;
}

创建课程CourseMapper.java接口查询数据

package com.etime.mapper;

import com.etime.pojo.Course;
import org.apache.ibatis.annotations.Select;

public interface CourseMapper {
    //由课程id到课程表中进行查询课程信息
    @Select("select * from course where courseid=#{courseid}")
    Course getCourseByCourseid(int courseid);
}

创建学生StudentMapper.java接口查询数据处理

package com.etime.mapper;

import com.etime.pojo.Classes;
import com.etime.pojo.Student;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface StudentMapper {
    //使用@Select查询所有学生信息
    //通过@Result注解中的属性many = @Many进行数据处理,将得到的课程对象返回到学生实体类对象studentCourseList中
    @Select("select * from student")
    @Results({
            @Result(property = "sid",column = "sid"),
            @Result(property = "sname",column = "sname"),
            @Result(property = "cid",column = "cid"),
            @Result(property = "studentCourseList",javaType = List.class,column = "sid",
            many = @Many(select = "com.etime.mapper.StudentCourseMapper.getStudentCourseBySid"))
    })
    List<Student> getStudentAndCourse();
}

创建学生课程接口StudentCourseMapper.java查询数据,对数据进行处理

package com.etime.mapper;

import com.etime.pojo.Course;
import com.etime.pojo.StudentCourse;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface StudentCourseMapper {
    //@Select同样的通过注解的方式对数据进行全部查询,处理的通过id查询到的课程单个实体类
    @Select("select * from studentcourse where sid=#{sid}")
    @Results({
           @Result(property = "scid",column = "scid"),
            @Result(property = "sid",column = "sid"),
            @Result(property = "courseid",column = "courseid"),
            @Result(property = "course",javaType = Course.class,column = "courseid",
            one = @One(select = "com.etime.mapper.CourseMapper.getCourseByCourseid"))
    })
    //根据学生id查找所有课程对应的id
    List<StudentCourse> getStudentCourseBySid(int sid);
}

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

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

相关文章

充电桩负载测试的影响是什么

充电桩负载测试是评估充电桩性能和稳定性的重要环节&#xff0c;其影响主要体现在以下几个方面&#xff1a; 1. 安全性&#xff1a;充电桩负载测试可以检测充电桩在高负载情况下的电气安全性能&#xff0c;如电压、电流、温度等参数是否在正常范围内。如果充电桩在高负载下出现…

【圣诞】极安云科赠书活动第①期:CTF实战:从入门到提升

【圣诞】极安云科赠书活动第①期&#xff1a;CTF实战:从入门到提升 9787111724834 9787121376955 9787302556275 ISBN编号&#xff1a;9787111724834 书名&#xff1a;CTF实战:从入门到提升 定&#xff1a;99.00元 开本&#xff1a;184&#xff4d;&#xff4d;260&#xff…

Android:安卓学习笔记之OkHttp原理的简单理解和使用

Android OkHttp使用原理的简单理解和使用 OkHttp 0、前言1、请求与响应流程 1.1 请求的封装1.2 请求的发送1.3 请求的调度1.4 请求的处理2、拦截器 2.1 RetryAndFollowUpInterceptor2.2 BridgeInterceptor2.3 CacheInterceptor 2.3.1、HTTP缓存原理2.3.2、强制缓存2.3.3、协商…

Linux网络编程(一):网络基础(下)

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 网络编程 1. 协议的概念 1.1 什么是协议 从应用的角度出发&#xff0c;协议可理解为 “规则”&#xff0c;是数据传输和数据解释的规则 假设&#xff0c;A、B双方欲传输文件&#xff0c;规定&#xff1a; 第一次&#xff…

云闪付支付:一种新型的移动支付方式

随着科技的发展&#xff0c;我们的生活方式也在不断地改变。其中&#xff0c;移动支付已经成为我们生活中不可或缺的一部分。而在这个领域中&#xff0c;云闪付支付无疑是一种新型的、高效便捷的支付方式。那么&#xff0c;云闪付支付究竟是什么&#xff0c;它又有哪些特点呢&a…

2023年12月23日 十二生肖 今日运势

小运播报&#xff1a;2023年12月23日&#xff0c;星期六&#xff0c;农历十一月十一 &#xff08;癸卯年甲子月乙卯日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;狗、猪、羊 需要注意&#xff1a;鼠、龙、鸡 喜神方位&#xff1a;西北方 财神方位&#xff…

Java 虚拟机中的内存结构

1 内存结构 1.1 程序计数器 1.1.1 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条 jvm 指令的执行地址 特点&#xff1a; 是线程私有的&#xff08;每个线程独有自己的一份&#xff09;不会存在内存溢出 1.1.2 作…

c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

设计模式:循序渐进走入工厂模式

文章目录 前言一、引入二、简单工厂模式1.实现2.优缺点3.扩展 三、工厂方法模式1.实现2.优缺点 四、抽象工厂模式1.实现2.优缺点3.使用场景 五、模式扩展六、JDK源码解析总结 前言 软件设计模式之工厂模式。 一、引入 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类…

java八股jvm

JVM虚拟机篇-01-JVM介绍、运行流程_哔哩哔哩_bilibili 1.PC程序计数器 2.堆 3.虚拟机栈 4.方法区/永久代/元空间 5.直接内存 JVM虚拟机篇-06-JVM组成-你听过直接内存吗_哔哩哔哩_bilibili 6.双亲委派 从下往上找&#xff0c;有同名类优先使用上级加载器的&#xff0c;不用自…

工作实践篇 Flink(一:flink提交jar)

一&#xff1a;参数 flink 模式 – standalone 二&#xff1a;步骤 1. 将本地测试好的代码进行本地运行。确保没问题&#xff0c;进行打包。 2. 找到打好的jar包&#xff0c;将jar包上传到对应的服务器。 3. 执行flink命令&#xff0c;跑代码。 /opt/flink/flink-1.13.6/bi…

Java中中文字典排序/多音字处理

Pinyin4j是一个Java库&#xff0c;用于将汉字转换为拼音。它是由中国清华大学的Tsinghua University和中国科学院计算技术研究所的研究人员开发的。Pinyin4j可以用于Java应用程序中&#xff0c;以便在需要时将汉字转换为拼音。例如&#xff0c;它可以用于中文输入法、文本编辑器…

Http---HTTP 请求报文

1. HTTP 请求报文介绍 HTTP最常见的请求报文有两种: GET 方式的请求报文POST 方式的请求报文 说明: GET: 获取web服务器数据POST: 向web服务器提交数据 2. HTTP GET 请求报文分析 HTTP GET 请求报文效果图: GET 请求报文说明: ---- 请求行 ---- GET / HTTP/1.1 # GET请…

慢调用链诊断利器-ARMS 代码热点

作者&#xff1a;铖朴、义泊 可观测技术背景 从最早的 Google 发表的一篇名为《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》的论文开始&#xff0c;到后来以&#xff1a;Metrics&#xff08;指标&#xff09;、Tracing&#xff08;链路追踪&#xf…

Android开发——添加图片

1、首先选择一张需要的图片&#xff0c;通过左侧的Resource Manage选择“”并选择Import Drawables 选择一张图片 并调整以下两个内容 这两个内容的作用借用谷歌官方的Android开发教程的内容&#xff1a; *Android 设备具有不同的屏幕尺寸&#xff08;手机、平板电脑和电视等…

2023 下半年系统架构设计师学习进度

文章目录 复习计划&#xff1a;每周350分钟第一周&#xff08;339分钟&#xff09;第二周&#xff08;265分钟&#xff09;第三周&#xff08;171分钟&#xff09;第四周&#xff08;214分钟&#xff09;第五周&#xff08;274分钟&#xff09;第六周&#xff08;191分钟&#…

医院手术麻醉系统源码,基于PHP、 js 、mysql、laravel、vue2技术开发,实现患者数据的自动采集和医疗文书自动生成

手麻系统作为医院信息化系统的一环&#xff0c;由监护设备数据采集系统和麻醉信息管理系统两个子部分组成。手麻信息系统覆盖了患者术前、术中、术后的手术过程&#xff0c;可以实现麻醉信息的电子化和手术麻醉全过程动态跟踪。 以服务围术期临床业务工作的开展为核心&#xf…

1. 行为模式 - 责任链模式

亦称&#xff1a; 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility 意图 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理…

【Linux笔记】网络操作命令详细介绍

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 前言&#xff1a; 网络操作是Linux系统中常见的任务之一&#xff0c;它涵盖了测试网络连接、配置网络接口、显示网络统计信息以及远程登录和文件传…

MATLAB - 机器人逆运动学设计器(Inverse Kinematics Designer APP)

系列文章目录 前言 一、简介 通过逆运动学设计器&#xff0c;您可以为 URDF 机器人模型设计逆运动学求解器。您可以调整逆运动学求解器并添加约束条件&#xff0c;以实现所需的行为。使用该程序&#xff0c;您可以 从 URDF 文件或 MATLAB 工作区导入 URDF 机器人模型。调整逆…