ssm实战项目──哈米音乐(二)

news2024/11/25 7:33:08

目录

1、流派搜索与分页

2、流派的添加

3、流派的修改

4、流派的删除


接上篇:ssm实战项目──哈米音乐(一),我们完成了项目的整体搭建,接下来进行后台模块的开发。

首先是流派模块:

在该模块中采用分页查询,将数据库中流派的信息通过分页进行查询,期望查询结果如下:

1、流派搜索与分页

想要达成该效果需要在后端查询到的数据呈现到前端的jsp页面上。

首先在后端中要把查询结果包装到一起,因此在ham-core子模块中的util文件夹下创建Page类来存放查询到的数据,该类包括每页展示数量(已知),当前的页号,总页数,开始页数,数据集合结果和总记录数。使用该类的一个对象将其返回到前端界面即可。

该类信息如下:

/**
 * 封装前端需要的承载数据以及分页相关的一个实体
 * 自定义页的类
 */
public class Page<T> {

    //每页展示数量(已知)
    private Integer pageSize=5;

    //页码(已知)
    private Integer pageNo=1;

    //总页数(计算)  总记录数/每页展示数量
    private Integer totalPage;

    //开始行号(计算)(pageNO-1) *pagesize
    private Integer startNum=0;

    //数据集合结果
    private List<T> list;

    //总记录数 count(*)
    private Integer totalCount=0;

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageNo() {
        return pageNo;
    }

    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }

    public Integer getTotalPage() {
        totalPage=totalCount/pageSize;
        if(totalCount==0 || totalCount%pageSize!=0){
            totalPage++;
        }
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public Integer getStartNum() {
        return startNum;
    }

    public void setStartNum(Integer startNum) {
        this.startNum = startNum;
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public Integer getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }

}

将后端查询到的实体返回前端界面,在jsp界面中采用foreach进行接收,代码如下:

<tbody>
<c:forEach items="${page.list}" var="mtype" varStatus="status">
   <tr>
       <td class="hidden-xs-portrait">${mtype.tid}</td>
       <td class="hidden-xs-portrait">${mtype.tname}</td>
       <td class="hidden-xs"> ${mtype.tdesc} </td>
       <td>
           <button  class="btn btn-sm btn-primary" type="button" modify tid="${mtype.tid}" > 修改</button>
           <button data-toggle="button" class="btn btn-sm btn-warning" tid="${mtype.tid}"> 删除</button>
       </td>
   </tr>
</c:forEach>
</tbody>
  <jsp:include page="pagination.jsp"></jsp:include>

为节省代码,将分页的页码单独写一个界面pagination.jsp,并在其他界面中引用:

<div class="clearfix text-right">
    <%--隐藏域--%>
    <input type="hidden" id="pageNo" name="pageNo" value="${mq.pageNo}">
    <input type="hidden" id="totalPage" value="${page.totalPage}">
    <ul class="pagination no-margin">
        <li id="prev" class="disabled"><a href="#">Prev</a></li>
        <c:forEach begin="1" end="${page.totalPage}" var="myPageNo">
            <li <c:if test="${myPageNo == mq.pageNo}">class="active"</c:if>><a
                    pageNoButton href="#">${myPageNo}</a></li>
        </c:forEach>
        <li id="next"><a href="#">Next</a></li>
    </ul>
</div>

在界面中使用js来控制分页:

/**
             * 用于控制上一页和下一页的可用的切换
             * @type {jQuery}
             */
            var pageNo = $("#pageNo").val();
            var totalPage = $("#totalPage").val();

            pageNo = parseInt(pageNo);
            totalPage = parseInt(totalPage);
            if (pageNo == 1 && pageNo == totalPage) {
                $("#prev").addClass("disabled");
                $("#next").addClass("disabled");
            }

            if (pageNo == 1 && pageNo < totalPage) {
                $("#prev").addClass("disabled");
                $("#next").removeClass("disabled");
            }

            if (pageNo > 1 && pageNo < totalPage) {
                $("#prev").removeClass("disabled");
                $("#next").removeClass("disabled");
            }

            if (pageNo > 1 && pageNo == totalPage) {
                $("#prev").removeClass("disabled");
                $("#next").addClass("disabled");
            }


            $("#prev").click(function () {
                $("#pageNo").val(--pageNo);
                $("#txForm").submit();
            })

            $("#next").click(function () {
                $("#pageNo").val(++pageNo);
                $("#txForm").submit();
            })

            $("a[pageNoButton]").click(function () {
                var pageNo = $(this).html();
                $("#pageNo").val(pageNo);
                $("#txForm").submit();
            })

