Mybatis Plus框架 基本语法

news2024/11/18 1:47:34

MybatisPlus 中文官网

依赖配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--MybatisPlus官方提供的starter,其中集成了Mybatis以及plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        
        <!-- 代码生成器 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- Apache Velocity -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        
		<!-- @ApiModel等注解对应依赖 -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.13</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

数据库连接

#设置开发环境 @Profile指定
#spring.profiles.active=dev

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456

#配置日志:Sql如何执行的
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#mybatis plus逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

注解

package com.example.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;


@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    @TableField(value = "name")
    private String name;
    private Short age;
    private Short gender;
    private String phone;
    @Version
    private Integer version;

	//对于字段is前缀的需要使用注解绑定
    @TableField(value = "is_deleted")
    @TableLogic
    private Integer isDeleted;

    //首次时间是插入,之后是更新
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
}

CRUD接口

在这里插入图片描述
Lambda条件构造器使用原因:
QueryWrapper、UpdateWrapper条件构造器都是用字符串的形式指定。这种方式无法在编译期确定列名的合法性。

Wrapper 注意

条件调用 如果不写.select(XX,XX),默认就是select* 

自动填充

package com.example.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.setFieldValByName("createTime", new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

乐观锁和分页插件

package com.example.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.interceptor.PerformanceMonitorInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// Spring Boot 方式
@Configuration
public class MybatisPlusConfig {

    /**
     * 新版 注册乐观锁插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
        return mybatisPlusInterceptor;
    }

  /*  //分页插件
    @Bean
    public PaginationInnerInterceptor pageInterceptor(){
        return new PaginationInnerInterceptor();
    }*/


}

Mapper层

说明:

 /*通用 CRUD 封装BaseMapper (opens new window)接口,为 Mybatis-Plus
   启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器 
   */
public interface UserMapper extends BaseMapper<User> {

}

package com.example;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class DemoApplicationTests {

    //UserMapper集成BaseMapper所有方法,也可以自定义
    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        //wrapper:条件构造器
        //查询所有用户
        List<User> userList = userMapper.selectList(null);
        userList.stream().forEach(user -> System.out.println(user));
    }

    //批量查询 In
    @Test
    public void selectByIds(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        users.stream().map(user -> user.getName()).forEach(user -> System.out.println(user));
    }

    //Map查询:条件查询
    @Test
    public void selectByMap(){
        Map<String, Object> map = new HashMap<>();
        map.put("name","圆圆");

        List<User> users = userMapper.selectByMap(map);
        users.stream().map(user -> user.getName()).forEach(user -> System.out.println(user));

    }

    //Wrapper查询:类比Map条件查询
    @Test
    public void selectByWrapper(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.ge("age","1")
        .eq("phone","123456");
        userMapper.selectList(queryWrapper).stream().map(user -> user.getName()).forEach(e -> System.out.println(e));


    }

    //分页查询
    @Test
    public void selectPage(){
        //参数1:当前页面    参数2:页面大小
        Page<User> page = new Page<>(3,3);  //limit 6,3
        userMapper.selectPage(page,null);

        page.getRecords().stream().forEach(user -> System.out.println(user));
    }

    @Test
    public void insert(){
        User user = new User();
        user.setName("元宝");
        user.setAge((short)1);
        user.setGender((short)1);
        user.setPhone("123456");
        int i = userMapper.insert(user);
        System.out.println("插入结果:"+i);
    }

    //乐观锁测试 version初始值为1
    @Test
    public void testOptimisticLocker(){
        User user1 = userMapper.selectById(11);
        user1.setPhone("2444");

        User user2 = userMapper.selectById(11);
        user2.setPhone("2555");
        userMapper.updateById(user2);
        //执行失败,version=2
        userMapper.updateById(user1);
    }

    @Test
    public void deleteById(){
        userMapper.deleteById(12);

    }

    //只能更新一条记录
    //UPDATE user SET age=? ,updateTime=? WHERE is_deleted=0 AND (id < ?)
    @Test
    public void update1(){
        User user = new User();
        user.setId(10);
        user.setAge((short)20);
        //在调用updateById方法前,需要在T entity(对应的实体类)中的主键属性上加上@TableId注解。
        userMapper.updateById(user);
    }

    //可以更新一批对象,更为细致地设置具体字段
    // UPDATE user SET age=? WHERE is_deleted=0 AND (id < ?)
    @Test
    public void update2(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.lt("id",11);
        updateWrapper.set("age",20);
        userMapper.update(null,updateWrapper);
    }

    /*
    Lambda条件构造器
    使用原因:之前使用条件构造器都是用字符串的形式指定。这种方式无法在编译期确定列名的合法性。
     */

    //查询
    @Test
    public void select(){
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getAge,20);
        List<User> users = userMapper.selectList(queryWrapper);
        users.stream().forEach(e -> System.out.println(e));
    }


}

