主頁 > 後端開發 > 手把手教你基于【SpringBoot+MyBatis】實作員工管理系統‍【附完整原始碼】

手把手教你基于【SpringBoot+MyBatis】實作員工管理系統‍【附完整原始碼】

2021-09-03 18:49:27 後端開發

一、寫在前面

Hello,你好呀,我是灰小猿,一個超會寫BUG的程式猿🙊!

近期在學習springboot框架相關的內容,相比于SSM,SpringBoot最大的特點就是集成了Spring和SpringMVC,讓之前繁瑣的配置作業變得更加簡潔,同時對于業務邏輯層的處理也更加的友好,

所以今天就使用SpringBoot整合MyBatis來做一個完整的員工管理系統,實作登錄驗證、國家化、CRUD等操作,帶大家熟悉一下SpringBoot的操作流程,以及整合MyBatis的具體步驟,整個專案你將會學到SpringBoot框架mybatis框架BootStrap框架thymleafLombok插件等技術!

小伙伴們一鍵三連?關注灰小猿帶你上高速啦🎉🎉🎉

先看一個效果視頻:

<iframe id="s3KoQhvj-1630512309632" src="https://live.csdn.net/v/embed/176204" allowfullscreen="true" data-mediaembed="csdn"></iframe>

基于springboot+mybatis的員工管理系統

使用springboot+mybatis進行專案開發,我簡單的給大家劃分了幾個步驟,平常的開發我們只需要按照這個程序進行就可以了,

SpringBoot整合Mybatis基本步驟

  1. 搭建springboot環境
  2. 進行配置處理
    1. 在pom.xml中引入所需依賴
    2. 配置application
  3. 進行前端頁面布局
  4. 引入資料源
  5. 配置mybatis操作

二、進行專案配置

(1)引入pom.xml配置

雖然springboot大大的簡化的配置的程序,但是不代表所有的配置都可以由springboot自動完成,所以,當我們需要使用其他相關依賴的時候(如thymleaf、lombok),同樣需要在pom.xml中引入相應的配置依賴,

在這個專案中我們需要引入的依賴有

Mybatis依賴

        <!--mybatis依賴-->
        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

資料庫驅動

        <!--資料庫驅動-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
            <scope>runtime</scope>
        </dependency>

LomBok依賴

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

Thymleaf依賴

        <!--thymleaf 基于3.x開發-->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
        </dependency>

(2)、配置application

當我們在對專案進行操作的時候,一般需要引入或修改一些springboot的默認配置,方便我們的開發使用,springboot的組態檔可以是properties后綴,也可以是ymal后綴,我這里使用的properties后綴的組態檔,

在這個專案中我們需要引入資料源、并進行以下一些配置,

# 清除thymeleaf的快取
spring.thymeleaf.cache=false

# 設定一個頁面的訪問路徑
server.servlet.context-path=/gyg

# 告訴springboot國際化放置的位置
spring.messages.basename=i18n.login

# 配置日期格式,自定義日期格式轉換器
spring.mvc.format.date=yyyy-MM-dd

# 配置資料源
spring.datasource.username=root
spring.datasource.password=ADMIN
#serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_emps?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# 配置mybatis
mybatis.type-aliases-package=com.gyg.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

配置完以上這兩項之后就算是完成了專案開發的基本作業,其他詳細的配置我們在專案中用到的時候接著說,接下來就是布局前端頁面和實作資料處理的程序,

三、前端實作

因為整個專案是盡可能采用前后端分離的思想來做的,所以這里我就把前后端分開和大家講解,首先來做前端部分,包括登錄驗證、頁面布局、國際化、資料傳值、注銷操作等,

(1)、登錄驗證

一般的管理系統都是需要使用到登錄以及驗證操作的,驗證用戶的登錄資訊是否正確,判斷用戶有沒有非法的翻越登錄界面直接進入主頁這些操作,

一般判斷用戶有沒有在未登錄的情況下頁面的方法的是:在用戶第一次登錄成功時設定一個session并賦值,同時在請求主頁的時候驗證session是否存在,如果不存在,則說明用戶并沒有進行登錄操作就直接的訪問了主頁,這樣顯然是違法的,

在這里補充一個關于session生命周期的知識點:

Sessinon在用戶訪問第一次訪問服務器時創建,需要注意只有訪問JSP、Servlet等程式時才會創建Session,只訪問HTML、IMAGE等靜態資源并不會創建Session,但可呼叫request.getSession(true)強制生成Session,服務器會把長時間沒有活動的Session從服務器記憶體中清除,此時Session便失效,Tomcat中Session的默認失效時間為20分鐘,同時還可以呼叫Session的invalidate方法將session清除,

