在线教育-谷粒学院项目(第一天)

前言

  • 需要掌握的知识点:循序渐进需要掌握以下知识
    在这里插入图片描述
两种比较常见的商业模式
  • B2C模式(在线教育就是使用的这种模式)
    两个角色:管理员 和 普通用户
    管理员:添加 删除 修改
    普通用户: 查询
  • B2B2C模式(商家到商家到用户,很多电商项目是这种模式)
    京东:普通用户:可以自营的 也可以买普通商家的

在线教育最核心的模块:课程模块

项目架构

b2c模式
项目分为两个部分:

  • 系统后台------管理员使用

    1. 讲师管理模块

    2. 课程分类管理模块

    3. 课程管理模块

      (1) 视频

    4. 统计分析模块

    5. 订单管理

    6. banner管理(幻灯片,轮播图)

    7. 权限管理

  • 系统前台------普通用户使用

    1. 首页数据显示

    2. 讲师列表和详情

    3. 课程列表和课程详情

      (1) 视频在线播放

    4. 登入和注册的功能

    5. 微信扫描登入

    6. 微信扫描支付功能

项目采用:前后端分类开发
后端技术
  • springboot
  • springcloud
  • MybatisPlus
  • spring security
  • redis
  • maven
  • easyExcel
  • jwt
  • OAuth2
前端技术
  • vue + element-ui + axios + node.js…
其他技术
  • 阿里云oss
  • 阿里云视频点播服务
  • 阿里云短信服务
  • 微信支付
  • docker
  • git
  • jenkins

MyBatis Plus入门

对mybatis做增强,简化开发

  1. 创建数据库,创建数据库表,添加数据,用于mp操作。

  2. 创建springboot 工程。

  3. 引入相关依赖

    springboot 和mp依赖

  4. 安装lombook插件(用于简化实体类)

  5. 创建application.properties文件并做相关配置。

  6. 写代码

1.spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver //驱动发生了改变,加了cj
2.spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8 //后面加了时区,这里表示东八区
3.spring.datasource.username=root
4.spring.datasource.password=123456
  • 实体类上面加注解@data,运用了lombok简化了实体类,省略了get、set方法。

  • 对于mapper,让它继承baomidouBaseMapper,就可以用里面的增删改查方法,就省略了xml文件。

  • springboot启动会找接口的实现类,但是我们这里的UserMapper没有实现类,所以要在启动类上面加入注解MapperScan,后面加入mapper包的地址,就可以扫描到了。

    7.配置日志

    配置了日志可以在终端查看sql语句等信息。

    #mybatis日志
    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImp
    

    编写addUser方法

    出现的问题:id自增并没有成功

    这里的id 是mp自动帮生成的一个十九位Long类型

自增策略
  • 自动增长 AUTO INCREMENT

    缺点:在分表中,对于下一张表,还需要知道上一张表的最后一 条记录,不是很方便,但功能都能实现

  • UUID 每次生成随机唯一的值

    优点:不用记录上一张的值

    缺点:无法排序

  • Redis生成ID

  • mp自带策略 snowflake算法

要更换id策略,则需要在id属性上面加上注解

在这里插入图片描述
在这里插入图片描述

如果idlong类型,则使用上面那个注解

如果idStirng类型,则需要使用下面那个注解

mp实现自动填充操作

第一步:在实体类里面进行自动填充属性添加注解

//表中字段,要驼峰命名法
@TableField(fill = FieldFill.INSERT)
private Date createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

第二步:创建类,实现接口MetaObjectHandler

// 使用mp实现添加操作,这个方法执行
@Override
public void insertFill(MetaObject metaObject) {
    // 三个参数,第一个属性名,第二个时间,第三个原数据对象(metaObject),相当于对原数据封装的对象
    this.setFieldValByName("createTime", new Date(), metaObject);
    this.setFieldValByName("updateTime", new Date(), metaObject);
}

// 使用mp的修改操作,这个方法执行
@Override
public void updateFill(MetaObject metaObject) {
    this.setFieldValByName("updateTime", new Date(), metaObject);
}

最后记得加入@Component交给Spring来管理

乐观锁

乐观锁:解决某些问题

主要解决 - 丢失更新

如果不考虑事务隔离性,产生读问题?

脏读 不可重复读 幻读

写问题:丢失更新

在这里插入图片描述

解决方案:

  • 悲观锁

    串行操作,只能等一个人更新完了,另一个人才能更新,效率很低

  • 乐观锁

    乐观锁实现方式:

    • 取出记录时,获取当前version
    • 更新时,带上这个version
    • 执行更新时, set version = newVersion where version = oldVersion
    • 如果version不对,就更新失败

mp简单查询

  1. 简单查询

    User user = userMapper.selectById(1409357082813071361L);

  2. 根据多个id查询

    List<User> users = userMapper.selectBatchIds(Arrays.asList(1L,2L,3L));

  3. 根据map进行查询(用的非常少)

    public void testSelectByMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "jack");
        map.put("age", 120);
        userMapper.selectByMap(map);
    }
    

mp分页查询

第一步: 配置分页插件

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

第二步:编写分页代码

直接new page对象,传入两个参数:

  • 当前页和每页显示记录数
  • 调用mp方法实现分页查询

逻辑删除

  1. 表添加逻辑删除字段,对应实体类添加属性 属性添加注解

在这里插入图片描述

  1. 配置逻辑删除插件
/**
* 逻辑删除插件
*/
@Bean
public ISqlInjector sqlInjector() {
    return new LogicSqlInjector();
}

执行删除语句我们可以看到底层执行语句

UPDATE user SET deleted=1 WHERE id=? AND deleted=0 

性能分析插件

/**
 * SQL 执行性能分析插件
 * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
 */
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
    performanceInterceptor.setFormat(true);
    return performanceInterceptor;
}

mp实现复杂查询

使用QueryWrapper建立查询

QueryWrapper<User> wrapper = new QueryWrapper<>();

1.ge、gt、le、lt、isNull、isNotNull

​ ge:大于等于

​ gt

2.eq、ne

​ eq:等于

​ ne:不等于

3.between、notBetween

4.allEq

5.like、notLike、likeLeft、likeRight

6.in、notIn、inSql、notinSql、exists、notExists

7.or、and

8.嵌套or、嵌套and

9.orderBy、orderByDesc、orderByAsc

10.last

11.指定要查询的列

12.set、setSql

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值