Service CRUD 接口

/*
- 通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
- 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
对象 Wrapper 为 条件构造器
*/

public interface UserService extends IService<User> {
    //自定义方法
    List<String> test();

}

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    /*
    技巧:
    操作一个对应的表直接使用getBaseMapper()
    操作其他表@Autowired注入
     */
    @Override
    public List<String> test() {
        UserMapper userMapper = getBaseMapper();
        List<User> userList = userMapper.selectList(new QueryWrapper<User>()  //在userMapper.selectList()方法中不能使用LambdaQueryWrapper
                .lambda()
                .eq(User::getAge, 20));
        List<String> list = userList.stream().map(e -> e.getName()).collect(Collectors.toList());
        return list;
    }
}

Controller层

 @Autowired //将service接口注入
    private EmployeeService employeeService;

    /**
     * 员工登录
     * @param request 将员工id存到session中
     * @param param 前端传来JSON形式数据,使用@RequestBody接收
     * @return
     */
    @PostMapping("/login")
    public void login(HttpServletRequest request, @RequestBody Employee param){
        /**
         *  SELECT
         *  name,phone
         *  FROM employee
         *  WHERE name = 'xxx' AND password = 'xxx' AND id > 1000 AND (update_time between 'xxx' AND 'xxxx') AND
         *  ORDER BY create_time DESC limit 1;
         * */
        LambdaQueryWrapper<Employee> queryWrapper = new QueryWrapper<Employee>()  
                .lambda()
                .select(Employee::getName , Employee::getPhone)  //条件默认用AND连接
                .eq(Employee::getName ,param.getName())
                .eq(Employee::getPassword , param.getPassword())
                .ne(Employee::getStatus , 2)
                .ge(Employee::getId , 1000)
                .between(Employee::getUpdateTime , "2023-09-10" , "2023-10-10")
                .orderByDesc(Employee::getCreateTime)
                .last("limit 1");    //如果有多个数据,只获取一个。类似数据库中的unique。
        Employee employee1 = employeeService.getOne(queryWrapper);  //getOne():获取一条结果

        employeeService.getOne(new QueryWrapper<Employee>()
                .lambda()
                .select(Employee::getName , Employee::getPhone)
                .eq(Employee::getName ,param.getName())
                .eq(Employee::getPassword , param.getPassword())
                .last("limit 1"));

        //查询phone是182开头、或者 (name以王开头 并且 用户状态是1)
        //SELECT XXX FROM xx WHERE (phone like 182) OR (name LIKE 王 AND status = 1)
        //王 2
        employeeService.list(new QueryWrapper<Employee>()
                .lambda()
                .likeLeft(Employee::getPhone , "182") //182XXX。likeLeft和likeRigt查询效率高。
                .or(e -> e.likeLeft(Employee::getName , "王").eq(Employee::getStatus , 1)) //这里e指代new QueryWrapper<Employee>对象
        );


        /*
        List<Employee> employeeList = new ArrayList<>();
        employeeList.stream().filter(e -> e.getName().equals("王子怡")); //这里e 代表Employee对象。如果有List类型,就代表集合元素
        */


    }

代码生成器

