Mybatis多对一查询的配置及两种方法的使用示例对比以及Mybatis一对多查询两种方法使用示例及对比

一、Mybatis多对一查询的配置及两种方法的使用示例对比

    为了试验Mybatis多对一的查询,我们先在数据库中建两个表,一个城市表,一个市区表,一个城市有多个区是一个一对多的关系;多个区对应一个城市是一个多对一的关系。建表SQL及数据如下:

DROP TABLE IF EXISTS `citys`;
CREATE TABLE `citys` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `citys` VALUES ('1', '北京');
INSERT INTO `citys` VALUES ('2', '上海');

DROP TABLE IF EXISTS `areas`;
CREATE TABLE `areas` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cityid` int(20) unsigned NOT NULL,
  `area` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=42 DEFAULT CHARSET=utf8;
INSERT INTO `areas` VALUES ('1', '1', '海淀区');
INSERT INTO `areas` VALUES ('35', '1', '东城区');
INSERT INTO `areas` VALUES ('18', '1', '西城区');
INSERT INTO `areas` VALUES ('37', '1', '朝阳区');
INSERT INTO `areas` VALUES ('39', '2', '黄浦区');
INSERT INTO `areas` VALUES ('40', '2', '闵行区');
INSERT INTO `areas` VALUES ('41', '2', '徐汇区');

    接下来我们开始新建项目及module,相关的项目依赖及配置可参见文章:https://linge.blog.csdn.net/article/details/142846955icon-default.png?t=O83Ahttps://linge.blog.csdn.net/article/details/142846955 我们建立两个pojo类及两个mapper类,此时的Area pojo类中的city不再是一个字符串,而是关联city的pojo类。代码如下:

//city pojo类
package com.kermit.pojo;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class City {
    private int id;
    private String cityname;
}

//area pojo类
package com.kermit.pojo;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Area {

    private int id;
    private City city;
    private String areaname;
}


//AreaMapper类
package com.kermit.dao;

import com.kermit.pojo.Area;
import java.util.List;

public interface AreaMapper {

    //取得市区列表
    public List<Area> getArea();

}

    接下来我们要来编辑mybatis的mapper.xml配置文件,我们这里只是试验多对一,只需要填写AreaMapper.xml文件,这里我们使用了两种方式来实现多对一的查询,一是在association中用子查询去取得城市数据数据,另一种是是使用显示联表SQL查询后通过resultMap对应到city对象中。配置如下:

<?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">

<!--绑定DAO接口-->
<mapper namespace="com.kermit.dao.AreaMapper">

    <!--使用association用子查询去取得城市数据数据-->
    <select id="getArea" resultMap="AreaCity">
        select * from areas
    </select>
    <resultMap id="AreaCity" type="com.kermit.pojo.Area">
        <association property="city" javaType="com.kermit.pojo.City" select="getCity" column="cityid"/>
    </resultMap>

    <select id="getCity" resultType="com.kermit.pojo.City">
        select * from citys where id = #{cid};
    </select>

    <!--使用association:使用显示联表SQL查询后通过resultMap对应到city对象中-->
    <select id="getArea2" resultMap="AreaCity2">
        select areas.cityid,cityname,areas.id,areas.areaname from areas,citys where areas.cityid = citys.id
    </select>
    <resultMap id="AreaCity2" type="com.kermit.pojo.Area">
        <result property="id" column="id" />
        <result property="areaname" column="areaname" />
        <association property="city" javaType="com.kermit.pojo.City" >
            <result property="id" column="cityid" />
            <result property="cityname" column="cityname" />
        </association>
    </resultMap>

</mapper>

接下来我们去编辑测试类TestMybatis代码如下:

import com.kermit.dao.AreaMapper;
import com.kermit.pojo.Area;
import com.kermit.utils.MybatisConn;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class TestMybatis {

    private static SqlSession sqlSession;
    private static AreaMapper mapper;

    static{
        try {
            sqlSession = MybatisConn.getSqlsession();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mapper = sqlSession.getMapper(AreaMapper.class);
    }

    @Test
    public void areaToCity1() {

        //多对一的情况:取出区域的同时取得城市数据
        List<Area> areaList = mapper.getArea();
        for (Area area : areaList) {
            System.out.println(area);
        }

        sqlSession.close();
    }

    @Test
    public void areaToCity2(){
        //多对一的查询,通过sql查询再映射实现
        List<Area> areaList = mapper.getArea2();
        for (Area area : areaList) {
            System.out.println(area);
        }

        sqlSession.close();
    }
}

我们尝试运行两种查询,得到的结果分别如下:

#areaToCity1()结果如下:
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 1293241549.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4d154ccd]
==>  Preparing: select * from areas 
==> Parameters: 
<==    Columns: id, cityid, areaname
<==        Row: 1, 1, 海淀区
====>  Preparing: select * from citys where id = ?; 
====> Parameters: 1(Long)
<====    Columns: id, cityname
<====        Row: 1, 北京
<====      Total: 1
<==        Row: 35, 1, 东城区
<==        Row: 18, 1, 西城区
<==        Row: 37, 1, 朝阳区
<==        Row: 39, 2, 黄浦区
====>  Preparing: select * from citys where id = ?; 
====> Parameters: 2(Long)
<====    Columns: id, cityname
<====        Row: 2, 上海
<====      Total: 1
<==        Row: 40, 2, 闵行区
<==        Row: 41, 2, 徐汇区
<==      Total: 7
Area(id=1, city=City(id=1, cityname=北京), areaname=海淀区)
Area(id=35, city=City(id=1, cityname=北京), areaname=东城区)
Area(id=18, city=City(id=1, cityname=北京), areaname=西城区)
Area(id=37, city=City(id=1, cityname=北京), areaname=朝阳区)
Area(id=39, city=City(id=2, cityname=上海), areaname=黄浦区)
Area(id=40, city=City(id=2, cityname=上海), areaname=闵行区)
Area(id=41, city=City(id=2, cityname=上海), areaname=徐汇区)
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4d154ccd]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4d154ccd]
Returned connection 1293241549 to pool.
Process finished with exit code 0

#areaToCity2()结果如下:
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 1400856767.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@537f60bf]
==>  Preparing: select areas.cityid,cityname,areas.id,areas.areaname from areas,citys where areas.cityid = citys.id 
==> Parameters: 
<==    Columns: cityid, cityname, id, areaname
<==        Row: 1, 北京, 1, 海淀区
<==        Row: 1, 北京, 35, 东城区
<==        Row: 1, 北京, 18, 西城区
<==        Row: 1, 北京, 37, 朝阳区
<==        Row: 2, 上海, 39, 黄浦区
<==        Row: 2, 上海, 40, 闵行区
<==        Row: 2, 上海, 41, 徐汇区
<==      Total: 7
Area(id=1, city=City(id=1, cityname=北京), areaname=海淀区)
Area(id=35, city=City(id=1, cityname=北京), areaname=东城区)
Area(id=18, city=City(id=1, cityname=北京), areaname=西城区)
Area(id=37, city=City(id=1, cityname=北京), areaname=朝阳区)
Area(id=39, city=City(id=2, cityname=上海), areaname=黄浦区)
Area(id=40, city=City(id=2, cityname=上海), areaname=闵行区)
Area(id=41, city=City(id=2, cityname=上海), areaname=徐汇区)
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@537f60bf]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@537f60bf]
Returned connection 1400856767 to pool.
Process finished with exit code 0

    可以看到两种方式均能实现我们要的结果,但也有所不同。通过日志记录我们可以发现第一种方式areaToCity1()执行后,实际执行了3次SQL查询。而第二种方式areaToCity2()只进行了一次SQL查询操作,从性能来讲肯定是第二种更优越。

二、Mybatis一对多查询两种方法使用示例及对比

    演示所需要的数据库表及mybatis相关配置等见上篇文章及其关联的文章。此时我们已经有了城市与区域的一对多的关系,我们查询城市时,每个城市应该把它对应的多个区域数据取出来,这里我们要把pojo类进行一下修改,我们把Area类的city属性变成一个简单的cityid,而把City类的area变成一个List集合,每个值都是城市下面的一个区,即一对多的数据。代码如下:

//City的pojo类如下
package com.kermit.pojo;

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

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class City {
    private int id;
    private String cityname;
    private List<Area> areaList;
}

//Area的pojo类如下
package com.kermit.pojo;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Area {

    private int id;
    private int cityid;
    private String areaname;
}

//CityMapper接口类如下:
package com.kermit.dao;

import com.kermit.pojo.City;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface CityMapper {

    public List<City> getCity1();

    public List<City> getCity2();
}

    接下来我们来编写CityMapper.xml配置文件,我们仍然是通过两种方式来实现,一个是通过子查询嵌套的方式,一个是通过联表查询后将字段映射到数据中,这里和多对一查询有个大的不一样的关键词即collection和association。在多对一查询时,每个结果只需要关联后面的这个“一”,是使用association;而在一对多查询时,前面的结果需要将后面的多数据放至一个集合中。即collection。当然我为了一次到位,实际我这篇文章和上一遍多对一查询都有多对多的关系。CityMapper.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">

<!--绑定DAO接口-->
<mapper namespace="com.kermit.dao.CityMapper">

    <!--1通过子查询嵌套-->
    <select id="getCity1" resultMap="cityAndArea1">
        select * from citys;
    </select>
    <resultMap id="cityAndArea1" type="com.kermit.pojo.City">
        <collection property="areaList" column="id" select="getAreas" javaType="ArrayList" ofType="com.kermit.pojo.Area"/>
    </resultMap>

    <select id="getAreas" resultType="com.kermit.pojo.Area">
        select * from areas where cityid= #{id}
    </select>

    <!--2通过联表查询后将字段映射到数据中-->
    <select id="getCity2" resultMap="cityAndArea2" >
        select areas.cityid,cityname,areas.id,areas.areaname from areas,citys where areas.cityid = citys.id;
    </select>
    <resultMap id="cityAndArea2" type="com.kermit.pojo.City">
        <result property="id" column="cityid" />
        <result property="cityname" column="cityname" />
        <collection property="areaList" ofType="com.kermit.pojo.Area">
            <result property="id" column="id"/>
            <result property="areaname" column="areaname"/>
        </collection>
    </resultMap>

</mapper>

最后我们编写测试类,分别调用我们已经定义好的两个方法,测试类代码如下:

import com.kermit.dao.AreaMapper;
import com.kermit.dao.CityMapper;
import com.kermit.pojo.Area;
import com.kermit.pojo.City;
import com.kermit.utils.MybatisConn;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class TestMybatis {

    private static SqlSession sqlSession;
    private static CityMapper mapper;

    static{
        try {
            sqlSession = MybatisConn.getSqlsession();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mapper = sqlSession.getMapper(CityMapper.class);
    }

    @Test
    public void getCityIncludeArea1(){
        List<City> cityList = mapper.getCity1();
        for (City city : cityList) {
            System.out.println(city);
        }

        sqlSession.close();
    }

    @Test
    public void getCityIncludeArea2(){
        List<City> cityList = mapper.getCity2();
        for (City city : cityList) {
            System.out.println(city);
        }

        sqlSession.close();
    }
}

运行结果如下:

//getCityIncludeArea1()方法运行结果如下
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 252277567.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@f09733f]
==>  Preparing: select * from citys; 
==> Parameters: 
<==    Columns: id, cityname
<==        Row: 1, 北京
====>  Preparing: select * from areas where cityid= ? 
====> Parameters: 1(Long)
<====    Columns: id, cityid, areaname
<====        Row: 1, 1, 海淀区
<====        Row: 35, 1, 东城区
<====        Row: 18, 1, 西城区
<====        Row: 37, 1, 朝阳区
<====      Total: 4
<==        Row: 2, 上海
====>  Preparing: select * from areas where cityid= ? 
====> Parameters: 2(Long)
<====    Columns: id, cityid, areaname
<====        Row: 39, 2, 黄浦区
<====        Row: 40, 2, 闵行区
<====        Row: 41, 2, 徐汇区
<====      Total: 3
<==      Total: 2
City(id=0, cityname=北京, areaList=[Area(id=1, cityid=1, areaname=海淀区), Area(id=35, cityid=1, areaname=东城区), Area(id=18, cityid=1, areaname=西城区), Area(id=37, cityid=1, areaname=朝阳区)])
City(id=0, cityname=上海, areaList=[Area(id=39, cityid=2, areaname=黄浦区), Area(id=40, cityid=2, areaname=闵行区), Area(id=41, cityid=2, areaname=徐汇区)])
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@f09733f]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@f09733f]
Returned connection 252277567 to pool.
Process finished with exit code 0

//getCityIncludeArea2()方法运行结果如下:
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 580673921.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@229c6181]
==>  Preparing: select areas.cityid,cityname,areas.id,areas.areaname from areas,citys where areas.cityid = citys.id; 
==> Parameters: 
<==    Columns: cityid, cityname, id, areaname
<==        Row: 1, 北京, 1, 海淀区
<==        Row: 1, 北京, 35, 东城区
<==        Row: 1, 北京, 18, 西城区
<==        Row: 1, 北京, 37, 朝阳区
<==        Row: 2, 上海, 39, 黄浦区
<==        Row: 2, 上海, 40, 闵行区
<==        Row: 2, 上海, 41, 徐汇区
<==      Total: 7
City(id=1, cityname=北京, areaList=[Area(id=1, cityid=0, areaname=海淀区), Area(id=35, cityid=0, areaname=东城区), Area(id=18, cityid=0, areaname=西城区), Area(id=37, cityid=0, areaname=朝阳区)])
City(id=2, cityname=上海, areaList=[Area(id=39, cityid=0, areaname=黄浦区), Area(id=40, cityid=0, areaname=闵行区), Area(id=41, cityid=0, areaname=徐汇区)])
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@229c6181]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@229c6181]
Returned connection 580673921 to pool.
Process finished with exit code 0

    同多对一的查询一样,mapper.xml配置中使用子查询嵌套的方法在SQL执行的时候会进行多次查询,最终查询次数和取得的行数成正比增加。而使用联表查询后将数据映射到属性中只执行一次SQL查询,所以一对多、多对一的查询推荐使用联表查询后映射数据的方式处理。还有一个需要注意的地方是xml配置文件中的 javaType和ofType配置,这两项比较重要,且相对难以把握,要多加练习了解掌握。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring源码拓展点3之addBeanPostProcesser

概述 在refresh方法中的prepareBeanFactory方法中&#xff0c;有一个拓展点&#xff1a;addBeanPostProcessor。即通过注入Aware对象从而将容器中的某些值设置到某个bean中。 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));aware接口调用 …

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装&#xff1a;便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后&#xff0c;选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…

[DB] NSM

Database Workloads&#xff08;数据库工作负载&#xff09; 数据库工作负载指的是数据库在执行不同类型任务时所需的资源和计算方式&#xff0c;主要包括以下几种类型&#xff1a; 1. On-Line Transaction Processing (OLTP) 中文&#xff1a;联机事务处理解释&#xff1a;…

hive初体验

1.首先&#xff0c;确保启动了Metastore服务。 runjar就是metastore进程 2.进入hive客户端: 命令:hive 3.操作:没有指定数据库时默认在default 一:创建表:CREATE TABLE test(id INT, name STRING, gender STRING); 完成,show tables看一下 也可以通过hdfs文件系统查看,默认路径…

go多线程

1.仅加go 在一个golang编写的程序&#xff0c;主函数运行完毕后&#xff0c;程序就结束了 package mainimport ("fmt""time" )func main() {// 如果这样写go 要加在上面的函数&#xff0c;因为如果只单独加在下面的函数或者都加上&#xff0c;程序就会直接…

Leetcode 柱状图中最大的矩形

h 是右边界&#xff0c;连续多个高度递增的柱子&#xff0c;如果遇到下一个 h < 栈顶元素(是最大的元素&#xff0c;单调递增栈)&#xff0c;那么会不断出栈来更新计算最大面积。 并非是一次性计算出最大面积的&#xff0c;很重要的一点是while (!stack.isEmpty()这一部分的…

Vivado自定义IP修改顶层后Port and Interface不更新解决方案

问题描述 在整个项目工程中&#xff0c;对自定义IP进行一个比较大的改动&#xff0c;新增了不少端口(这里具体的就是bram的读写端口)&#xff0c;修改是在block design中右击IP编辑在IP编辑工程中进行的。 在修改完所有代码后&#xff08;顶层新增了需要新加的输入输出端口&…

【计算机网络 - 基础问题】每日 3 题(四十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

字节流写入文件

一、创建输出流对象表示的文件三种方式 方法一&#xff1a; FileOutputStream fos new FileOutputStream("fos.txt",true);//最简便方法二&#xff1a; FileOutputStream fos new FileOutputStream(new File("fos.txt"));方法三&#xff1b; File f ne…

HCIP-HarmonyOS Application Developer 习题(十四)

&#xff08;多选&#xff09;1、HarmonyOs为应用提供丰富的Al(Artificial Intelligence)能力&#xff0c;支持开箱即用。下列哪些是它拥有的AI能力? A、通用文字识别 B、词性标注 C、实体识别 D、语音播报 答案&#xff1a;ABCD 分析&#xff1a; AI能力简介二维码生成根据开…

软考高级系统分析师,快背,都是精华知识点!

19、需求变更控制 需求变更控制过程&#xff1a; &#xff08;1&#xff09;变更申请。应记录变更的提出人、日期、申请变更的内容等信息。 &#xff08;2&#xff09;变更评估。对变更的影响范围、严重程度、经济和技术可行性进行系统分析。 &#xff08;3&#xff09;变更…

qt/c++中成员函数返回成员变量并且可以赋值

#创作灵感 最近在做仪表项目&#xff0c;由于客户提供的仪表故障指示灯只有10个固定位置&#xff0c;而故障指示灯却有80多个。为了解决这个问题&#xff0c;进过我的设计&#xff0c;项目中需要返回类的成员变量。并且还可以赋值给它。于是就产生了下面的代码。 class Foo { …

基于Multisim三极管B放大系数放大倍数测量电路设计(含仿真和报告)

【全套资料.zip】三极管B放大系数放大倍数测量电路电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.用三个数码管显示B的大小&#xff0c;分别显示个位、十位和百位。 2.显示范围…

FineReport 分页

按组分页 按组分页就是让数据按组来进行分页显示&#xff0c;每个组的数据占据一页。 例如报表原本是按照纸张大小进行分页的&#xff0c;现在希望能够按照货主地区进行分页&#xff0c;一个地区的数据显示在同一个页面当中。 在每组数据前设置「行前分页」或者在每组数据后…

健身房管理系统设计与实现(源码+定制+讲解)健身房预约系统开发、健身房会员管理平台、健身房设备管理系统、健身房系统功能优化

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

如实例布局图,如何做到两栏四列,margin间距超出了两段不对齐如何处理

使用 CSS Grid 实现两栏四列布局&#xff1a; <!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <sty…

【原创】java+ssm+mysql在线文件管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

vue中实现css布局

在vue中通过flex布局实现css的s型结构 通过数组截取循环布局&#xff0c;奇数行从左到右&#xff0c;在偶数行从右到左实现s型结构 主要内容分为三部分 中间内容部分 数据格式 items: [{nodeList: [1, 2, 3, 4, 5, 6]},{nodeList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, {nod…

数据结构与算法:贪心与相关力扣题455.分发饼干、376.摆动序列、53.最大子数组和(贪心+动态规划dp)、122.买卖股票的最佳时机Ⅱ

贪心算法 贪心策略在实现时&#xff0c;经常使用到的技巧&#xff1a; 根据某标准建立一个比较器来排序 根据某标准建立一个比较器来组成堆 举例题目&#xff1a;会议室安排 一些项目要占用一个会议室宣讲&#xff0c;会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始…

Go 1.19.4 命令调用、日志、包管理、反射-Day 17

1. 系统命令调用 所谓的命令调用&#xff0c;就是通过os&#xff0c;找到系统中编译好的可执行文件&#xff0c;然后加载到内存中&#xff0c;变成进程。 1.1 exec.LookPath&#xff08;寻找命令&#xff09; 作用&#xff1a; exec.LookPath 函数用于在系统的环境变量中搜索可…