在這里,用戶點擊登錄時向控制器發送登錄請求,判斷用戶輸入的資訊是否正確,如果正確就創建session,并重定向到主頁;否則就重新回到登錄頁面,

代碼如下:

    @RequestMapping("/user/login")
//    @ResponseBody //回傳json字串
    public String login(@RequestParam("username") String username, @RequestParam("password") String password,
                        Model model, HttpSession session) {
//        如果用戶名不為空,且密碼正確,就跳轉頁面
        if (!StringUtils.isEmpty(username) && "666666".equals(password)) {
            session.setAttribute("loginUser", username);
            return "redirect:/main.html";
        } else {
            model.addAttribute("msg", "用戶名或密碼輸入錯誤!");
            return "index";
        }
     /*   model.addAttribute("username",username);
        model.addAttribute("password",password);*/

    }

(2)WebMvc組態檔

但是由于我們需要回傳頁面跳轉,所以我們需要設定像springmvc中的視圖決議器一樣的東西,來告訴springboot,對于一般的回傳,我們應該如何跳轉,

在這里我們需要寫一個專門的配置類,來實作這些配置操作,這些配置類都需要使用@Configuration標識,這樣系統才會認為這是一個配置類;使用@Configuration標識的類就相當于SSM中的xml組態檔,

Mvc的配置類需要實作WebMvcConfigurer介面,并且根據需要重寫介面中的一系列方法,視圖決議器的定義方法是這樣的:

    /**
     * 配置一個自定義的視圖控制器
     *
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/main.html").setViewName("dashboard");

    }

(3)頁面布局實作

很多前端專案的布局都會使用到的一個框架bootstrap,這個框架提供了非常多的前端組件,我們可以直接匯入相應的代碼即可使用,像我們專案的頁面中,按鈕和表格布局,都是直接使用的bootstrap框架,想要了解如何使用的小伙伴們可以去它的官網查看【bootstrap官網】,然后對于想要快速搭建前端或者后臺頁面的小伙伴們還可以直接在網上搜索“bootstrap模版”即可,

(4)國際化操作

實作國際化的操作一般對于大型的網站開發還是非常常見的,所以在這個專案中我也在登錄頁面做了一個國際化的操作,

Springboot實作國際化需要實作LocaleResolver介面,并實作其中方法,這是springboot規定的語言決議介面,

該類的具體實作是這樣的:

package com.gyg.config;

import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

/**
 * 國際化配置
 * @author 郭運剛
 */
public class MyLocaleResolver implements LocaleResolver {

    /**
     * 決議請求
     *
     * @param request
     * @return
     */
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
//        獲取請求中的語言引數鏈接
        String language = request.getParameter("l");
//        如果沒有就使用默認的
        Locale locale = Locale.getDefault();
//        判斷請求中獲取到的語言引數鏈接是否為空,如果不為空,就使用請求的鏈接
        if (!StringUtils.isEmpty(language)) {
//            zh_CN
            String[] splits = language.split("_");
//            國家  地區
            locale =  new Locale(splits[0], splits[1]);

        }

        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
}

之后通過mvc的配置類中重寫addInterceptors方法,在其中添加實作語言決議的過濾器,addInterceptors方法的作用就是增加springboot訪問的攔截器,里面的registry引數后面可以增加過濾器類或者增加需要過濾哪些內容,不需要過濾哪些內容,

如下面我們的方法中,增加了國際化過濾、過濾所有內容,同時還對于css、js、img等內容不過濾,

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");

    }

以上設定完成之后,我們需要在target/classes下建立檔案夾i18n,在其中建立三個國際化的組態檔夾,分別是默認語言、漢語、英語,

(5)注銷登錄

注銷登錄的操作實作其實還是比較簡單的,我們上面也提到了,驗證用戶是否正常登錄的操作是判斷是否存在session,那么在進行注銷登錄的時候,我們只需要將session使用invalidate()方法清除掉即可,同時回傳到登錄頁面,

    /**
     * 頁面注銷
     * @param session
     * @return
     */
    @RequestMapping("/user/logout")
    public String logout(HttpSession session){
//        使當前session作廢
        session.invalidate();
        return "redirect:/index.html";
    }