package com.example.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

/**
 * @author
 * @since 2018/12/13
 */
@Slf4j
public class CodeGenerator {

    @Test
    public void run() {

        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("Vivi"); //需要手动修改!
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖
        gc.setServiceName("%sService");    //去掉Service接口的首字母I
        gc.setIdType(IdType.ASSIGN_ID); //主键策略
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
        gc.setSwagger2(true);//开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8"); //需要手动修改!
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root"); //需要手动修改!
        dsc.setPassword("123456");  //需要手动修改!
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("project1"); //模块名 需要手动修改!
        pc.setParent("com.example.demo");  //需要手动修改!
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("user"); //表名 需要手动修改!
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        //strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        mpg.setStrategy(strategy);


        // 6、执行
        mpg.execute();
    }
}

代码模板

@Override
    public PageResult<EmployeeListVO> pageEmployee(HrEmployeeRequest hrEmployeeRequest) {
        LambdaQueryWrapper<HrEmployee> wrapper = createWrapper(hrEmployeeRequest);
        //创建时间倒序
        wrapper.orderByDesc(HrEmployee::getCreateTime);
        wrapper.select(
                HrEmployee::getEmployeeId , HrEmployee::getEmployeeName , HrEmployee::getPhone
        );
        Page<HrEmployee> sysRolePage = this.page(PageFactory.defaultPage(), wrapper);

        //提取List并转成对应的VO
        List<HrEmployee> employeePageList = sysRolePage.getRecords();
        List<EmployeeListVO> employeeVOList = BeanUtil.copyToList(employeePageList , EmployeeListVO.class);

        //提取这一批数据的员工id集合
        List<Long> employeeIdList = employeePageList.stream().map(e -> e.getEmployeeId()).collect(Collectors.toList());

        //从hr_employee_org关系表 提取这一批员工的主要组织机构 + 主要部门 + 主要任职岗位
        List<EmployeeOrg> relationList = employeeOrgService.list(new QueryWrapper<EmployeeOrg>()
                .lambda()
                .eq(EmployeeOrg::getMainFlag , YesOrNotEnum.Y.getCode())
                .in(EmployeeOrg::getEmployeeId , employeeIdList)
        );
        Map<Long , EmployeeOrg> relationMap = new HashMap<>();
        Map<Long , String> orgMap = new HashMap<>();
        Map<Long , String> departmentMap = new HashMap<>();
        Map<Long , String> positionMap = new HashMap<>();
        if (!relationList.isEmpty()) {
            //转map,备用
            relationMap = relationList.stream().collect(
                    Collectors.toMap(e -> e.getEmployeeId() , Function.identity() , (e1 , e2) -> e2)
            );

            //提取组织机构、部门、任职岗位信息
            List<Long> orgIdList = relationList.stream().map(e -> e.getOrgId()).collect(Collectors.toList());
            List<Long> departmentIdList = relationList.stream().map(e -> e.getDepartmentId()).collect(Collectors.toList());
            List<Long> positionIdList = relationList.stream().map(e -> e.getPositionId()).collect(Collectors.toList());
            //组织机构信息
            List<HrOrganization> orgList = hrOrganizationService.list(new QueryWrapper<HrOrganization>()
                    .lambda()
                    .select(HrOrganization::getOrgId , HrOrganization::getOrgName)
                    .in(HrOrganization::getOrgId , orgIdList)
            );
            orgMap = orgList.stream().collect(
                    Collectors.toMap(e -> e.getOrgId() , e -> e.getOrgName() , (e1,e2) -> e2)
            );
            //部门信息
            List<HrOrganization> departmentList = hrOrganizationService.list(new QueryWrapper<HrOrganization>()
                    .lambda()
                    .select(HrOrganization::getOrgId , HrOrganization::getOrgName)
                    .in(HrOrganization::getOrgId , departmentIdList)
            );
            departmentMap = departmentList.stream().collect(
                    Collectors.toMap(e -> e.getOrgId() , e -> e.getOrgName() , (e1,e2) -> e2)
            );
            //职位信息
            List<HrPosition> positionList = hrPositionService.list(new QueryWrapper<HrPosition>()
                    .lambda()
                    .select(HrPosition::getPositionId , HrPosition::getPositionName)
                    .in(HrPosition::getPositionId , positionIdList)
            );
            positionMap = positionList.stream().collect(
                    Collectors.toMap(e -> e.getPositionId() , e -> e.getPositionName() , (e1,e2) -> e2)
            );

        }

        //TODO 提取员工的登录账号
        List<EmployeeUser> accountRelationList = employeeUserService.list(new QueryWrapper<EmployeeUser>()
                .lambda()
                .in(EmployeeUser::getEmployeeId , employeeIdList)
        );
        Map<Long , EmployeeUser> accountRelationMap = new HashMap<>();
        if (!accountRelationList.isEmpty()) {
            accountRelationMap = accountRelationList.stream().collect(
                    Collectors.toMap(e -> e.getEmployeeId() , Function.identity() , (e1 , e2) -> e2)
            );
        }

        //遍历一遍,设置关联字段的属性值
        for (EmployeeListVO vo : employeeVOList) {
            //从关系map提取当前员工的数据
            EmployeeOrg relation = relationMap.get(vo.getEmployeeId());
            if (relation == null) {
                continue;
            }

            vo.setOrgName(orgMap.get(relation.getOrgId()));
            vo.setDepartmentName(departmentMap.get(relation.getDepartmentId()));
            vo.setPositionName(positionMap.get(relation.getPositionId()));
        }

        //复制分页信息,绑定List
        Page<EmployeeListVO> employVOPage = new Page<>();
        BeanUtil.copyProperties(sysRolePage , employVOPage);
        employVOPage.setRecords(employeeVOList);

        return PageResultFactory.createPageResult(employVOPage);
    }

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

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

