SSM框架实战-搭建自己的个人博客4-文章管理与展示

2023-05-16

实现功能

主要实现上图所示的功能,从数据库中查询到所有文章数据,并进行显示如标题,栏目等信息,可以通过分类查询文章,通过标签查询文章,也可以通过搜索进行模糊查询,或者三者进行联合查询,通过操作按钮改变文章的状态。通过新增按钮调转至新增页面,如果没有登录会先跳转至登录界面。 

ArticleController

    //后台的主页面
    @RequestMapping("/back")
    public String back(Model model) {

        //类别列表
        List <Category> categories = categoryService.selectAllCategory();

        //标签列表
        List <Tag> tags = tagService.selectAllTag();

        model.addAttribute("categoryList", categories);
        model.addAttribute("tagList",tags);
        return "article/article_list";
    }

    //后台的分页页面
    @RequestMapping("/load")
    public String load(Model model, Pager<Article> pager, String param) throws UnsupportedEncodingException {
        System.out.println("参数:param:"+param+",pager:"+pager.toString());

        Article article = JsonUtil.fromJson(param, Article.class);
        if (article != null && article.getTitle() != null && "".equals(article.getTitle())) {
            //标题参数不为空时,需要进行解码处理
            String title = URLDecoder.decode(article.getTitle(), "utf-8");
            article.setTitle(title);
        }

        //分页相关的
        //需要获取当前条件下数据的个数
        if (pager.getPage() == 1) {
//        当前条件下第一次查询
        Integer articleCount = articleService.getArticleCount(article, pager);
        System.out.println("符合条件:"+articleCount);
        pager.setTotalCount(articleCount);
        }

        List <Article> articles = articleService.getArticlesByPage(article, pager);

        model.addAttribute("articleList",articles);


        return "article/article_pager";
    }


    @RequestMapping("/updateStatue")
    @ResponseBody
    public Result updateStatue(@Param("id") Integer id, @Param("status") Integer status) {
        Article article = new Article();
        article.setId(id);
        article.setStatus(status);
        if (articleService.updataStatus(article)) {
            return new Result("success","成功");
        } else {
            return new Result("fail","修改失败");
        }

    }

Service层

    //获取符合条件的数据数量
    public Integer getArticleCount(Article article,Pager pager) {
        HashMap<String, Object> hashMap = new HashMap <>();
        hashMap.put("article", article);
        Integer integer = articleMapper.selectCountByArticle(hashMap);
        return integer;
    }

    //对符合条件的数据进行分页处理
    public List<Article> getArticlesByPage(Article article,Pager pager) {
        HashMap <String, Object> hashMap = new HashMap <>();
        hashMap.put("article", article);
        hashMap.put("start",pager.getStart());
        hashMap.put("limit", pager.getLimit());

        List <Article> articles = articleMapper.selectArticleByPager(hashMap);
        return articles;
    }


    //修改状态
    public boolean updataStatus(Article a) {
        int i = articleMapper.updateStatus(a);
        if (i> 0) {
            return true;
        } else {
            return false;
        }
    }

Paper工具类

该工具类主要用于处理分页功能,

package com.tulun.util;

import java.util.ArrayList;
import java.util.List;

/**
 * @功能:分页类
 * 
 * 分页信息主要包括几个:当前页   每页显示数  总页数  总数量  和分页返回的信息
 * 
 * @作者: gdz
 * @时间: 2019-6-18 下午5:14:29
 */
public class Pager<T> {
	
	/**
	 * 默认每页显示数
	 */
	public static final int PAGE_SIZE = 10;
	
	/**
	 * 默认页数
	 */
	public static final int PAGE_NUM = 1;
	
	/**
	 * 页数
	 */
	private int page;
	
	/**
	 * 每页显示数
	 */
	private int limit = PAGE_SIZE;
	
	/**
	 * 总页数
	 */
	private int totalPageNum;
	
	/**
	 * 记录总数
	 */
	private int totalCount;
	
	/**
	 * 分页信息
	 */
	private List<T> rows = new ArrayList<T>();
	
	/**
	 * 分页计算起始值
	 */
	private int start;
	
	/**
	 * 分页计算结束值  暂时没用
	 */
	private int endIndex;
	