想要分页查询到流派信息还需要一个流派查询的类,封装前端传来的参数传给后端,例如当前是第几页,要实现搜素功能时要传递的名字

在ham-core的query文件下创建该类如下:

/**
 * 只作为表现层接收前端参数封装使用
 */
public class MtypeQuery extends Mtype{
    //页码
    private Integer pageNo;
    //每页展示数量
    private Integer pageSize=5;
    //开始行号
    private Integer startNum;
    public Integer getPageNo() {
        return pageNo;
    }
    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }
    public Integer getPageSize() {
        return pageSize;
    }
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
    public Integer getStartNum() {
        return startNum;
    }
    public void setStartNum(Integer startNum) {
        this.startNum = startNum;
    }
}

MtypeQuery专门用来处理分页,接受前端传来的参数.

继承了Mtype-->可以封装上tname

要知道前端用户想看第几页:pagNo

开始行号是计算出来的

想要得到分页查询的数据,需要在数据库中查询到具体信息和数量,最后通过在实现类中编写具体方法逻辑将数据包装进一个Page对象中返回

在MtypeMapper.xml下需要编写sql语句如下:

查询出所有数据和数量并定义查询结果resultMap:

 <resultMap id="BaseResultMap" type="com.qcby.model.Mtype">
    <id column="TID" jdbcType="INTEGER" property="tid" />
    <result column="TNAME" jdbcType="VARCHAR" property="tname" />
    <result column="TDESC" jdbcType="VARCHAR" property="tdesc" />
  </resultMap>
 <select id="selectPage" parameterType="com.qcby.query.MtypeQuery" resultMap="BaseResultMap">
    SELECT * FROM mtype
    <where>
      <if test=" tname != null and tname != ''">
        tname like '%${tname}%'
      </if>
    </where>
    LIMIT #{startNum},#{pageSize}
  </select>
  
  <select id="selectCount" parameterType="com.qcby.query.MtypeQuery" resultType="int">
    SELECT count(*) FROM mtype
    <where>
      <if test=" tname != null and tname != ''"> tname like '%${tname}%' </if>
    </where>
  </select>
  <select id="selectAll" resultType="com.qcby.model.Mtype">
    SELECT * from mtype
  </select>

写好了sql语句下面就需要定义接口和方法来调用sql语句

由于每个模块中都要用到分页查询,因此编写接口和方法时写在公共方法即可;

在BaseDao接口中定义持久层接口


/**
 * 持久层公共接口
 * @param <T>
 */
public interface BaseDao<Q,T> {

    //省略其他方法...
    
    List<T> selectPage(Q mq);      
    Integer selectCount(Q mq);
}

在BaseService中提供相应的分页查询接口:


/**
 * 业务层公共接口
 * @param <T> 泛型
 */
public interface BaseService<Q,T> {
    
    //分页查询接口
    Page<T> selectByPage(Q mq);
}

实现类:在实现类中编写分页查询的具体逻辑

先通过反射获取pageNo和pageSize,并根据此计算出startNum

之后通过持久层接口调用sql语句查询数据库,最后将查询到的结果放入Page对象中

public class BaseServiceImpl<Q,T> implements BaseService<Q,T> {


    protected BaseDao<Q,T> baseDao;

    

    /**
     * 多有业务模块的分页业务逻辑处理
     * 简单理解:page对象
     * 保证page对象各个属性的值按要求返回
     * @param mq
     * @return
     */