相关文章

3.2日-线性模型,基础优化方法,线性回归从零开始实现

3.2日-线性模型&#xff0c;基础优化方法&#xff0c;线性回归从零开始实现 1线性模型衡量预估质量训练数据总结2基础优化方法3 线性回归从零开始实现 1线性模型 衡量预估质量 训练数据 总结 2基础优化方法 梯度下降是一种优化算法&#xff0c;常用于机器学习和深度学习中&…

【MATLAB】兔子机器人总系统_动力学模型解读(及simulink中的simscape的各模块介绍)

1、动力学模型 Rectangular Joint 控制平面上&#xff08;x&#xff0c;y轴&#xff09;的移动&#xff0c;去掉以后&#xff0c;机器人在原地翻滚不移动 Rigid Transform 坐标转换&#xff0c;B站视频已收藏 去掉&#xff0c;机体与地面贴合 此处的作用是设定机体的初…

Java多线程实现发布和订阅

目录 简介 步骤 1: 定义消息类 步骤 2: 创建发布者 步骤 3: 创建订阅者 步骤 4: 实现发布-订阅模型 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡…

javaWebssh教师荣誉库管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

leetcode刷题-110 平衡二叉树的判断(递归实现)

题目描述 解题思路 首先解释一下&#xff0c;为什么会做到这个题目&#xff0c;因为博主在按顺序做题的过程中&#xff0c;碰到了一个不会做的题目&#xff08;递归类型&#xff09;&#xff0c;就想着看看题解&#xff0c;发现了一个大佬的文章&#xff0c;就是专门讲的递归&…

Python推导式大全与实战:精通列表、字典、集合和生成器推导式【第115篇—python:推导式】

Python推导式大全与实战&#xff1a;精通列表、字典、集合和生成器推导式 Python语言以其简洁、优雅的语法而闻名&#xff0c;其中推导式是其独特之处之一。推导式是一种在一行代码中构建数据结构的强大方式&#xff0c;它涵盖了列表、字典、集合和生成器。本篇博客将全面介绍…

二维码门楼牌管理系统技术服务:文字规范与技术创新