	public void setPageNum(int pageNum) {
		if(pageNum <= 0){
			pageNum = PAGE_NUM;
		}
		if(pageNum > totalPageNum){
			pageNum = totalPageNum;
		}
		// 分页开始值 关键
		if(pageNum == 0){
			start = 0;
		}else{
			start = (pageNum - 1) * limit;
		}
		this.page = pageNum;
	}
	
	public int getStart() {
		// 分页开始值 关键
		if (page == 0) {
			start = 0;
		} else {
			start = (page - 1) * limit;
		}
		return start;
	}

	public void setPageSize(int pageSize) {
		if(pageSize <= 0){
			pageSize = PAGE_SIZE;
		}
		// 计算最大页数
		int pageCount = totalCount / pageSize;
		if(totalCount % pageSize == 0){
			totalPageNum = pageCount;
		}else{
			totalPageNum = pageCount + 1;
		}
		this.limit = pageSize;
	}

	public int getTotalPageNum() {
		return totalPageNum;
	}

	public void setTotalPageNum(int totalPageNum) {
		this.totalPageNum = totalPageNum;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
		if(totalCount > 0){
			if(page <= 0){
				page = PAGE_NUM;
			}
			// 计算最大页数
			int pageCount = totalCount / PAGE_SIZE;
			if(totalCount % PAGE_SIZE == 0){
				totalPageNum = pageCount;
			}else{
				totalPageNum = pageCount + 1;
			}
		}else{
			totalPageNum = 0;
		}
		
		if(page > totalPageNum){
			page = totalPageNum;
		}
	}

	public List<T> getRows() {
		return rows;
	}

	public void setRows(List<T> rows) {
		this.rows = rows;
	}

	public int getEndIndex() {
		return endIndex;
	}

	public void setEndIndex(int endIndex) {
		this.endIndex = endIndex;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getLimit() {
		return limit;
	}

	public void setLimit(int limit) {
		this.limit = limit;
	}

	public void setStart(int start) {
		this.start = start;
	}

	@Override
	public String toString() {
		return "Pager{" +
				"page=" + page +
				", limit=" + limit +
				", totalPageNum=" + totalPageNum +
				", totalCount=" + totalCount +
				", rows=" + rows +
				", start=" + start +
				", endIndex=" + endIndex +
				'}';
	}
}

 ArticleMapper.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.tulun.dao.ArticleMapper">
    <resultMap id="articleMap" type="com.tulun.model.Article">
        <result column="id" property="id"></result>
        <result column="categoryId" property="categoryId"></result>
        <result column="title" property="title"></result>
        <result column="content" property="content"></result>
        <result column="description" property="description"></result>
        <result column="status" property="status"></result>
        <result column="author" property="author"></result>
        <result column="createTime" property="createTime"></result>
        <result column="categoryName" property="categoryName"></result>
        <result column="showCount" property="showCount"></result>
        <result column="content" property="content" typeHandler="com.tulun.util.ConvertBlobTypeHandler"></result>
    </resultMap>

