mybatis实现多表查询

mybatis高级查询【掌握】

1、准备工作

【1】包结构

创建java项目,导入jar包和log4j日志配置文件以及连接数据库的配置文件;

在这里插入图片描述

【2】导入SQL脚本

运行资料中的sql脚本:mybatis.sql

在这里插入图片描述

【3】创建实体来包,导入资料中的pojo

在这里插入图片描述

【4】UserMapper接口
package com.itheima.sh.dao;
import com.itheima.sh.pojo.User;
public interface UserMapper {//完成根据id查询用户数据;User selectById(Long id);
}
【5】UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.heima.mybatis.mapper.UserMapper"><!--根据id查询:statement--><select id="selectById"  resultType="User">SELECT *  FROM  tb_user WHERE  id=#{id}</select></mapper>
【6】测试
package com.itheima.sh.test;import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.pojo.User;
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.BeforeClass;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class MybatisTest01 {private static UserMapper mapper = null;@BeforeClasspublic static void beforeClass() throws Exception {//1.构建SessionFactoryString resouce = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resouce);SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);//2.获取sessionSqlSession sqlSession = build.openSession(true);//3.获取接口对象mapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void selectById() {User user = mapper.selectById(1L);System.out.println(user);}
}

2、表介绍和表关系说明

导入资料中mybatis.sql脚本。新建以下4张表

tb_user:用户表
tb_order:订单表
tb_item:商品表
tb_orderdetail:订单详情表

在这里插入图片描述

【表关系】

1.tb_user和 tb_order表关系tb_user  《==》  tb_order:一对多, 一个人可以下多个订单tb_order 《==》 tb_user:一对一,一个订单只能属于一个人结论:tb_user和tb_order属于一对多的关系,需要将一方tb_user的主键作为多方tb_order的外键维护关系
2.tb_order 和 tb_item 表关系tb_order 《==》 tb_item :一个订单可以有多个商品tb_item 《==》 tb_order:一个商品可以在多个订单上结论:tb_order和tb_item属于多对多的关系,需要创建中间表tb_orderdetail维护两个表的关系,并且将两张表	的主键作为中间表的外键

3、一对一查询

需求:通过订单编号20140921003查询出订单信息,并查询出下单人信息

【实现:关联查询】

【目标】使用多表关联查询,完成根据订单号查询订单信息和下单人信息(订单号:20140921003)

【分析】

一个订单编号对应一个订单,一个订单只能属于一个人。所以上述需求实现是一对一的实现。

【步骤】

1、首先,编写接口方法。编写SQL语句;
2、第二步:分析SQL,封装数据(关联对象);
3、处理多表之间的数据封装(数据库字段名---》实体类的属性名之间的映射)

【实现】

第一步:需求分析

​ 编写多表关联查询SQL,根据订单号查询订单信息下单人信息;

查询语句以及查询结果:

在这里插入图片描述

    #方式一:分步查询#第一步:根据order_number查询订单信息;SELECT * FROM tb_order WHERE order_number = '20140921003';#第二步:根据订单信息中的user_id查询出下单人的信息;SELECT * FROM tb_user WHERE id = 1;#方式二:多表关联查询,内连接SELECT * FROM tb_order tbo inner join tb_user tbu on tbo.user_id = tbu.id where tbo.order_number='20140921003'#多表数据封装问题:#关联对象封装数据(在Order中引用User)
第二步:添加关联

修改Order:

​ 在Order类中,添加关联对象User,并添加getter和setter方法;

package com.itheima.sh.pojo;
/*** 订单表* */
public class Order {private Integer id;private String orderNumber;//关联User对象private User user;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getOrderNumber() {return orderNumber;}public void setOrderNumber(String orderNumber) {this.orderNumber = orderNumber;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", orderNumber='" + orderNumber + '\'' +", user=" + user +'}';}
}
第三步:添加方法

编写OrderMapper接口

在这里插入图片描述

public interface OrderMapper {/*** 根据订单号查询订单及下单人的信息:方式二* @param orderNumber* @return*/Order queryOrderAndUserByOrderNumber2(@Param("orderNumber")String orderNumber);
}
第四步:编写SQL

在OrderMapper.xml中编写对应的SQL,并将OrderMapper.xml加入到mybatis-config.xml全局配置中;在这里插入图片描述

【OrderMapper.xml代码;】

说明:

association:配置关联对象(User)的映射关系<association property="user" javaType="User" autoMapping="true"></association>属性:property:关联对象在主表实体类中的属性名;property="user" 表示在Order类中的引用的User类的对象		   成员变量名javaType:关联对象的类型;javaType="User" 表示引用的user对象属于User类型
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
映射文件
namespace 指定接口的类全名
-->
<mapper namespace="com.itheima.sh.dao.OrderMapper"><!--1.autoMapping="true" 表示只需要给当前表的id然后自动映射当前表的其他列值到对应实体类的属性中,这属于偷懒行为,开发中我们最好都书写出来2.id标签表示id的映射关系3.result标签表示其他列和pojo类的属性映射关系4.一对一映射关系使用子标签association来表示引用的另一个pojo类的对象--><resultMap id="orderAndUserResultRelative" type="Order" autoMapping="true"><!--主表主键--><id column="id" property="id"/><!--关联关系--><!--1.property="user" 表示在Order类中的引用的User类的对象成员变量名2.javaType="User" 表示引用的user对象属于User类型--><association property="user" javaType="User" autoMapping="true"><!--从表主键--><id column="id" property="id"/><!--<result column="user_name" property="userName"/>--></association></resultMap><!--多表关联查询:一对一--><select id="queryOrderAndUserByOrderNumber2" resultMap="orderAndUserResultRelative">SELECT*FROMtb_order tboINNER JOIN tb_user tbu ON tbo.user_id = tbu.idWHEREtbo.order_number = #{orderNumber}</select>
</mapper>

说明:

1、由于queryOrderAndUserByOrderNumber2查询的结果Order对象中需要封装User信息,所以返回值不能够再使用单纯的resultType来操作;2、定义resultMap进行关联查询的配置,其中:属性:id:标识这个resultMap;type:返回的结果类型autoMapping="true": 表示只需要给当前表的id然后自动映射当前表的其他列值到对应实体类的属性中,这		  属于偷懒行为,开发中我们最好都书写出来子元素:id:主表主键映射result:主表普通字段的映射association:关联对象的映射配置3、association:配置关联对象(User)的映射关系属性:property:关联对象在主表实体类中的属性名;property="user" 表示在Order类中的引用的User类的对象		   成员变量名javaType:关联对象的类型;javaType="User" 表示引用的user对象属于User类型
第五步:测试
package com.itheima.sh.test;import com.itheima.sh.dao.OrderMapper;
import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.pojo.Order;
import com.itheima.sh.pojo.User;
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.BeforeClass;
import org.junit.Test;
import java.io.InputStream;
public class MybatisTest02 {private static OrderMapper mapper = null;@BeforeClasspublic static void beforeClass() throws Exception {//1.构建SessionFactoryString resouce = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resouce);SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);//2.获取sessionSqlSession sqlSession = build.openSession(true);//3.获取接口对象mapper = sqlSession.getMapper(OrderMapper.class);}@Testpublic void selectById() {Order order = mapper.queryOrderAndUserByOrderNumber2("20140921003");System.out.println("order = " + order);}
}

【测试结果】

在这里插入图片描述

注意事项

通过上述测试结果,我们发现User的id是错误的,不是3,正确结果是1:

在这里插入图片描述

因为tb_user表的主键是id,tb_order的主键也是id。查询的结果中有两列相同的id字段。在将查询结果封装到实体类的过程中就会封装错误。

注意:user表查询的是id不是id1,由于SQLyog图形化界面显示的原因。可以在cmd窗口查看结果:

在这里插入图片描述

【解决方案】

1、建议将所要查询的所有字段显示地写出来;
2、将多表关联查询结果中,相同的字段名取不同的别名;

在这里插入图片描述

resultMap中应该如下配置:

在这里插入图片描述

【正确结果】

在这里插入图片描述

【小结】
一对一关联查询:
1、需要在Order实体类中关联User对象;最终将数据封装到Order中;
2、在OrderMapper.xml文件中书写关联语句并配置关系;
3、关联关系配置:<resultMap id="orderAndUserResultRelative" type="Order" autoMapping="true"><!--主表主键--><id column="oid" property="id"/><!--关联关系--><association property="user" javaType="User" autoMapping="true"><!--从表主键--><id column="uid" property="id"/></association></resultMap>

4、一对多查询

【目标】查询id为1的用户及其订单信息

【分析】

​ 一个用户可以有多个订单。

​ 一个订单只能属于一个用户。

用户(1)-----订单(n)

【步骤】

第一步:查询SQL分析;
第二步:添加关联关系;
第三步:编写接口方法;
第四步:编写映射文件;
第五步:测试

【实现】

第一步:需求分析

编写SQL实现查询id为1的用户及其订单信息

查询语句及查询结果:

在这里插入图片描述

#查询id为1的用户及其订单信息
select * from tb_user where id=1;
select * from tb_order where user_id=1;#一对多 内连接查询
select * from tb_user tbu inner join tb_order tbo on tbu.id = tbo.user_id where tbu.id=1;
# 封装数据:关联对象,一个用户关联多个订单  User(List<Order> orderList)

说明:一个用户关联多个订单 User(List orderList) ,在User类中定义一个List集合存储多个订单Order对象。

第二步:添加映射关系

​ 因为一个用户可以拥有多个订单,所以用户订单一对多的关系;需要在User类中添加一个List<Order> 属性;

package com.itheima.sh.pojo;import java.io.Serializable;
import java.util.List;public class User implements Serializable {private Long id;// 用户名private String userName;// 密码private String password;// 姓名private String name;// 年龄private Integer age;//0 女性 1 男性private Integer sex;//订单List<Order> orders;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Integer getSex() {return sex;}public void setSex(Integer sex) {this.sex = sex;}public List<Order> getOrders() {return orders;}public void setOrders(List<Order> orders) {this.orders = orders;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", password='" + password + '\'' +", name='" + name + '\'' +", age=" + age +", sex=" + sex +", orders=" + orders +'}';}
}
第三步:编写接口方法

UserMapper接口中,添加关联查询;

  /*** 根据用户id查询用户及其订单信息* @param id* @return*/User oneToManyQuery(@Param("id") Long id);
第四步:编写SQL

​ 在UserMapper.xml文件中编写SQL语句完成一对多的关联查询;

说明:

1.一对多使用collection子标签进行关联多方Order<collection property="类中引用多方的成员变量名" javaType="存放多方容器的类型" ofType="多方类型" autoMapping="true"></collection>
2.属性:1)property="orders" 这里的orders表示User类的成员变量orders2)javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List 一般不书写3) ofType="Order" 表示List集合中存储数据的类型 Order
3.一定要记住这里给user表的id起别名是uid,order表的id起别名是oid.在resultMap标签的id子标签中的column属性值书写对应的uid和oid.
    <!--自定义结果集--><resultMap id="oneToManyResult" type="User" autoMapping="true"><!--User的主键--><id column="uid" property="id"/><!--Order关联映射--><!--1.一对多使用collection子标签进行关联多方Order2.属性:1)property="orders" 这里的orders表示User类的成员变量orders2)javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List,可以不配置3) ofType="Order" 表示List集合中存储数据的类型 Order--><collection property="orders" javaType="List" ofType="Order" autoMapping="true"><!--Order的主键--><id column="oid" property="id" /></collection></resultMap><!--根据用户ID查询用户及其订单数据--><select id="oneToManyQuery" resultMap="oneToManyResult">SELECTtbo.id as oid,tbo.order_number,tbu.id as uid,tbu.user_name,tbu.password,tbu.name,tbu.age,tbu.sexFROMtb_user tbuINNER JOIN tb_order tbo ON tbu.id = tbo.user_idWHEREtbu.id = #{id}</select>
