栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

硅谷课堂笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

硅谷课堂笔记

硅谷课堂笔记
  • 1. Mybatis_plus复习
    • 1.1 简易使用***
    • 1.2 mybatis_plus日志
    • 1.3 mybatis_plus主键策略
    • 1.4 分页查询
    • 1.5 逻辑删除
    • 1.6 条件构造器
    • 1.7 Mp封装Server层***
    • 总结

1. Mybatis_plus复习

mybatis_plus是好久之前学习的,现在已经有点遗忘了,还好老师讲了一些知识点。

1.1 简易使用***

(1)导入mybatis_plus的依赖。
springboot对应的mybatis_plus依赖,一定要选带starter启动器的。


    com.baomidou
    mybatis-plus-boot-starter
    最新版本


     mysql
     mysql-connector-java

个人遇到的错误:
打开mybatis_plus首页发现最新版本,直接复制粘贴,后来一直报错,最后才发现引入的时spring对应的mybatis_plus依赖,不是springboot的。说多了都是泪呀

(2)配置文件配置数据库连接

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
    username: root
    password: 747699

上面在引入mysql依赖的时候没有表明是mysql5还是mysql8,所以会使用自己电脑的版本。
com.mysql.cj.jdbc.Driver 这里的cj表示默认使用mysql8的驱动。

(3)创建实体类User

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

(4)创建mapper接口类(核心)

@Mapper
public interface UserMapper extends BaseMapper {
}

@Mapper注解表示将我们的mapper注入到容器中。
每个自定义的mapper接口都要继承BaseMapper,< User >表示mapper接口操作的表,也可以理解为实体类。 BaseMapper是mybatis_plus为我们封装好了许多常用数据库操作函数。

(5)测试

@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired
    UserMapper userMapper;
    @Test
    void contextLoads() {
        List users = userMapper.selectList(null);
    }

}

其它相关操作mybatis_plus官方文档有相应介绍。

1.2 mybatis_plus日志

日志是方便我们在程序出现错误时,及时发现错误的原因。
在配置文件中设置开启

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

执行mybatis_plus插入操作时,控制台日志输出

1.3 mybatis_plus主键策略

通过@TableId注解实现,为什么说这是mybatis_plus主键策略呢,因为该注解的来源如下:
import com.baomidou.mybatisplus.annotation.TableId;
使用主键策略前提时,在数据库表中,将主键设置为自增。
主键策略如下所示:

NONE:该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)即默认策略。

AUTO:数据库ID自增。增加幅度为1。较为常用

INPUT:用户输入ID,该类型可以通过自己注册自动填充插件进行填充。

ASSIGN_ID:分配ID (主键类型为number或string),number类型较为常用,会默认为我们分配ID,也遵循自动增长原则,但是增长的幅度不确定。

ASSIGN_UUID:分配UUID (主键类型为 string) ,主键中一定包含字符,对于需要主键排序的情况不适用,所以不如ASSIGN_ID常用。
总结
一般在插入数据时,我们是不会设置主键值,所以此时主键策略起到了很大作用。一帮使用ASSIGN_ID或AUTO策略。
例如:在user类的主键加入逐渐策略

@TableId(type = IdType.ASSIGN_ID)
private Long id;

执行插入时,就可以不用设置主键值,系统会通过策略自动生成主键id。下面是一条插入示例

 void insert(){
        User user = new User();
        user.setAge(23);
        user.setEmail("mengfanxiaonb@gmail.com");
        user.setName("mfx");

        int insert = userMapper.insert(user);
        System.out.println(insert);
    }

执行两次插入操作:

可以发现两次的id都是随机的,但是有一个特点都是自增,但是增加的幅度不同。

1.4 分页查询

(1)配置分页插件配置文件,创建MpConfig配置类,Mp=Mybatis_plus。

@Configuration
public class MpConfig {
    
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

(2)分页查询
selectPage函数执行分页查询操作,两个参数:
Page:使用Page类设置起始页和每页数据条数,(1,3)表示第一页,每页包含三条数据。
QueryWrapper:查询条件,具体见官方文档。

Page userPage = userMapper.selectPage(new Page<>(1,3), null);
// 根据page查询到的数据
System.out.println(userPage.getRecords());
// 表中数据总条数
System.out.println(userPage.getTotal());
// 总页数
System.out.println(userPage.getPages());
// 每页大小
System.out.println(userPage.getSize());
// 是否有下一页
System.out.println(userPage.hasNext());
// 是否由前置页
System.out.println(userPage.hasPrevious());

结果如下

注意:如果不实现分页插件配置类,也可以查询,只是每次查询得到的结果都是所有数据。即能查询,不能分页查询。

1.5 逻辑删除

最初接触的删除操作是直接将数据库中数据删除,也可以成为物理删除。但是实际中使用的时逻辑删除,原理为修改操作。
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。

使用方法
(1)配置文件设置逻辑删除规则

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

(2)实体类添加逻辑删除字段,并添加逻辑删除注解

@TableLogic
private Integer deleted;

(3)数据库表中添加字段deleted
(4)测试
先插入数据

删除最后一条数据

逻辑删除成功,将最后一条数据的deleted字段设置为1.

再次执行查询所有数据操作

总结:逻辑删除并不会删除该条数据,只是在查询时无法查询而已,方便我们后续的数据恢复。

1.6 条件构造器

主要使用的有个类:QueryWrapper,LambdaQueryWrapper。

QueryWrapper较为简单,直接参考官方文档:QueryWrapper

LambdaQueryWrapper和QueryWrapper类似,但是支持Lambda表达式,较为新颖。

示例:
查询用户名为mfx的数据
QueryWrapper写法

 void query(){
        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("name","mfx");
        List users = userMapper.selectList(wrapper);
        System.out.println(users);

    }

LambdaQueryWrapper`写法

void lambdaQuery(){
        LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getName,"mfx");
        List users = userMapper.selectList(wrapper);
        System.out.println(users);

    }

而这唯一的区别就是在条件查询函数中第一个参数的书写形式不同。个人觉得LambdaQueryWrapper好用一些,不易出错。

注意:Mp提供的这些函数只适用于单表操作,当涉及到多表的复杂业务时需要xml文件mybatis实现。

1.7 Mp封装Server层***

Mp不仅对mapper实现了封装,也对server层进行了封装。
正常后端代码的步骤是:controller 层调用server层,server层调用mapper层。但是如果只是简单的单表增删改查,可以只是用server层实现,因为Mp对server层进行了封装。

(1)创建server接口,要继承IService,原理和mapper继承baseMapper相同

public interface UserServer extends IService {
}

(2)创建serverImp,@Service注入容器,要继承 ServiceImpl,并且实现server接口

@Service
public class UserServerImp extends ServiceImpl implements UserServer {
}


ServiceImpl继承了BaseMapper,并且实现了IService,所以本质上还是mapper对表的操作,只是Mp对server层的封装。我们可以直接使用server代替之前mapper对表的操作。

测试:

  @Autowired
    UserServer userServer;
    @Test
    void userServers(){
        List list = userServer.list();
        System.out.println(list);
    }

上面list是Mp为我们封装好的查询所有数据的方法,相当于mapper的selectList方法。

总结:
对于接口的实现,有两种方法。
(1)只是简单单表操作:在controller注入server,直接执行对数据库的操作。
(2)涉及到复杂操作,mybatis通过xml实现对表的操作,在server中注入mapper,在contorller中注入server,最后对数据库进行操作。
(3)Mp的意义就是要简化我们的操作和代码书写,但是只针对于简单的单表操作,正常开发中还是需要(2)中的步骤来实现一个接口。

总结

Mp特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
  • 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号