    <insert id="addArticle" parameterType="com.tulun.model.Article">
        insert into t_article (categoryId,title,content,description,status,author,createTime)
        values (#{categoryId},#{title},#{content},#{description},#{status},#{author},#{createTime})
    </insert>

    <select id="getArticleById" parameterType="int" resultMap="articleMap">
        select a.*,c.categoryName categoryName from t_article a, t_category c where a.categoryId = c.id and a.id = #{id}
    </select>

    <select id="getAllArticle" resultMap="articleMap">
        select a.*,c.categoryName categoryName from t_article a, t_category c where a.categoryId = c.id order by a.createTime desc
    </select>

    <select id="getAllArticleByCategoryId" resultMap="articleMap">
        select a.*,c.categoryName categoryName from t_article a, t_category c where a.categoryId = c.id and a.categoryId = #{categoryId} order by a.createTime desc
    </select>

    <!--mybatis中的动态sql-->
    <select id="selectCountByArticle" parameterType="map" resultType="int">
        select count(*)
        from t_article ta
        join t_category tc
        on  ta.categoryId = tc.id
        <where>
            <if test="article.title != null">
                and ta.title like concat('%', #{article.title}, '%')
            </if>
            <if test="article.categoryId != null and article.categoryId != 0">
                and ta.categoryId = #{article.categoryId}
            </if>
            <if test="article.tagId != null and article.tagId != 0">
                and exists (select 1 from t_article_tag tt where tt.articleId = ta.id and tt.tagId = #{article.tagId})
            </if>
        </where>
    </select>

    <select id="selectArticleByPager" parameterType="map" resultMap="articleMap">
        select ta.id,ta.categoryId,tc.categoryName,ta.title,ta.content,ta.author,ta.createTime,DATE_FORMAT(ta.createTime,'%Y-%m-%d %H:%i:%s') as time,
        ta.showCount,ta.status
        from t_article ta
        join t_category tc
        on  ta.categoryId = tc.id
        <where>
            <if test="article.title != null">
                and ta.title like concat('%', #{article.title}, '%')
            </if>
            <if test="article.categoryId != null and article.categoryId != 0">
                and ta.categoryId = #{article.categoryId}
            </if>
            <if test="article.tagId != null and article.tagId != 0">
                and exists (select 1 from t_article_tag tt where tt.articleId = ta.id and tt.tagId = #{article.tagId})
            </if>

        </where>

        order by ta.createTime desc
        limit #{start},#{limit}

    </select>

    <update id="updateStatus" parameterType="com.tulun.model.Article">
        update t_article set status =#{status} where  id = #{id}
    </update>
</mapper>

 前端页面

主要进行页面展示,包括ID,标题,状态,发表时间等等。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fm" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%
String path = request.getContextPath();
String basePath1 = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<table class="table table-striped table-bordered table-hover dataTables-example">
<thead>
    <tr>
        <th>Id</th>
        <th>标题</th>
        <th>栏目</th>
        <th>状态</th>
        <th>创建时间</th>
        <th>操作</th>
    </tr>
</thead>
<%--<div>--%>
<tbody>
	<c:forEach items="${articleList}" var="article">
		<tr class="gradeX">
            <td>${article.id}</td>
            <td>
            	<a target="_blank" href="<%=basePath%>article/${article.id}">
            		${article.title}
            	</a>
            </td>
			<td>
				<a target="_blank" href="<%=basePath1%>/loadPage/${article.categoryId}" >
            		${article.categoryName}
            	</a>
			</td>
			<td>
				<c:if test="${article.status == 0}">正常</c:if>
            	<c:if test="${article.status == 1}">不可用</c:if>
            </td>
            <td>${article.time}</td>
            <td>
				<c:if test="${article.status == 0}">
					<button class="btn btn-info btn-xs" type="button"
                    title="关闭" onclick="updateStatue(${article.id},1)">关闭
    				</button>
    			</c:if>
    			<c:if test="${article.status == 1}">
    				<button class="btn btn-info btn-xs" type="button"
                    title="开启" onclick="updateStatue(${article.id},0)">开启
                    </button>
    			</c:if>

            </td>
        </tr>
	</c:forEach>
</tbody>
</table>


<jsp:include page="pager.jsp" flush="true"></jsp:include>

该jsp内嵌在上一个jsp中,用于进行分页操作。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fm" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>


<c:if test="${pager.totalCount gt 0 and pager.totalPageNum gt 1}">
	<div id="pager" class="row">
	   <input type="hidden" id="page" name="page" value="${pager.page}"/>
	   <div class="col-sm-6">
		    <div class="dataTables_info" role="alert" aria-live="polite" aria-relevant="all">
		     	共${pager.totalCount}条记录&nbsp;${pager.page}/${pager.totalPageNum}
		    </div>
	   </div>
	   <div class="col-sm-6">
		    <div class="dataTables_paginate paging_simple_numbers">
			     <ul class="pagination">
				      <c:if test="${pager.page - 2 gt 2}">
				      		<li class="paginate_button previous" aria-controls="DataTables_Table_0" tabindex="0" id="DataTables_Table_0_previous">
					      		<a href="javascript:;" onclick="toPage(${pager.page - 1})">上一页</a>
					      	</li>
					      	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(1)">1</a>
					      	</li>
					      	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;">...</a>
					      	</li>
		                	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page - 2})">${pager.page - 2}</a>
					      	</li>
					      	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page - 1})">${pager.page - 1}</a>
					      	</li>
	                	</c:if>
	                	
	                	<c:if test="${pager.page == 4}">
		                	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(1)">1</a>
					      	</li>
		                	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page - 2})">${pager.page - 2}</a>
					      	</li>
					      	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page - 1})">${pager.page - 1}</a>
					      	</li>
	                	</c:if>
	                	
	                	<c:if test="${pager.page - 2 lt 2}">
	                		<c:if test="${pager.page == 3}">
	                			<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
						      		<a href="javascript:;" onclick="toPage(1)">1</a>
						      	</li>
	                			<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
						      		<a href="javascript:;" onclick="toPage(2)">2</a>
						      	</li>
	                		</c:if>
	                		<c:if test="${pager.page == 2}">
	                			<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
						      		<a href="javascript:;" onclick="toPage(1)">1</a>
						      	</li>
	                		</c:if>
	                	</c:if>
				      
				      <!-- 当前页 -->
				      <li class="paginate_button active" aria-controls="DataTables_Table_0" tabindex="0">
				      		<a href="javascript:;">${pager.page}</a>
				      </li>
				      
				      <c:if test="${pager.page + 3 lt pager.totalPageNum}">
	                    	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page + 1})">${pager.page + 1}</a>
					      	</li>
					      	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page + 2})">${pager.page + 2}</a>
					      	</li>
		                    <li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;">...</a>
					      	</li>
		                    <li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.totalPageNum})">${pager.totalPageNum}</a>
					      	</li>
		                    <li class="paginate_button next" aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page + 1})">下一页</a>
					      	</li>
	                    </c:if>
	                    <c:if test="${pager.page + 3 == pager.totalPageNum}">
	                    	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page + 1})">${pager.page + 1}</a>
					      	</li>
					      	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page + 2})">${pager.page + 2}</a>
					      	</li>
	                    	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
					      		<a href="javascript:;" onclick="toPage(${pager.page + 3})">${pager.page + 3}</a>
					      	</li>
	                    </c:if>
	                    <c:if test="${pager.page + 3 gt pager.totalPageNum}">
	                    	<c:if test="${pager.page == pager.totalPageNum -1}">
		                    	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
						      		<a href="javascript:;" onclick="toPage(${pager.page + 1})">${pager.page + 1}</a>
						      	</li>
	                    	</c:if>
	                    	<c:if test="${pager.page == pager.totalPageNum -2}">
		                    	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
						      		<a href="javascript:;" onclick="toPage(${pager.page + 1})">${pager.page + 1}</a>
						      	</li>
						      	<li class="paginate_button " aria-controls="DataTables_Table_0" tabindex="0">
						      		<a href="javascript:;" onclick="toPage(${pager.page + 2})">${pager.page + 2}</a>
						      	</li>
	                    	</c:if>
	                    </c:if>
			     </ul>
		    </div>
	   </div>
	</div> 