第五步:测试

在用户的测试类中

public class MybatisTest01 {private static UserMapper mapper = null;@BeforeClasspublic static void beforeClass() throws Exception {//1.构建SessionFactoryString resouce = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resouce);SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);//2.获取sessionSqlSession sqlSession = build.openSession(true);//3.获取接口对象mapper = sqlSession.getMapper(UserMapper.class);}  //根据用户ID查询用户及其订单数据@Testpublic void oneToManyQuery() {User user = mapper.oneToManyQuery(1L);System.out.println("user = " + user);}
}

在这里插入图片描述

【小结】
一对多关系配置:
1、在对象中添加映射关系;
2、编写接口方法,编写SQL;
3、编写resultMap处理数据库字段和实体类之间数据的封装;

5、多对多

【需求】:查询订单号为20140921001的订单的详情信息即查询订单信息+订单中的商品信息;

【步骤】

第一步:需求分析;
第二步:添加关联关系;
第三步:编写SQL;
第四步:配置关联关系;
第五步:运行;
第一步:【需求分析】

在这里插入图片描述

1、查询订单详情信息即:查询订单信息+订单中的商品信息;
2、订单信息在tb_order中,订单中的商品信息在tb_item中,这两个表是通过中间表 tb_orderdetail进行关联的。
3、关联查询思路:先查询订单表,通过订单表中的id关联中间表order_id,然后查询中间表,根据中间表的item_id关联商品表的id,最后查询商品表;

【SQL查询及结果】

在这里插入图片描述

# 【需求】:查询订单号为20140921001的订单的详情信息 订单的详情信息 = 订单+商品
SELECT*
FROMtb_order tbo
INNER JOIN tb_orderdetail detail ON tbo.id = detail.order_id
INNER JOIN tb_item item ON detail.item_id = item.id
WHERE
tbo.order_number = '20140921001';
第二步:添加关联关系

【修改Order】

​ 一个订单表中关联了多个订单详情信息,所以在订单表中添加List<Orderdetail>属性:

【Order.java】

package com.itheima.sh.pojo;
import java.util.List;
/*** 订单表* */
public class Order {private Integer id;private String orderNumber;//关联User对象private User user;//关联订单详情列表private List<Orderdetail> detailList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getOrderNumber() {return orderNumber;}public void setOrderNumber(String orderNumber) {this.orderNumber = orderNumber;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public List<Orderdetail> getDetailList() {return detailList;}public void setDetailList(List<Orderdetail> detailList) {this.detailList = detailList;}@Overridepublic String toString() {return "Order{" +"id=" + id +", orderNumber='" + orderNumber + '\'' +", user=" + user +", detailList=" + detailList +'}';}
}

【修改Orderdetail】

​ 每一条订单详情记录中都包含了一条商品信息,所以需要在Orderdetail中添加一个Item属性;

【Orderdetail.java】

package com.itheima.sh.pojo;
public class Orderdetail {   private Integer id;  private Double totalPrice;  private Integer status;//商品信息private Item item;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Double getTotalPrice() {return totalPrice;}public void setTotalPrice(Double totalPrice) {this.totalPrice = totalPrice;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public Item getItem() {return item;}public void setItem(Item item) {this.item = item;}@Overridepublic String toString() {return "Orderdetail{" +"id=" + id +", totalPrice=" + totalPrice +", status=" + status +", item=" + item +'}';}
}
第三步:编写接口方法

​ 在OrderMapper接口中新增,根据orderNumber查询订单及订单详情的方法:

public interface OrderMapper {/*** 根据orderNumber查询订单及其详情信息* @param orderNumber* @return*/Order queryOrderAndDetailByOrderNumber(@Param("orderNumber") String orderNumber);
}
第四步:编写SQL

说明:一定要记住这里给order表的id起别名是oid,订单详情表的id起别名是detailId,商品表item的id起别名是itemId。在resultMap标签的id子标签中的column属性值书写对应的oid、detailId和itemId.