文章目录 前言一、文字规范&#xff1a;确保信息传达的准确性二、技术创新&#xff1a;推动二维码门楼牌管理系统的升级发展 前言 在数字化时代的浪潮下&#xff0c;二维码门楼牌管理系统作为一种创新的城市管理手段&#xff0c;逐渐进入大众视野。这套系统不仅优化了城市空间…

131. 分割回文串(力扣LeetCode)

文章目录 131. 分割回文串题目描述回溯代码 131. 分割回文串 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xf…

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

Linux下进程相关概念详解

目录 一、操作系统 概念 设计操作系统的目的 定位 如何理解“管理” 系统调用和库函数概念 二、进程 概念 描述进程—PCB&#xff08;process control block&#xff09; 查看进程 进程状态 进程优先级 三、其它的进程概念 一、操作系统 概念 任何计算机系统都包…

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题&#xff0c;适合食品机械、餐饮设备公司使用。 https://www.jianzh…

如何使用Docker搭建StackEdit编辑器并结合内网穿透实现远程办公

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

oms-Diffusion:用户可上传服装图片与参考姿势图进行试穿,解决服装行业高昂成本问题

之前已经向大家介绍了很多关于虚拟试穿的项目&#xff0c;如谷歌的Tryon Diffusion, 阿里的Outfit Anyone, 亚马的Diffuse to Choose。东京大学的OOTDiffusion虚拟服装试穿工具。基于扩散模型的技术基本已经成为现在主流应用的基石。感兴趣的小伙伴可以点点击下面链接阅读~ 电商…

GEE入门篇|图像处理(一):理论介绍

光谱指数是基于地球表面不同的物体和土地覆盖反射不同波长的不同数量的太阳光的事实。例如&#xff0c;在光谱的可见部分&#xff0c;健康的绿色植物反射大量的绿光&#xff0c;同时吸收蓝光和红光——这就是为什么它在我们的眼中是绿色的。来自太阳的光的波长也超出了人眼所能…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来&#xff0c;它的语义化其实是为了便于机器来看的&#xff0c;当然&#xff0c;程序员在使用语义化标签时也可以使得代码更加易读&#xff0c;对于用户来说&#xff0c;这样有利于构建良好的网页结构&#xff0c;可以在优化用户体…

Vue开发实例(四)Element-UI部分组件使用方法

Element-UI的使用 一、Icon图标的使用1、用 i 标签使用图标 二、用 el-button 使用图标1、使用type定义样式2、使用plain定义样式3、使用round定义样式4、使用circle定义样式5、带图标和文字的按钮6、按钮禁用7、文字按钮8、按钮组9、加载中 三、Link 文字链接1、基础用法2、禁…

LaTeX-设置表格大小

文章目录 LaTeX-设置表格大小1.创建表格2.设置表格的宽度2.1控制表格每一列的宽度2.2控制整个表格的宽度 3.设置表格的外观4.LaTeX绘制三线表 LaTeX-设置表格大小 本文介绍了LaTeX如何设置表格的大小、改变表格的外观以及如何绘制三线表。 1.创建表格 在LaTeX中创建表很耗时…

Springboot+vue的高校教师教研信息填报系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校教师教研信息填报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…

Hololens 2应用开发系列(1)——使用MRTK在Unity中设置混合现实场景并进行程序模拟

Hololens 2应用开发系列&#xff08;1&#xff09;——使用MRTK在Unity中进行程序模拟 一、前言二、创建和设置MR场景三、MRTK输入模拟的开启 一、前言 在前面的文章中&#xff0c;我介绍了Hololens 2开发环境搭建和项目生成部署等相关内容&#xff0c;使我们能生成一个简单Ho…

100个百万阅读公众号爆文案例

100个100万公众号爆文案例 自从公众号流量推送修改之后&#xff0c;原来的私域玩法一去不复返&#xff0c;公域公众号正在崛起 现在公众号的玩法就是找爆款&#xff0c;去对标&#xff0c;去学习&#xff0c;努力使自己的公众号进入流量池&#xff0c;然后吃流量主的收益 这里…