直到這里,前端頁面的一些核心操作才算是基本完成了,📢📢📢中間還有很多頁面的代碼我沒有放出來,完整原始碼我整理好了,小伙伴們可以下載:完整原始碼

三、后臺實作

員工資訊管理專案的后臺實作主要是采用mybatis框架,使用mybatis框架實作的資料庫操作更加的簡單明了,資料層和業務邏輯層處理也更加簡單,

(1)資料源

我們的資料表結構如

同時我們需要將資料源匯入到專案中,方法是直接在application中寫入username、password、URL、ClassDriver這些引數就好,

# 配置資料源
spring.datasource.username=root
spring.datasource.password=ADMIN
#serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_emps?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

(2)利用LomBok簡化bean

Lombok 是一種 Java 實用工具,可用來幫助開發人員消除 Java 的冗長,尤其是對于簡單的 Java 物件(POJO),它通過注釋實作這一目的,所以為了簡化代碼,我們的bean使用lombok插件,其中常用的三個注解是:

  • @Data 表示該類是資料,并且默認給該類的引數加上了get和set方法
  • @AllArgsConstructor 有參構造
  • @NoArgsConstructor 無參構造

使用lombok后的員工類是這樣的,是不是簡化了很多代碼量!

package com.gyg.pojo;

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

import java.util.Date;

/**
 * 員工表
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private Integer gender;
    private Integer did;
    private Date birth;

    private Department department;
    
}

(3)配置SQL

Mybatis的實作關鍵的幾個檔案也就是mapper、xml、serveice和controller,在mapper中定義好方法的介面,然后在xml中寫入相應的sql陳述句,移交到service類進行資料處理,controller類直接呼叫service類,最后通過請求執行controller類即可,

我們在員工的mapper介面中定義了基本的增刪改查方法,

package com.gyg.mapper;

import com.gyg.pojo.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 定義員工的介面
 */
@Mapper
@Repository
public interface EmployeeMapper {

    List<Employee> queryAllEmp();

    Employee queryEmpById(int id);

    int addEmp(Employee employee);

    int updateEmp(Employee employee);

    int deleteEmpById(int id);

}

在部門的mapper中定義了查找所有部門的方法,

package com.gyg.mapper;

import com.gyg.pojo.Department;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 定義部門的介面
 */
@Mapper
@Repository
public interface DepartmentMapper {
    List<Department> queryAllDepart();
}

緊接著我們需要分別在對應的xml中寫入執行該操作的sql陳述句,由于我們需要顯示員工和員工的部門,所以我們需要使用連接查詢,查詢出員工和其對應的部門資訊,