 <!--订单及订单详情结果集--><resultMap id="orderAndDetailMap" type="Order" autoMapping="true"><!--tb_order表 和 Order实体类--><!--订单表主键--><id property="id" column="oid"/><!--多个订单详情 1对多:detailList--><collection property="detailList" javaType="List" ofType="Orderdetail" autoMapping="true"><!--tb_order_detail表  和 Orderdetail实体类--><!--订单详情主键  detailId表示下面sql语句的别名--><id property="id" column="detailId"/><!--关联商品对象  一对一:orderdetail-Item--><association property="item" javaType="Item" autoMapping="true"><!--tb_item表 和 Item实体类  itemId 表示下面的sql语句别名--><id property="id" column="itemId"/></association></collection></resultMap><!--多对多查询--><select id="queryOrderAndDetailByOrderNumber" resultMap="orderAndDetailMap">SELECTtbo.id as oid,tbo.order_number,detail.id as detailId,detail.total_price,detail.status,item.id as itemId,item.item_detail,item.item_name,item.item_priceFROMtb_order tboINNER JOIN tb_orderdetail detail ON tbo.id = detail.order_idINNER JOIN tb_item item ON detail.item_id = item.idWHEREtbo.order_number = #{orderNumber};</select>
第五步:测试
    @Testpublic void queryOrderAndDetailByOrderNumber() {Order order = mapper.queryOrderAndDetailByOrderNumber("20140921001");System.out.println("order = " + order);}

在这里插入图片描述

【结果】

在这里插入图片描述

【扩展】

【需求】根据订单号(20140921001)

查询订单信息

查询订单所属用户信息

查询订单中的详细商品信息

在这里插入图片描述

【SQL实现及查询结果】

​ 通过分析,实现这个查询就在上面的查询基础上再关联一个一对一的User信息;

在这里插入图片描述

#查询订单详情
SELECTtbo.id as oid,tbo.order_number,detail.id as detailId,detail.total_price,detail.status,item.id as itemId,item.item_detail,item.item_name,item.item_price,tbu.id as uid,tbu.age,tbu.name,tbu.password,tbu.sex,tbu.user_name
FROMtb_order tbo
INNER JOIN tb_orderdetail detail ON tbo.id = detail.order_id
INNER JOIN tb_item item ON detail.item_id = item.id
INNER JOIN tb_user tbu ON tbo.user_id = tbu.id
WHERE
tbo.order_number = '20140921001';

【添加关联关系】

都已经在实体类添加完毕,直接操作即可

【编写接口方法】

在OrderMapper接口中再扩展一个方法:queryOrderAndDetailAndUserByOrderNumber