    @Override
    public Page<T> selectByPage(Q mq){

        //1.先准备一个要返回的承载数据的页对象
        Page<T> page = new Page<T>();        
        Class<?> cq = mq.getClass();
        try {
            //反射调用getPageNo方法拿到pageNo
            //获得getPageNo对象
            Method getPageNo = cq.getDeclaredMethod("getPageNo", null);
            //反射调用getPageNo方法
            Integer pageNo = (Integer) getPageNo.invoke(mq,null) ;
            //反射调用getPageNo方法拿到pageSize
            Method getPageSize = cq.getDeclaredMethod("getPageSize", null);
            Integer pageSize = (Integer) getPageSize.invoke(mq,null) ;
            //给返回的page设置值
            page.setPageNo(pageNo);
            page.setPageSize(pageSize);
            //设置pageNO  前端给的
            //设置pageSize  前端给的
            //设置startNum  计算
            Method setStartNum = cq.getDeclaredMethod("setStartNum",Integer.class);
            setStartNum.invoke(mq,(pageNo-1)*pageSize);
            page.setStartNum((pageNo-1)*pageSize);
            //查询数据库 调用Mapper baseDao查询满足条件的数据
            List<T> list = baseDao.selectPage(mq);
            page.setList(list);
            //StartNum tname  把结果给page的list设置上
            //查询数据库 满足条件的数据总量 page的totalCount设置上值
            Integer count=baseDao.selectCount(mq);
            page.setTotalCount(count);
        }catch (Exception e){
            e.printStackTrace();
        }
        return page;
    }
}

至此分页查询的接口和方法编写完毕,接下来就可以在后台模块ham-console的控制类中调用该方法查询到想要的数据并将其返回。

编写MtypeController类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Controller将该类交spring管理设为控制类
 * @RequestMapping("/mtype") 设置路径来让前端调用
 */
@RequestMapping("/mtype")
@Controller
public class MtypeController {

    /**
     * 注入流派业务层的对象
     * 调用业务层的分页条件查询逻辑
     */
    @Autowired
    private MtypeService mtypeService;

    /**
     * 查询流派信息
     * 分页   条件   查询
     * 流派名称 查看的页码 每页展示数量
     * @return
     */
    @RequestMapping("/list")
    public String list(MtypeQuery mq, Model model){

        //1.程序严谨性:判断前端传递的参数
        //有没有传递想看第几页,没有设计为访问第一页
        if(mq.getPageNo()==null){
            mq.setPageNo(1);
        }
        //2.调用业务层进行分页条件查询
        Page<Mtype> page = mtypeService.selectByPage(mq);
        //3.返回前端想要的数据  返回一个页对象
        model.addAttribute("page",page);
        //要进行搜索参数的回显功能
        model.addAttribute("mq",mq);
        return "mtype";
    }
}

2、流派的添加

使用layui的弹出层,点击“添加流派”按钮,弹出层弹出,如图:

  • 添加流派按钮:
<button id="addSong" class="btn btn-primary" data-target="#myModal2"
        type="button">添加流派
</button>
  • 弹出层表单元素:
<div id="mtypePop" style="margin-right: 50px;margin-top: 50px; display: none">
    <form id="addMtypeForm" class="layui-form" method="post" action="/mtype/addMtype" lay-filter="example">
        <div class="layui-form-item">
            <label class="layui-form-label">流派</label>
            <div class="layui-input-block">
                <input type="text" name="tname" style="color: black;" lay-verify="title" autocomplete="off"
                       placeholder="请输入流派名" class="layui-input">
            </div>
        </div>

        <div class="layui-form-item layui-form-text">
            <label class="layui-form-label">描述</label>
            <div class="layui-input-block">
                <textarea style="color: black;" placeholder="请输入流派描述" class="layui-textarea" name="tdesc"></textarea>
            </div>
        </div>

        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn layui-btn-normal layui-btn-radius" lay-submit="" lay-filter="demo1">添加流派
                </button>
            </div>
        </div>
    </form>
</div>
  • JS弹出界面:

点击addSong按钮,创建弹出层,内容是id为“mtypePop”的元素

