当前位置: 首页 > news >正文

MyBatis 关联查询

目录

一、一对一查询(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*/@Testpublic void testGetAccountById(){//加载mybatis-config.xmlString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//创建sqlSessionSqlSession 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*/@Testpublic void testGetUserById(){//加载mybatis-config.xmlString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//创建sqlSessionSqlSession 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">SELECTr.id as rid,r.role_name,r.role_desc,u.*FROMuser_role urJOIN role r ON ur.rid=r.idJOIN user u ON ur.uid=u.idWHEREr.id=#{id}</select>
</mapper>
5、测试
  /*** 多对多:一个user 对 多个role   一个role 对 多个user*/@Testpublic void testGetUserById(){//加载mybatis-config.xmlString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//创建sqlSessionSqlSession sqlSession = sessionFactory.openSession();@Testpublic 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);
}

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

//使用一对一关系注解查询丈夫和妻子的基本信息@Testpublic 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);
}

编写测试

@Testpublic 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查找所有课程对应的idList<StudentCourse> getStudentCourseBySid(int sid);
}

相关文章:

MyBatis 关联查询

目录 一、一对一查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a; 2、创建account和user实体类 3、创建AccountMapper 接口 4、创建并配置AccountMapper.xml 5、测试 二、一对多查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a;…...

NVIDIA NCCL 源码学习(十二)- double binary tree

上节我们以ring allreduce为例看到了集合通信的过程&#xff0c;但是随着训练任务中使用的gpu个数的扩展&#xff0c;ring allreduce的延迟会线性增长&#xff0c;为了解决这个问题&#xff0c;NCCL引入了tree算法&#xff0c;即double binary tree。 double binary tree 朴素…...

.net core webapi 大文件上传到wwwroot文件夹

1.配置staticfiles(program文件中) app.UseStaticFiles();2.在wwwroot下创建upload文件夹 3.返回结果封装 namespace webapi;/// <summary> /// 统一数据响应格式 /// </summary> public class Results<T> {/// <summary>/// 自定义的响应码&#xff…...

C++设计模式 #3策略模式(Strategy Method)

动机 在软件构建过程中&#xff0c;某些对象使用的的算法可能多种多样&#xff0c;经常改变。如果将这些算法都写在类中&#xff0c;会使得类变得异常复杂&#xff1b;而且有时候支持不频繁使用的算法也是性能负担。 如何在运行时根据需求透明地更改对象的算法&#xff1f;将…...

金融知识——OMS、EMS和PMS分别是什么意思

金融知识——OMS、EMS和PMS分别是什么意思 OMSEMSPMS OMS OMS&#xff08;Order Management System&#xff09;是为了管理头寸&#xff0c;以多种方式创建订单&#xff0c;并进行订单屈从检验以使得用户在订单创建时收到一些约束。在交易管理方面&#xff0c;OMS提供交易组合…...

Docker——微服务的部署

Docker——微服务的部署 文章目录 Docker——微服务的部署初识DockerDocker与虚拟机Docker架构安装DockerCentOS安装Docker卸载&#xff08;可选&#xff09;安装docker启动docker配置镜像加速 Docker的基本操作Docker的基本操作——镜像Docker基本操作——容器Docker基本操作—…...

AI时代架构设计新模式

云原生架构原则 云原生架构本身作为一种架构&#xff0c;也有若干架构原则作为应用架构的核心架构控制面&#xff0c;通过遵从这些架构原则可以让技术主管和架构师在做技术选择时不会出现大的偏差。 服务化原则 当代码规模超出小团队的合作范围时&#xff0c;就有必要进行服务…...

速盾网络:高防IP的好处

随着互联网的快速发展&#xff0c;网络安全问题日益突出&#xff0c;越来越多的企业和个人开始关注网络安全防护。其中&#xff0c;高防IP作为一种高效的防御手段&#xff0c;越来越受到用户的青睐。本文将介绍速盾网络高防IP的好处&#xff0c;帮助您了解其优势和应用场景。一…...

