文章目录
一. 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是本地仓库的存放位置。
- 进入 “…m2\repository\org\springframework\boot\spring-boot-starter-parent” 目录,删除2.2.6文件夹下的缓存包,重新下载。
- 还是下载不成功的话,看下setting.xml是否使用了aliyun的镜像库,它没更新到2.2.6版本,注掉settings.xml中的aliyun mirror,或者降低版本,问题解决。(这里我将2.2.6降到了2.2.1)
2. 依赖引入
引入mysql、mybatis-plus及Lombok的依赖。其中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. 字段自动填充
表中的创建时间及修改时间字段,我们希望无需设置,能够自动填充。
- 在需要自动填充的字段上添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
- 创建一个类实现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中实现乐观锁有以下三个步骤:
- 在表中添加一个version字段;
- 在实体类中添加该字段,并添加@Version注解;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
- 在配置类中添加乐观锁的插件。
@Configuration
public class MPConfig {
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor () {
return new OptimisticLockerInterceptor();
}
}
注意:配置类通过 @Configuration 注解成为配置类,配置可以放在启动类中,也可以单独定义一个配置类进行存放。
5. MP实现分页查询
在说分页查询前,先说三个比较简单的查询:
1. selectById //通过id查询
2. selectByMap //通过Map查询,可实现条件查询
3. selectByBatchIds //通过id List查询
分页查询步骤:
- 在配置类中添加分页查询插件;
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
- 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实现逻辑删除
- 在数据库中添加一个is_del字段(默认1为删除);
- 在实体类中添加该字段,并添加注解 @TableLogic;
- 在配置类中添加逻辑删除插件:
//逻辑删除插件
@Bean
public ISqlInjector iSqlInjector() {
return new LogicSqlInjector();
}
- 此时通过 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);