var pop;
$("#addSong").click(function () {
    pop = layer.open({
        type: 1,
        area: [600, 350],
        content: $('#mtypePop')
    });
})
  • 表单提交

添加弹出层也是表单,在JS中编写点击确认后表单提交,调用后端方法

layui.use('form', function () {
    var form = layui.form;

    //监听提交
    form.on('submit(demo1)', function (data) {
        //layer.msg(JSON.stringify(data.field));
        $.ajax({
            url: "/mtype/addMtype",
            type: "post",
            data: data.field,
            dataType: "text",
            success: function (text) {
                if (text == "success") {
                    layer.msg("添加成功");
                    layer.close(pop);
                }
            }
        })
        //阻止页面跳转  防止同步提交  使用ajax异步提交表单
        return false;
    });
  • 后台controller:
@RequestMapping("/addMtype")
@ResponseBody
public String addMtype(Mtype mtype){
    mtypeService.insert(mtype);
    return  "success";
}

3、流派的修改

点击“修改”按钮,弹出弹出层,显示原有数据,如图:

  • 修改按钮:
<button  class="btn btn-sm btn-primary" type="button" modify tid="${mtype.tid}" > 修改</button>
  • 弹出层div元素:
<div id="mtypePop1" style="margin-right: 50px;margin-top: 50px; display: none">
    <form id="updateMtypeForm" class="layui-form" method="post" action="/mtype/updateMtype" lay-filter="example">
        <input type="hidden" name="tid" id="tid">
        <div class="layui-form-item">
            <label class="layui-form-label">输入框</label>
            <div class="layui-input-block">
                <input id="ptname" type="text" name="tname" style="color: black;" lay-verify="title" autocomplete="off"
                       placeholder="请输入流派名" class="layui-input">
            </div>
        </div>

        <div class="layui-form-item layui-form-text">
            <label class="layui-form-label">文本域</label>
            <div class="layui-input-block">
                <textarea id="ptdesc" style="color: black;" placeholder="请输入流派描述" class="layui-textarea"
                          name="tdesc"></textarea>
            </div>
        </div>

        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn layui-btn-normal layui-btn-radius" lay-submit="" lay-filter="demo2">修改流派
                </button>
            </div>
        </div>
    </form>
</div>
  • 弹出层的数据回显:

点击带有“modify”类的元素的时候,执行函数,获取所点击的元素的tid,发送ajax请求,将tid作为请求参数发送到服务器,请求json类型的数据,回调函数在请求成功后执行,使用返回的 JSON 数据来填充表单字段。ID 为 mtypePop1 的 HTML 元素作为弹出层的内容。

var pop1;
$("[modify]").click(function () {
    var tid = $(this).attr("tid");

    $.ajax({
        url: "/mtype/getMtype",
        type: "post",
        data: {
            tid:tid
        },
        dataType: "json",
        success: function (jsonObj) {
            $("#tid").val(jsonObj.tid);
            $("#ptname").val(jsonObj.tname);
            $("#ptdesc").val(jsonObj.tdesc);
        }
    })

    pop1 = layer.open({
        type: 1,
        area: [600, 350],
        content: $('#mtypePop1')
    });
})
  • 点击修改按钮后完成修改
layui.use('form', function () {
    var form = layui.form;

    //监听提交
    form.on('submit(demo2)', function (data) {
        //layer.msg(JSON.stringify(data.field));
        $.ajax({
            url: "/mtype/updateMtype",
            type: "post",
            data: data.field,
            dataType: "text",
            success: function (text) {
                if (text == "success") {
                    layer.msg("修改成功");
                    layer.close(pop1);
                    $("#txForm").submit();
                }
            }
        })
        return false;
    });
})
  • 在MtypeController中编写回显方法和修改方法
/**
 * 流派修改  回显数据
 */
@ResponseBody
@PostMapping("/getMtype")
public Mtype getMtype(int tid){
    Mtype mtype=mtypeService.selectByPrimaryKey(tid);
    return mtype;
}

@ResponseBody
@PostMapping("/updateMtype")
public String updateMtype(Mtype mt){
    mtypeService.updateByPrimaryKeySelective(mt);
    return "success";

4、流派的删除

点击删除按钮,弹出提示框。

  • 删除按钮
<button data-toggle="button" class="btn btn-sm btn-warning" tid="${mtype.tid}"> 删除</button>
  • JS
$(".btn-warning").click(function () {
    //获取tid
    var tid = $(this).attr("tid");
    layer.confirm('是否确认删除?', {icon: 3, title:'提示'}, function(index){
        $.ajax({
            url: "/mtype/delMtype",
            type: "post",
            data: {
                tid:tid
            },
            dataType: "text",
            success: function (text) {
                if (text == "success") {
                    layer.msg("删除成功");
                    layer.close(index);
                    $("#txForm").submit();
                }
            }
        })
    });
})
  • controller
@RequestMapping("/delMtype")
@ResponseBody
public String delMtype(int tid){
    mtypeService.deleteByPrimaryKey(tid);
    return "success";
}

至此,后台流派模块编写完毕,下一篇进行专辑模块的开发。

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

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

相关文章

C++使用minio-cpp(minio官方C++ SDK)与minio服务器交互简介

目录 minio简介minio-cpp简介minio-cpp使用 minio简介 minio是一个开源的高性能对象存储解决方案&#xff0c;完全兼容Amazon S3 API&#xff0c;支持分布式存储&#xff0c;适用于大规模数据架构&#xff0c;容易集成&#xff0c;而且可以方便的部署在集群中。 如果你已经部…

细说敏捷:敏捷四会之standup meeting

上一篇文章中&#xff0c;我们讨论了 敏捷四会 中 冲刺计划会 的实施要点&#xff0c;本篇我们继续分享敏捷四会中实施最频繁&#xff0c;团队最容易实施但往往也最容易走形的第二个会议&#xff1a;每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动&#xff0…

二分法(折半法)查找【有动图】

二分法&#xff0c;也叫做折半法&#xff0c;就是一种通过有序表的中间元素与目标元素进行对比&#xff0c;根据大小关系排除一半元素&#xff0c;然后继续在剩余的一半中进行查找&#xff0c;重复这个过程直至找到目标值或者确定目标值不存在。 我们从结论往回推&#xff0c;…

FreeRTOS——低功耗管理

目录 一、概念及其应用 1.1应用 1.2STM32电源管理系统 2.3STM32低功耗模式 2.3.1睡眠模式 2.3.2停止模式 2.3.3待机模式 三、Tickless低功耗模式 3.1低功耗模式配置 3.2低功耗模式应用 3.3低功耗电路分析 3.4低功耗处理相关接口 四、实现原理 4.1任务等待删除的检查…

【STM32】MPU6050初始化常用寄存器说明及示例代码

一、MPU6050常用配置寄存器 1、电源管理寄存器1&#xff08; PWR_MGMT_1 &#xff09; 此寄存器允许用户配置电源模式和时钟源。 DEVICE_RESET &#xff1a;用于控制复位的比特位。设置为1时复位 MPU6050&#xff0c;内部寄存器恢复为默认值&#xff0c;复位结束…

2024年亚太地区数学建模大赛A题-复杂场景下水下图像增强技术的研究

复杂场景下水下图像增强技术的研究 对于海洋勘探来说&#xff0c;清晰、高质量的水下图像是深海地形测量和海底资源调查的关键。然而&#xff0c;在复杂的水下环境中&#xff0c;由于光在水中传播过程中的吸收、散射等现象&#xff0c;导致图像质量下降&#xff0c;导致模糊、…

自动驾驶3D目标检测综述(三)

前两篇综述阅读理解放在这啦&#xff0c;有需要自行前往观看&#xff1a; 第一篇&#xff1a;自动驾驶3D目标检测综述&#xff08;一&#xff09;_3d 目标检测-CSDN博客 第二篇&#xff1a;自动驾驶3D目标检测综述&#xff08;二&#xff09;_子流行稀疏卷积 gpu实现-CSDN博客…

【Linux | 计网】TCP协议详解:从定义到连接管理机制

目录 1.TCP协议的定义&#xff1a; 2.TCP 协议段格式 3.TCP两种通信方式 4.确认应答(ACK)机制 解决“后发先至”问题 5.超时重传机制 那么, 超时的时间如何确定? 6.连接管理机制&#xff1a; 6.1.三次握手&#xff1a; 为什么需要3次握手&#xff0c;一次两次不行吗…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

2024年12月Gesp七级备考知识点拾遗第一期(图的定义及遍历)

目录 总序言 知识点拾遗​编辑 度数 环 二叉树 图的遍历 深度优先 广度优先 连通与强连通 有什么不同 构成分别至少需要几条边&#xff08;易错题&#xff09;&#xff1f; 无向连通图 有向强连通图 完全图 什么是完全图 无向完全图最少边数 有向完全图最少边…

Doris 的Explain 和 Profile

什么是 explain&#xff1f; 执行计划是对一条 SQL 具体的执行方式和执行过程的描述。例如&#xff0c;对于一个涉及两表连接的 SQL&#xff0c;执行计划会展示这两张表的访问方式信息、连接方式信息&#xff0c;以及各个操作之间的顺序。 在 Doris 系统中提供了 Explain 工具…

QT QVBoxLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例&#xff0c;包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizonta…

对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris()函数查找学习举例

对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris()函数查找学习举例 对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris函数查找学习举例 对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris()函数查找学习举例一、鸢尾花数据位置二、鸢尾花…

动态反馈控制器(DFC)和 服务率控制器(SRC);服务率和到达率简单理解

目录 服务率和到达率简单理解 服务率 到达率 排队论中的应用 论文解析:队列等待成本动态感知控制模型 动态反馈和队列等待成本意识: 服务速率调整算法: 动态反馈控制器(DFC)和 服务率控制器(SRC) SRC公式4的原理 算力资源分配系统中的调整消耗 举例说明 服务…

微信小程序上传微信官方审核流程(1)

1&#xff0c;打开微信开发者工具 2&#xff0c;微信开发者工具右上角有一个上传按钮&#xff0c;点击上传按钮 3&#xff0c;点击完上传按钮会弹出一个上传成功的提示&#xff0c;点击提示框中的确定按钮 4&#xff0c;点击完确定按钮后会显示填写版本好和项目备注 5&#x…

优先算法 —— 双指针系列 - 复写零

目录 1. 复写零 2. 算法原理 一般情况下 改为就地操作&#xff1a;从左到右&#xff08;错误&#xff09; 从右到左 总结一下解决方法&#xff1a; 如何找到最后一个复写的数 特殊情况 完整步骤&#xff1a; 3. 代码 1. 复写零 题目链接&#xff1a;1089. 复写零 - 力…

Spring源码学习(一):Spring初始化入口

写在前面 ​   作为一个刚步入职场的小白&#xff0c;对Spring&#xff08;SpringBoot&#xff09;的了解只停留在会用&#xff0c;并未对其内部的原理有过学习。在公司导师的指导下&#xff0c;开始进一步学习Spring的源码&#xff0c;毕竟Spring源码是Spring全家桶的基础&…

IntelliJ+SpringBoot项目实战(十三)--在SpringBoot中整合Mybatis-plus

mybatis-plus是基于mybatis基础上的增强的持久层框架&#xff0c;也是目前Java项目开发的主流框架。本文介绍在SpringBoot中集成mybtais-plus的方法以及使用mybatis-plus开发增删改查模块。 一、引入mybatis-plus 在openjweb-core工程中引入mybatis-plus依赖: <dependency&…

Vector底层实现详解

一、vector的介绍 vector是表示可变大小数组的序列容器 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且…

【2024 Optimal Control 16-745】【Lecture4】equality-constraints.ipynb功能分析

代码实现了一个二次优化问题的可视化解法&#xff0c;包括目标函数、约束以及优化路径。提供了两种优化方法&#xff1a;牛顿法和高斯-牛顿法&#xff0c;用于对比效果。利用了自动微分工具 ForwardDiff 来计算约束曲率。 环境初始化并导入依赖库 # 激活当前文件夹下的项目环境…