<?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.gyg.mapper.EmployeeMapper">

    <!--回傳員工和對應的部門資訊-->
    <resultMap id="withDepartResultMap" type="Employee">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="lastName" jdbcType="VARCHAR" property="lastName"/>
        <result column="email" jdbcType="VARCHAR" property="email"/>
        <result column="gender" jdbcType="INTEGER" property="gender"/>
        <result column="d_id" jdbcType="INTEGER" property="did"/>
        <result column="birth" jdbcType="DATE" property="birth"/>
        <association property="department" javaType="Department">
            <id column="d_id" jdbcType="INTEGER" property="id"/>
            <result column="departmentName" jdbcType="VARCHAR" property="departmentName"/>
        </association>
    </resultMap>

    <!--List<Employee> queryAllEmp();-->
    <select id="queryAllEmp" resultMap="withDepartResultMap">
        SELECT * FROM employee LEFT JOIN department ON employee.d_id=department.id
    </select>

    <!--Employee queryEmpById(int id);-->
    <select id="queryEmpById" resultMap="withDepartResultMap">
        SELECT * FROM employee LEFT JOIN department ON employee.d_id=department.id WHERE employee.id=#{id}
    </select>

    <!--int addEmp(Employee employee);-->
    <insert id="addEmp" parameterType="Employee">
        insert into employee (id,lastName,email,gender,d_id,birth) values (#{id},#{lastName},#{email},#{gender},#{did},#{birth});
    </insert>

    <!-- int updateEmp(Employee employee);-->
    <update id="updateEmp" parameterType="Employee">
        update employee set lastName = #{lastName},email=#{email},gender=#{gender},d_id=#{did},birth=#{birth} where id=#{id};
    </update>

    <!--int deleteEmpById(int id);-->
    <delete id="deleteEmpById" parameterType="int">
        delete from employee where id=#{id}
    </delete>

</mapper>

(4)業務邏輯層實作

業務邏輯層也就是service層,在這里我們可以直接根據mybatis的特性,將對應的mapper自動裝配進去,然后直接呼叫介面的方法就可以實作執行sql陳述句的操作了,下面的員工類和部門類的service,

package com.gyg.service;

import com.gyg.mapper.EmployeeMapper;
import com.gyg.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 員工的業務邏輯層
 */
@Service
public class EmployeeService {

    @Autowired
    EmployeeMapper employeeMapper;

    /**
     * 獲取到所有的員工資訊
     * @return
     */
    public List<Employee> queryAllEmp(){
        return employeeMapper.queryAllEmp();
    };

    /**
     * 根據id查找指定員工
     * @param id
     * @return
     */
    public Employee queryEmpById(int id){
        return employeeMapper.queryEmpById(id);
    };

    /**
     * 添加員工
     * @param employee
     * @return
     */
    public int addEmp(Employee employee){
        return employeeMapper.addEmp(employee);
    };

    /**
     * 修改員工
     * @param employee
     * @return
     */
    public int updateEmp(Employee employee){
        return employeeMapper.updateEmp(employee);
    };

    /**
     * 根據ID洗掉員工
     * @param id
     * @return
     */
    public int deleteEmpById(int id){
        return employeeMapper.deleteEmpById(id);
    };
}

(5)控制器層

該層可以說是直接和前端界面進行連接的,在每一個方法上面都會標注相應的請求型別,直接將資料請求到對應的方法然后執行,

員工類的控制器層:

/**
 * 員工管理
 */
@Controller
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;

    @Autowired
    DepartmentService departmentService;

    /**
     * 獲取所有員工,并回傳到顯示頁
     *
     * @param model
     * @return
     */
    @RequestMapping("/emps")
    public String queryAllEmp(Model model) {
        List<Employee> employees = employeeService.queryAllEmp();
        model.addAttribute("emps", employees);
        System.out.println(employees);
        return "emp/list";
    }

    /**
     * 跳轉到添加員工頁面
     *
     * @return
     */
    @GetMapping("/toAdd")
    public String toAddPage(Model model) {
        List<Department> departments = departmentService.queryAllDepart();
        System.out.println("查詢結果:");
        System.out.println(departments);
        model.addAttribute("departments", departments);
        return "emp/add";
    }

    /**
     * 添加員工
     *
     * @return
     */
    @PostMapping("/emp")
    public String addEmployee(Employee employee) {
        System.out.println("save-------------  " + employee);
        Integer did = employee.getDepartment().getId();
        employee.setDid(did);

        //添加員工
        employeeService.addEmp(employee);

        //重定向到串列頁面
        return "redirect:/emps";
    }

    /**
     * 去員工的修改頁面
     *
     * @return
     */
    @GetMapping("/emp/{id}")
    public String toUpdateEmp(@PathVariable("id") Integer id, Model model) {
        //獲取到該員工資訊
        Employee employee = employeeService.queryEmpById(id);
        model.addAttribute("emp", employee);
        System.out.println("empID:" + employee);
        //獲取到所有的部門資訊
        Collection<Department> departments = departmentService.queryAllDepart();
        model.addAttribute("departments", departments);
        return "emp/update";
    }

    /**
     * 修改員工
     * @return
     */
    @PostMapping("updateEmp")
    public String updateEmp(Employee employee){
        Integer did = employee.getDepartment().getId();
        employee.setDid(did);
        employeeService.updateEmp(employee);
        System.out.println("修改資料:" + employee);
        return "redirect:/emps";
    }

    /**
     * 洗掉員工
     * @return
     */
    @RequestMapping("/delete/{id}")
    public String deleteEmp(@PathVariable("id") Integer id){
        employeeService.deleteEmpById(id);
        System.out.println("洗掉成功!" + id);
        return "redirect:/emps";
    }
}

以上就是這個專案的基本構造了!

四、寫在最后

由于代碼量比較多,所以上面只是貼了一些核心的代碼,🔊🔊🔊完整的原始碼小伙伴們可以在這里下載【完整原始碼】記得?star?喲!,

專案中用到的知識點也非常多,小伙伴們在學校的程序中有清楚的,可以在評論區留言或者加我交流

小伙伴們一鍵三連?關注灰小猿帶你上高速啦🎉🎉🎉

我是灰小猿,我們下期見!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297132.html

標籤:java

上一篇:JAVA入門之例外 筆記(34)

下一篇:熬夜再戰Android從青銅到王者-初識技術堆疊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more