    /*** 根据orderNumber查询 订单,详情,商品及用户数据* @param orderNumber* @return*/Order queryOrderAndDetailAndUserByOrderNumber(@Param("orderNumber") String orderNumber);
【编写SQL】
 <!--订单及订单详情结果集--><resultMap id="orderAndDetailMapPlus" type="Order" autoMapping="true"><!--tb_order表 和 Order实体类--><!--订单表主键--><id property="id" column="oid"/><!--Order-User:一对一关联--><association property="user" javaType="User" autoMapping="true"><!--User主键--><id property="id" column="uid"/></association><!--多个订单详情 1对多:detailList--><collection property="detailList" javaType="List" ofType="Orderdetail" autoMapping="true"><!--tb_order_detail表  和 Orderdetail实体类--><!--订单详情主键--><id property="id" column="detailId"/><!--关联商品对象  一对一:orderdetail-Item--><association property="item" javaType="Item" autoMapping="true"><!--tb_item表 和 Item实体类--><id property="id" column="itemId"/></association></collection></resultMap><select id="queryOrderAndDetailAndUserByOrderNumber" resultMap="orderAndDetailMapPlus">SELECTtbo.id as oid,tbo.order_number,detail.id as detailId,detail.total_price,detail.status,item.id as itemId,item.item_detail,item.item_name,item.item_price,tbu.id as uid,tbu.age,tbu.name,tbu.password,tbu.sex,tbu.user_nameFROMtb_order tboINNER JOIN tb_orderdetail detail ON tbo.id = detail.order_idINNER JOIN tb_item item ON detail.item_id = item.idINNER JOIN tb_user tbu ON tbo.user_id = tbu.idWHEREtbo.order_number = #{orderNumber};</select>
【测试】

在这里插入图片描述

【结果】

在这里插入图片描述

6、ResultMap继承

​ 如果两个结果集有重叠的部分,如下图所示。我们可以使用结果集继承来实现重叠的结果集的复用。

在这里插入图片描述

orderAndDetailAndUserMap结果集可以继承orderAndDetailMap结果集。

在这里插入图片描述

7、高级查询小结

resutlType无法帮助我们自动的去完成映射,所以只有使用resultMap手动的进行映射
resultMap: 属性:type 结果集对应的数据类型  Orderid 唯一标识,被引用的时候,进行指定autoMapping 开启自动映射extends 继承子标签:id:配置id属性result:配置其他属性association:配置一对一的映射property 定义对象的属性名javaType 属性的类型autoMapping 开启自动映射collection:配置一对多的映射property 定义对象的属性名javaType 集合的类型ofType 集合中的元素类型 泛型autoMapping 开启自动映射

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift宏的实现

上篇介绍了Swift宏的定义与生声明&#xff0c;本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议&#xff0c;封装一个工具让类或者结构体自动实现Codable协议&#xff0c;并且添加一些协议中没有的功能。 关于Codable协议 Codable很好&#xff0c;但是有一些缺陷&…

141个图表,完美展示数据分类别关系!

本文介绍使用Python工具seaborn详细实现分类关系图表&#xff0c;包含8类图141个代码模版。 分类关系图表用于展示数字变量和一个或多个分类变量之间的关系&#xff0c;可以进一步分为&#xff1a;箱形图&#xff08;box plot&#xff09;、增强箱形图&#xff08;enhanced bo…

DP:子数组问题

文章目录 引言子数组问题介绍动态规划的基本概念具体问题的解决方法动态规划解法&#xff1a;关于子数组问题的几个题1.最大子数组和2.环形子数组的最大和3.乘积最大子数组4.乘积为正数的最长子数组长度5.等差数列划分 总结 引言 介绍动态规划&#xff08;DP&#xff09;在解决…

Deep-LIBRA:一种用于可靠量化乳腺密度的人工智能方法,并在乳腺癌风险评估中进行了独立验证| 文献速递-深度学习自动化疾病检查

Title 题目 Deep-LIBRA: An artificial-intelligence method for robust quantification of breast density with independent validation in breast cancer risk assessment Deep-LIBRA&#xff1a;一种用于可靠量化乳腺密度的人工智能方法&#xff0c;并在乳腺癌风险评估中…

【内网渗透】从0到1的内网渗透基础概念笔记

目录 域 域的介绍 单域 父域和子域 域树 域森林 域名服务器 活动目录 活动目录介绍 域内权限 组 域本地组 全局组 通用组 总结 示例 A-G-DL-P策略 重要的域本地组 重要的全局组、通用组 安全域划分 域 域的介绍 Windows域是计算机网络的一种形式&#xf…

【机器学习】FFmpeg+Whisper:二阶段法视频理解(video-to-text)大模型实战

目录 一、引言 二、FFmpeg工具介绍 2.1 什么是FFmpeg 2.2 FFmpeg核心原理 2.3 FFmpeg使用示例 三、FFmpegWhisper二阶段法视频理解实战 3.1 FFmpeg安装 3.2 Whisper模型下载 3.3 FFmpeg抽取视频的音频 3.3.1 方案一&#xff1a;命令行方式使用ffmpeg 3.3.2 方案二&a…

[论文精读]Variational Graph Auto-Encoders

论文网址&#xff1a;[1611.07308] Variational Graph Auto-Encoders (arxiv.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎…

Android 界面库 (二) 之 Data binding 详细介绍

1. 简介 回顾我们在前面文章《Android 界面库 (一) 之 View binding 简单使用》中学习的 View Binding&#xff0c;它旨在简化 View 与代码之间的绑定过程。它会在编译时期为每个 XML 布局文件生成相应的绑定类(Binding class)&#xff0c;该类里包含了布局文件每个有 ID 的 Vi…

基于SpringBoot扶农助农政策管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

利用 Docker 简化 Nacos 部署:快速搭建 Nacos 服务

利用 Docker 简化 Nacos 部署&#xff1a;快速搭建 Nacos 服务 引言 在微服务架构中&#xff0c;服务注册与发现是确保服务间通信顺畅的关键组件。Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;作为阿里巴巴开源的一个服务发现和配置管理平台&…

【单片机毕业设计选题24039】-基于单片机的太阳能储能智能恒温外卖柜设计

系统功能: 以单片机为控制核心&#xff0c;综合运用传感器、物联网、太阳能等技术&#xff0c;设计一种基于单片机为控制核心的智能恒温外卖柜。它由恒温系统、无线模块、智能提醒系统、供电系统等组成&#xff0c;通过太阳能电池板独立供电&#xff0c;利用太阳能储能元件驱动…

Linux网络编程:套接字编程

1.Socket套接字编程 1.1.什么是socket套接字编程 Socket套接字编程 是一种基于网络层和传输层网络通信方式&#xff0c;它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件&#xff0c;它提供了不同主机间的进程间通信端点的抽象。一个Socket就是…

免费开源的后端API服务-supabase安装和使用-简直是前端学习者福音

文章目录 它是什么安装和部署关于安装关于部署1、注册用户2、创建组织3、创建项目 创建数据库表&#xff08;填充内容&#xff09;填充数据库表 使用postman联调API 它是什么 一个开源免费的后端框架&#xff0c;firebase的替代品。可以简单理解类似于headless cms&#xff0c…

浅谈定时器之泊松随机定时器

浅谈定时器之泊松随机定时器 “泊松随机定时器”(Poisson Random Timer)&#xff0c;它允许你基于泊松分布来随机化请求之间的延迟时间&#xff0c;这对于模拟具有随机到达率的事件特别有用&#xff0c;如用户访问网站或服务的请求。 泊松分布简介 泊松分布是一种统计与概率…

HarmonyOS开发探索:父子组件手势绑定问题处理

场景一&#xff1a;父子组件同时绑定手势的冲突处理 效果图 方案 在默认情况下&#xff0c;手势事件为非冒泡事件&#xff0c;当父子组件绑定相同的手势时&#xff0c;父子组件绑定的手势事件会发生竞争&#xff0c;最多只有一个组件的手势事件能够获得响应&#xff0c;默认子…

有哪些方法可以恢复ios15不小心删除的照片?

ios15怎么恢复删除的照片&#xff1f;在手机相册里意外删除了重要的照片&#xff1f;别担心&#xff01;本文将为你介绍如何在iOS 15系统中恢复已删除的照片。无需专业知识&#xff0c;只需要按照以下步骤操作&#xff0c;你就能轻松找回宝贵的回忆。 一、从iCloud云端恢复删除…

Transformer动画讲解 - 工作原理

Transformer模型在多模态数据处理中扮演着重要角色,其能够高效、准确地处理包含不同类型(如图像、文本、音频、视频等)的多模态数据。 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。 阶段一:…

网上下载的PDF文件为何不能复制文字?该怎么办呢?

不知道大家有没有到过这种情况&#xff1f;在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 首先&#xff0c;有可能PDF文件是扫描文件&#xff0c;是扫描文件的话&…

Gradle学习-4 创建二进制插件工程

二进制插件工程创建有两种方式&#xff1a; 创建独立的工程&#xff0c;调试的时候&#xff0c;需要手动发布成一个二进制插件jar包&#xff0c;给其他工程里面引用&#xff0c;进行功能测试。这种方式是比较麻烦的。创建buildSrc子工程&#xff0c;它是一个大工程中的子工程&…

云计算【第一阶段(19)】磁盘管理与文件系统 LVM与磁盘配额(二)

目录 一、LVM概述 1.1、LVM机制的基本概念 ​编辑 1.2、LVM的管理命令 1.3、lvm存储 两种机制 1.4、lvm应用实例 二、磁盘配额概述 2.1、设置磁盘配额 2.2.1、实现磁盘限额的条件 2.2.2、linux磁盘限额的特点 2.2.3、磁盘配额管理 一、LVM概述 1.1、LVM机制的基本概…