</c:if>

js

$(function(){
	//alert(1);
	// 加载文章列表
	loadArticleList();
});



// 加载文章列表
function loadArticleList(){
	//alert(2);
	// 收集参数
	var param = buildParam();
	// alert(param);
	//分页相关操作
	var page = $("#page").val();
	if(isEmpty(page) || page == 0){
		page = 1;
	}

	$.ajax({
		url : '/article/load',
		data : 'page='+page+"&param="+param,
		type : "post",
		success  : function(data) {
			//alert(data);
			$("#dataList").html(data);
		}
	});

}


// 收集参数:前端传递的参数进行获取
function buildParam(){
	//alert(3);
	var param = {};
	var keyword = $("#keyword").val();
	if(!isEmpty(keyword)){
		param["title"] = encodeURI(encodeURI(keyword));
	}

	var categoryId = $("#categoryId").val();
	if(!isEmpty(categoryId) && categoryId != '-1'){
		param["categoryId"] = categoryId;
	}

	var tagId = $("#tagId").val();
	if(!isEmpty(tagId) && tagId != '-1'){
		param["tagId"] = tagId;
	}
	return JSON.stringify(param);
}


// 搜索
function search(){
	loadArticleList();
}

// 新增文章  跳转新页
function addArticle(){
	window.location.href = "/article/add";
}

// 删除文章
function deleteArticle(id){
	$.ajax({
		url : '../article/delete',
		data : 'id='+id,
		success  : function(data) {
			if(data.resultCode == 'success'){
				autoCloseAlert(data.errorInfo,1000);
				loadArticleList();
			}else{
				autoCloseAlert(data.errorInfo,1000);
			}
		}
	});
}

