Day1-项目创建与MybatisPlus

一. springboot项目创建

1. 项目创建

项目使用IDEA进行搭建,首先创建一个新项目,选择【Spring Initializr】创建SpringBoot项目,之后一直下一步即可:
在这里插入图片描述
创建成功后,pom.xml中出现了这样的错误:
在这里插入图片描述

Failure to transfer org.springframework.boot:spring-boot-starter-parent:pom:2.2.6.RELEASE from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.2.6.RELEASE from/to central (https://repo.maven.apache.org/maven2): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

这看起来是jar包没有下载好,进入到maven配置:这里的setting file中配置的是依赖下载的地址,而lcoal repository是本地仓库的存放位置。
在这里插入图片描述

  1. 进入 “…m2\repository\org\springframework\boot\spring-boot-starter-parent” 目录,删除2.2.6文件夹下的缓存包,重新下载。
  2. 还是下载不成功的话,看下setting.xml是否使用了aliyun的镜像库,它没更新到2.2.6版本,注掉settings.xml中的aliyun mirror,或者降低版本,问题解决。(这里我将2.2.6降到了2.2.1)

2. 依赖引入

引入mysql、mybatis-plusLombok的依赖。其中mysql用于数据库连接,mybatis-plus用于数据库操作,lombok用于自动生成实体类的方法,简化代码:

<!-- 效率工具 -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus工具依赖 -->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.0.5</version>
</dependency>
<!-- mysql jdbc -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>

3. 配置application.properties文件

application.properties (或者yml文件) 配置数据库信息。最好为mysql设置一个密码,否则下面的密码不太好写(不能写 ‘’ ):

spring.datasource.url = jdbc:mysql://localhost:3306/mydb?serverTimezone=GMT%2B8
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.username = root
spring.datasource.password = 123456

二. MybatisPlus的使用

1. Mapper的创建

创建一个User entity,再创建一个mapper文件,这里说下mapper文件里的内容。直接extends BaseMapper就能对数据库进行基本的增删改查操作。(若需要自定义SQL语句,则还需要添加xml文件)

@Repository
public interface UserMapper extends BaseMapper<User> {
}

这样写了Mapper以后,由于它只是一个接口,没有具体的实现类,在项目启动时会报错,所以在启动类上要加一个MapperScan注解,标明mapper所在位置:
在这里插入图片描述
在application-properties文件中添加以下配置,将能看到sql执行的日志信息:

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

执行一个查询语句,日志显示如下:
在这里插入图片描述

2. 主键生成

一般的主键生成方式有自动生成、UUID(随机生成)、redis生成、及MP自带的生成方式。
在entity文件中,为id字段添加注解,即可实现主键的生成:

@TableId(type = IdType.AUTO) //自动生成
@TableId(type = IdType.ID_WORKER) //MP自带,12位
@TableId(type = IdType.UUID) //随机生成
private Long id;

3. 字段自动填充

表中的创建时间及修改时间字段,我们希望无需设置,能够自动填充。

  1. 在需要自动填充的字段上添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
  1. 创建一个类实现MetaObjectHandler接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

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

4. MP实现乐观锁

首先回忆一下悲观锁和乐观锁。悲观锁和乐观锁都是为了解决在并发情况下出现的 “写” 的问题。悲观锁通过串行方式解决,乐观锁通过添加一个版本号解决,提交事务时,比较当前版本号与数据库中该条数据的版本号是否一致,一致则修改,并且版本号加一,否则无法提交。

MP中实现乐观锁有以下三个步骤:

  1. 在表中添加一个version字段;
  2. 在实体类中添加该字段,并添加@Version注解;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
  1. 在配置类中添加乐观锁的插件。
@Configuration
public class MPConfig {
	//乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor () {
        return new OptimisticLockerInterceptor();
    }
}

注意:配置类通过 @Configuration 注解成为配置类,配置可以放在启动类中,也可以单独定义一个配置类进行存放。

5. MP实现分页查询

在说分页查询前,先说三个比较简单的查询:

 1. selectById //通过id查询
 2. selectByMap //通过Map查询,可实现条件查询
 3. selectByBatchIds //通过id List查询

分页查询步骤:

  1. 在配置类中添加分页查询插件;
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}
  1. new 一个Page对象,传入当前页和每页记录数,通过selectPage查询。
Page<User> page = new Page<>(1, 2);
//查询到的数据将自动封装在page对象里
userMapper.selectPage(page, null);
System.out.println(page.getRecords()); // 输出当前页记录
System.out.println(page.getPages()); //输出总页数
System.out.println(page.getTotal()); //总记录数
System.out.println(page.getCurrent()); //当前页数
System.out.println(page.getSize()); //当前页记录数

6. MP实现逻辑删除

  1. 在数据库中添加一个is_del字段(默认1为删除);
  2. 在实体类中添加该字段,并添加注解 @TableLogic
  3. 在配置类中添加逻辑删除插件:
  //逻辑删除插件
  @Bean
  public ISqlInjector iSqlInjector() {
      return new LogicSqlInjector();
  }
  1. 此时通过 selectById() 即可实现逻辑删除

注意:配置了逻辑删除以后,MP的查询操作会自动添加 is_del = 0 的条件,被逻辑删除的数据将不会被查出来。

7. 性能分析

MP还支持添加性能分析插件,能对sql语句的执行时间进行限制。

在配置类中添加:

//性能分析插件
@Bean
@Profile({"dev", "test"}) //设置插件起作用的环境
public PerformanceInterceptor performanceInterceptor() {
   PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
   performanceInterceptor.setMaxTime(100); //设置sql最大执行时间,超过不执行
   performanceInterceptor.setFormat(true);
   return performanceInterceptor;
}

在application.properties中添加:

#环境设置:dev、test、prod
spring.profiles.active=dev

8. wrapper条件查询

QueryWrapper<User> wrapper = new QueryWrapper<>();
// ge、gt、le、lt
wrapper.gt("age", 30);
// eq, ne
wrapper.eq("age", 30);
//like
wrapper.like("name", "la");
//between
wrapper.between("age", 10, 30);
//降序排列
wrapper.orderByDesc("age");
//拼接到sql语句最后
wrapper.last("limit 1");
//指定查询某列
wrapper.select("name", "age");
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值