创建Maven Web工程

目录下也会有对应的生命周期。其中常用的是&#xff1a;clean、compile、package、install。 比如这里install &#xff0c;如果其他项目需要将这里的模块作为依赖使用&#xff0c;那就可以 install 。安装到本地仓库的位置&#xff1a; Java的Web工程&#xff0c;所以我们要选…...

【PHP入门】2.2 流程控制

-流程控制- 流程控制&#xff1a;代码执行的方向 2.2.1控制分类 顺序结构&#xff1a;代码从上往下&#xff0c;顺序执行。&#xff08;代码执行的最基本结构&#xff09; 分支结构&#xff1a;给定一个条件&#xff0c;同时有多种可执行代码&#xff08;块&#xff09;&am…...

springCould中的zookeeper-从小白开始【3】

目录 1.启动zookeeper❤️❤️❤️ 2.创建8004模块 ❤️❤️❤️ 3.临时节点还是永久节点❤️❤️❤️ 4.创建zk80消费模块❤️❤️❤️ 1.启动zookeeper❤️❤️❤️ 进入自己zookeeper的bin目录下 分别使用命令&#xff1a; ./zkServer.sh start 和 ./zkCli.sh -serve…...

Node.js-模块化(二)

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…...

MAC 安装nginx

使用Homebrew方式进行安装 步骤&#xff1a; 1、更新 Homebrew brew update 2、下载并安装 Nginx brew install nginx 3、查看 nginx 配置信息 brew info nginx zhanghuaBreeze ~ % brew info nginx // 版本信息 > nginx: stable 1.25.1 (bottled), HEAD HTTP(S) se…...

开源 AI 新秀崛起:Bittensor 更像是真正的“OpenAI”

强大的人工智能正在飞速发展&#xff0c;而完全由 OpenAI、Midjourney、Google&#xff08;Bard&#xff09;这样的少数公司控制 AI 不免让人感到担忧。在这样的背景下&#xff0c;试图用创新性解决方案处理人工智能中心化问题、权力集中于少数公司的 Bittensor&#xff0c;可谓…...

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

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

如何将图片(matlab、python)无损放入word论文

许多论文对插图有要求&#xff0c;直接插入png、jpg一般是不行的&#xff0c;这是一篇顶刊文章&#xff08;pdf&#xff09;的插图&#xff0c;放大2400%后依旧清晰&#xff0c;搜罗了网上的方法&#xff0c;总结了一下如何将图片无损放入论文中。 这里主要讨论的是数据生成的图…...

在Next.js和React中搭建Cesium项目

在Next.js和React中搭建Cesium项目&#xff0c;需要确保Cesium能够与服务端渲染(SSR)兼容&#xff0c;因为Next.js默认是SSR的。Cesium是一个基于WebGL的地理信息可视化库&#xff0c;通常用于在网页中展示三维地球或地图。下面是一个基本的步骤&#xff0c;用于在Next.js项目中…...

docker学习(十、搭建redis集群,三主三从)

文章目录 一、docker创建6个redis容器创建6个redis容器回顾各个属性含义 二、划分主从&#xff0c;3主3从划分主从查看状态查看节点信息 docker搭建Redis集群相关知识&#xff1a; docker学习&#xff08;九、分布式存储亿级数据知识&#xff09; docker学习&#xff08;十、搭…...

ES排错命令

GET _cat/indices?v&healthred GET _cat/indices?v&healthyellow GET _cat/indices?v&healthgreen确定哪些索引有问题&#xff0c;多少索引有问题。_cat API 可以通过返回结果告诉我们这一点 查看有问题的分片以及原因。 这与索引列表有关&#xff0c;但是索引…...

爬虫实战案例 -- 爬取豆瓣读书网页内容

进入网站检查信息 , 确定请求方式以及相关数据 找到爬取目标位置 开始敲代码 # 链接网站 def url_link(url):res requests.get(url,headers headers)response res.textparse_data(response)# 爬取信息 def parse_data(data):msg <li\sclass"media\sclearfix…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...