function htmlArticle(id){
	$.ajax({
		url : '../article/static/'+id,
		success  : function(data) {
			if(data.resultCode == 'success'){
				autoCloseAlert(data.errorInfo,1000);
				loadArticleList();
			}else{
				autoCloseAlert(data.errorInfo,1000);
			}
		}
	});
}

// 静态化全部文章
function htmlAllArticle(){
	$("#htmlAll").hide();
	$.ajax({
		url : '../article/staticAll',
		success  : function(data) {
			if(data.resultCode == 'success'){
				autoCloseAlert(data.errorInfo,1000);
				loadArticleList();
			}else{
				autoCloseAlert(data.errorInfo,1000);
			}
			$("#htmlAll").show();
		}
	});
}

// 编辑文章
function editArticle(id){
	window.location.href = "../article/editJump/"+id;
}

function toPage(page){
	$("#page").val(page);
	loadArticleList();
}

//0:可用  1:不可用
function updateStatue(id,flag){
	$.ajax({
		url : '/article/updateStatue',
		data : 'id='+id+'&status='+flag,
		success  : function(data) {
			if(data.resultCode == 'success'){
				autoCloseAlert(data.errorInfo,1000);
				loadArticleList();
			}else{
				autoCloseAlert(data.errorInfo,1000);
			}
		}
	});
}

部署至服务器

按类别查询

按标签查询

模糊查询

更改状态

新增先登录

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSM框架实战-搭建自己的个人博客4-文章管理与展示 的相关文章

  • SSM基本系统架构设计(Spring、Spring MVC 、MyBatis)

    系统根据功能的不同 项目结构可以划分为以下几个层次 1 持久对象层 也称持久层或持久化层 该层由若干持久化类 实体类 组成 2 数据访问层 DAO 层 该层由若干DAO 接口和MyBatis 映射文件组成 接口的名称统一以Dao 结尾 且M
  • Spring IOC容器初始化过程及其原理(源码层面)

    Spring大家族在Java技术生态体系中占有重要地位 其中Spring更是其中的佼佼者 它极大的简化了我们的代码开发量 提高我们的工作效率 其中Spring两大特性中的IOC特性是至关重要的 今天来从底层看一看Spring的容器的初始化过
  • 【Java笔记+踩坑】SSM整合

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 SSM整合入门案例 图书的增删改查 1 1
  • 基于SSM框架的员工管理系统

    一 视频展示 https www bilibili com video BV1xM4y1K71m 二 基本介绍 1 关键技术 开发工具 IntelliJ IDEA 数据库 MySQL 5 7 前端技术 Jquery Bootstrap JS
  • 计算机毕设之基于SSM框架仓库管理系统

    1 简介 博主介绍 全网粉丝30W csdn特邀作者 博客专家 CSDN新星计划导师 编程领域优质创作者 博客之星 各平台优质作者 专注于Java python等技术领域和毕业项目实战 文末获取源码联系 计算机毕设之基于SSM框架仓库管理系
  • 用Docker部署SSM项目

    Docker环境的安装 卸载原有的环境 sudo yum remove docker docker client docker client latest docker common docker latest docker latest
  • 基于SSM框架的实验室开放管理系统

    系统功能结构设计 在分析并得出使用者对程序的功能要求时 就可以进行程序设计了 管理员功能结构图 管理员主要负责填充图书和其类别信息 并对已填充的数据进行维护 包括修改与删除 管理员也需要审核老师注册信息 发布公告信息 管理自助租房信息等 用
  • SpringMVC学习笔记

    springMVC简单入门 快速搭建 pom xml依赖
  • Java项目:眼镜商城系统(java+SSM+JSP+jQuery+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 管理员角色包含以下功能 管理员登录 管理员管理 管理商城会员 新闻公告管理 眼睛类型管理 城市信息管理 连锁配镜店管理 眼镜商品管理 用户订单管理 管理用户的评价信息等功能 用户角色包含以下功
  • Java-基于SSM+JSP的二手手机回收管理系统

    项目背景 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促
  • MyBatis看这一篇就够了(自动映射、手动映射[一对多、多对一]、延迟加载、动态SQL、缓存、逆向工程、分页)

    目录 一 MyBatis简介 1 1 MyBatis历史 1 2 什么是MyBatis MyBatis有啥特点 1 3 什么是ORM 1 4 MyBatis下载 1 5 和其它持久层技术对比 二 搭建MyBatis 2 0 开发环境 2 1
  • SSM项目遇到的问题(5)

    SSM项目中前端传递的方式为post且格式为Json 遇到的问题 问题解决 遇到的问题 简单介绍一下 遇到的问题 前端传送的数据为Json格式 方法为post 也就是这样子的 但是在后端获取到的数据 死活都为null 不管接受的参数 是这样
  • SpringMVC+ElementUl+Vue实现增、删、改、查、多条件搜索、分页功能(前端后端分离)

    使用vue element springMVC来实现增 删 改 查 搜索 分页这几个功能 对于今天老师留的作业小张与小红对话 一班小红同学对二班小张同学说 今天我们班里学了ElementUl组件可是我学没明白 老师还留了个基于vue Ele
  • ssm框架下的文件上传和下载

    ssm下的文件上传和下载 1 文件上传 1 1 文件上传需要的依赖 文件上传需要使用到 commons fileupload 和 commons io 两个 jar 包
  • 解决 logback不打印 Mybatis SQL等相关日志 日志

    我使用的是 logback 1 2 3版本 其 maven 依赖如下
  • Java-基于SSM+JSP的医院挂号管理系统

    项目背景 随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 医院预约挂号系统当然也不能排除在外 医院预约挂号系统是以实际运用为开发背景 运用软件工程开发方法 采用jsp技术构建的一个
  • Spring为什么要用的三级缓存解决循环依赖

    一 代码准备 Component aService public class AService Autowired private BService bService public void test System out println
  • IDEA2021从零开始搭建SSM框架手把手详细教程 (一)

    开发环境 macos IDEA 2021 mysql8 0 toma9 0 源码 https download csdn net download a2267542848 19730797 1 基本环境搭建 1 新建工程 新建后整个目录如下
  • SSM知识点铺垫--Http工作原理?

    HTTP Hypertext Transfer Protocol 是一种用于在网络上传输超文本的协议 它是一个无状态的协议 意味着每次请求之间没有保留状态 HTTP的工作原理涉及客户端和服务器之间的通信 主要包括请求 Request 和响应
  • 带参数的 Jest Mock Promise

    这是我尝试在 Jest 中编写单元测试的方法 async function getParameter parameter string withDecryption boolean false Promise

随机推荐

  • 生产者消费者模型分析与实现

    生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题 生产者和消费者彼此之间不直接通讯 xff0c 而通过阻塞队列来进行通讯 xff0c 所以生产者生产完数据之后不用等待消费者处理 xff0c 直接扔给阻塞队列 xff0c 消费
  • ConcurrentHashMap优点与源码剖析

    哈希表是中非常高效 xff0c 复杂度为O 1 的数据结构 xff0c 在Java开发中 xff0c 我们最常见到最频繁使用的就是HashMap和HashTable xff0c 但是在线程竞争激烈的并发场景中使用都不够合理 HashMap
  • IO-字节流

    文件 amp File类的使用 1 文件的概念 文件可以分为文本文件 二进制文件 2 IO流的概念 流是有顺序 有起点和终点的集合 xff0c 是对数据传输的总称 流的本质就是用来对数据进行操作 IO是我们实现的目的 xff0c 实现这个目
  • STM32F407的TCP编程出现客户端无法连接上服务器,DHCP获取IP失败,服务器重启客户端无法自动重连问题解决方案

    单写一篇文章记录这些问题 xff0c 因为有的问题实在是困扰了我太久太久了 xff0c 终于解决了 xff01 xff01 xff01 1 STM32F407的TCP编程 xff0c TCP SERVER测试完全正常 xff0c TCP C
  • SQL练习汇总(查询“01“课程比“02“课程成绩高的学生的信息及课程分)

    1 学生表 Student SID Sname Sage Ssex SID 学生编号 Sname 学生姓名 Sage 年龄 Ssex 学生性别 编号 姓名 年龄 性别 1 赵雷 20 男 2 钱电 20 男 3 孙风 21 男 4 吴兰 1
  • JDBC编程,SQL注入与连接池

    JDBC概念 JDBC Java Data Base Conection 是java中提供的一套标准的应用编程接口 xff0c 用来连接Java编程语言和数据库 JDBC常用组件 xff1a DriverManger xff1a 数据库驱动
  • Pytorch搭建基于SRCNN图像超分辨率重建模型及论文总结

    SRCNN xff08 Super Resolution Convolutional Neural Network xff09 论文出处 xff1a Learning a Deep Convolutional Network for Ima
  • 技术领域的面试总结

    在当今互联网中 xff0c 虽然互联网行业从业者众多 xff0c 不断崛起的互联网公司也会很多 xff0c 仍然是很多同学想要进入的企业 那么本篇文章将会为大家很直白的讲解面试流程以及侧重点 仔细阅读本篇文章 xff0c 绝对会有所收获 x
  • Mybatis基于XML与基于注解实现CRUD

    数据库 实体类Student package com pojo Description Created by Resumebb Date 2021 3 26 public class Student 和数据库中的STudent表对应 pri
  • Spring-IOC容器进行对象管理

    目录 IOC概念 IOC思想 Spring管理对象 集成依赖 spring的配置文件 xff08 Applicationcontext xml xff09 创建实体类User Spring对Bean的实例化方式 基于配置形式 1 通过无参构
  • Spring-AOP原理及实现

    Spring AOP AOP Aspect Oriented Programing 面向切面编程 xff1a 扩展功能不通过修改源代码实现 AOP采用横向抽取机制 xff0c 取代传统纵向继承体系实现响应的功能 xff08 性能监控 事务
  • Spring&Mybatis整合及Spring中JDBCTemplate的使用

    Spring和Mybatis整合 在mybatis中 xff0c 操作数据库需要获取到SQLSession对象 xff0c 而该对象的实例过程在mybatis是通过SQLSessionFactoryBuilder读取全局配置文件来实例化一个
  • SpringMVC设计模式

    什么是MVC MVC是模型 Model 视图 View 控制器 Controller 的简写 xff0c 是一种软件设计规范 是将业务逻辑 数据 显示分离的方法来组织代码 MVC主要作用是降低了视图与业务逻辑间的双向偶合 MVC不是一种设计
  • SSM框架整合

    整合思路 主要分为Controller xff0c service层 xff0c dao层 整合dao mybatis和spring的整合 xff0c 通过spring来管理mapper接口 xff0c 数据源 xff0c 使用mapper
  • SSM框架实战-搭建自己的个人博客1-基础架构搭建

    前言 本系列文章主要通过从零开始搭建自己的个人博客 xff0c 来加深对SSM框架的学习与使用 xff0c 了解一个系统从提出到设计 到开发 到测试 部署运行的过程 xff0c 并记录在搭建过程中的学习心得 遇见的错误及解决方式 代码放在g
  • SSM框架实战-搭建自己的个人博客2-UEditor编辑器的使用

    目录 UEditor 博客内容提交与展示功能测试 Controller开发 新增博客页面add ueditor jsp 博客详情界面detail jsp 博客新增和展示详情功能开发 博客存储 博客标题开发 标签POJO类 TagMapper
  • SSM框架实战-搭建自己的个人博客3-登录实现及前端界面设计

    目录 后台登录功能 前端页面 后端开发 前端界面设计 详情首页 js脚本 SSM整体设计 Dao层 Service层 Mapper xml Controller 子博文界面 部署至服务器 后台登录功能 登录页面 xff1a 用户名和密码 通
  • 超分辨率重建-PNSR与SSIM的计算(RGB、YUV和YCbCr互转)

    RGB YUV和YCbCr 自己复现的网络跑出来的模型进行预测的时候 xff0c 不知道为啥算出来的结果比论文中要低好多 不论scale factor为多少 xff0c 我算出来的结果均普遍低于论文中给出的 xff0c PSNR大概低个1
  • 如何写简历

    注意点 xff1a 篇幅 校招一页 社招二页 谨慎使用精通 精通 gt 熟悉 xff08 推荐使用 xff09 gt 掌握 xff08 推荐使用 xff09 gt 了解 xff08 推荐使用 xff09 拿不准的不要写在简历上 突出自己技能
  • SSM框架实战-搭建自己的个人博客4-文章管理与展示

    实现功能 主要实现上图所示的功能 xff0c 从数据库中查询到所有文章数据 xff0c 并进行显示如标题 xff0c 栏目等信息 xff0c 可以通过分类查询文章 xff0c 通过标签查询文章 xff0c 也可以通过搜索进行模糊查询 xff