Spring Boot学习

目录

SpringBoot简介

整合第三方技术

springboot整合MyBatis-plus

基础使用MyBatis-plus

标准数据层开发

MP分页查询功能

DQL编程控制

DML编程控制

乐观锁

代码自动生成 


SpringBoot简介

SpringBoot概述
●SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
●Spring程序缺点
     ■配置繁琐
     ■依赖设置繁琐
●SpringBoot.程序优点
     ■自动配置
     ■起步依赖(简化依赖配置)
     ■辅助功能(内置服务器,…)

配置格式

●三种配置文件

        ●application.properties

        ●application.yml

        ●application.yaml
●SpringBoot配置文件加载顺序(了解)
        application.properties >application.yml >application.yaml

yaml
●YAML(YAML Ain't Markup Language),一种数据序列化格式
●优点:
        ●容易阅读
        ●容易与脚本语言交互
        ●以数据为核心,重数据轻格式
●YAML文件扩展名
        ●ym1(主流)
        ●yaml

yaml语法规则
●大小写敏感
●属性层级关系使用多行描述,每行结尾使用冒号结束
●使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tb键)
●属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
●#表示注释

yaml数据读取

●使用@Va1ue读取单个数据,属性名引用方式:${一级属性名.二级属性名…}


●封装全部数据到Environment.对象

●自定义对象封装指定数据

 自定义对象封装数据警告解决方

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

多环境启动

 

properties文件多环境启动
●主启动配置文件application.properties
        spring.profiles.active=pro
●环境分类配置文件application-pro.properties
        server.port=80
●环境分类配置文件application-.dev.properties
        server.port=81
●环境分类配置文件application-test.properties
        server.port=82

配置文件分类

●SpringBoot中4级配置文件
        1级:file:config/application.yml  【最高】
        2级:file:application.yml
        3级:classpath:config/application.yml
        4级:classpath:application.yml  【最低】
●作用:
        ●1级与2级留做系统打包后设置通用属性
        ●3级与4级用于系统开发阶段设置通用属性

整合第三方技术

SpringBoot整合MyBatis
①:创建新模块,选择Spring初始化,并配置模块相关基础信息

 ②:选择当前模块需要使用的技术集(MyBatis、MySQL)

 ③:设置数据源参数

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/chj?serverTimezone=UTC
    username: root
    password: root

注意事项
SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区
        jdbc:mysql://localhost:3306/chj?serverTimezone=UTC
或在MySQL数据库端配置时区解决此问题

⑤:测试类中注入dao接口,测试功能

@SpringBootTest
class Springboot08MybatisApplicationTests{
    @Autowired
    private BookDao bookDao;
    @Test
    public void testGetById(){
        Bookbook bookDao.getById(1);
        System.out.println(book);}
}

springboot整合MyBatis-plus

基础使用MyBatis-plus

1导入坐标

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

2.mapper继承BaseMapper

@Mapper
public interface BookMapper extends BaseMapper<Book> {
}

3.service继承IService,Impl继承ServiceImpl实现service接口

public interface BookService extends IService<Book> {
}
@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService {
}

4.注入service调用方法即可

    @Autowired
    private BookService bookService;
    @Test
    void contextLoads() {
        Book byId = bookService.getById(2);
        System.out.println(byId);}

标准数据层开发

标准数据层CRUD功能

功能自定义接口MP接口
新增boolean save(T t)int insert(T t )
删除boolean delete(int id)int deleteById(Serializable id)
修改boolean update(Tt)int updateById(Tt)
根据id查询T getById(int id)T selectById(Serializable id)
查询全部List<T>getAll()List<T>selectList()
分页查询PageInfo<T>getAll(int page,int size)IPage<T>selectPage(IPage<T>page)
按条件查询List<T>getAll(Condition condition)IPage<T>selectPage(Wrapper<T>queryWrapper)

lombok
Lombok,一个]ava类库,提供了一组注解,简化pojo实体类开发

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>
import lombok.Data;

@Data
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
    private String image;
}

MP分页查询功能

①:设置分页拦截器作为Spring管理的bean

@Configuration
public class MpCongfig{
    @Bean
    public MybatisPlusInterceptor pageInterceptor(){
        MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

②:执行分页查询

IPage page new Page(2,3);
userDao.selectPage(page,null);
System.out.printIn("当前页码:"+page.getCurrent());
System.out.printIn("每页数据总量:"+page.getsize();
System.out.printIn("总页数:"+page.getPages());
System.out.printIn("数据总量:"+page.getTotal());
System..out,println("当前页数据:"+page.getRecords());

开启日志

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

DQL编程控制

条件查询
        ●MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

条件查询一设置查询条件
 格式一:常规格式

QueryWrapper<User>qw = new QueryWrapper<User>();
/查询年龄大于等于18岁,小千65岁的用户
qw.lt("age",65);
qw.ge("age",18);
List<User>userList= userDao.selectList(qw);
System.out.println(userList);

格式二:链式编程格式

QueryWrapper<User>qw = new QueryWrapper<User>();
//查询年龄大于等于18岁,小于65岁的用户
qw.lt("age",65).ge("age",18);
List<User>userList = userDao.selectList(qw);
System.out.println(userList);

格式三:lambda格式(推荐)

QueryWrapper<User>qw = new QueryWrapper<User>();
//查询年龄大于等于18岁,小于65岁的用户
qw.lambda().lt(User:getAge,65).ge(User:getAge,18);
List<User>userList = userDao.selectList(qw);
System.out.println(userList);

格式四:lambda格式(推荐)

LambdaQueryWrapper<User>lqw =new LambdaQueryWrapper<User>();
//查询年龄大于等于18岁,小于65岁的用户
lqw.lt(User:getAge,65).ge(User:getAge,18);
List<User>userList = userDao.selectList(lqw);
System.out.println(userList); 

条件查询一null值处理 

条件参数控制

    @Test
    public void testQueryMapper(){
        Book book=new Book();
        book.setName("java");
        LambdaQueryWrapper<Book> lqm=new LambdaQueryWrapper<>();
        //判断book的name属性是否为空,不为空模糊查询name有java的数据为空查询所有
        lqm.like(book.getName()!=null,Book::getName,book.getName());
        List<Book> list = bookService.list(lqm);
        System.out.println(list);
    }

查询投影

●查询结果包含模型类中部分属性

         LambdaQueryWrapper<Book> lqm=new LambdaQueryWrapper<>();
        lqm.select(Book::getName,Book::getType);
        List<Book> list = bookService.list(lqm);
        System.out.println(list);

        输出sql语句为SELECT name,type FROM book

●查询结果包含模型类中未定义的属性

        QueryWrapper<Book> lqm1 = new QueryWrapper<>();
        lqm1.select("count(*) as count,type");
        lqm1.groupBy("type");
        List<Map<String, Object>> maps = bookMapper.selectMaps(lqm1);
        System.out.println(maps);

输出sql语句为SELECT count(*) as count,type FROM book GROUP BY type 按组统计总数
查询条件设定

●范围匹配(>、=、between)
●模糊匹配(like)
●空判定(null)
●包含性匹配(in)
●分组(group)
●排序(order)
●......

用户登录(eq匹配)

LambdaQueryWrapper<User>lqw =new LambdaQueryWrapper<User>();
lqw.eq(User:getName,userQuery.getName()).eq(User:getPassword,userQuery.getPassword());
User loginUser= userDao.selectone(lqw);
System.out.println(loginUser);

购物设定价格区间、户籍设定年龄区间(le ge匹配或between匹配)

LambdaQueryWrapper<User> lqw =new LambdaQueryWrapper<User>();
/1方案一:设定上限下限
lqw.le(User:getAge,userQuery.getAge()).ge(User:getAge,userQuery.getAge2());
/1方案二:设定范围
lqw.between(User:getAge,userQuery.getAge(),userQuery.getAge2());
List<User>userList = userDao.selectList(lqw);
System.out.println(userList);

●字段映射与表名映射

名称:@TableField
●类型:属性注解
●位置:模型类属性定义上方
●作用:设置当前属性对应的数据库表中的字段关系
●范例:

public class User{
    @TableField(value="pwd",select=false)
    private String password;
    @TableField(exist=false)
    private String online;

}

●相关属性
        ◆value:设置数据库表字段名称
        ◆exist:设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用     

        ◆select:设置属性是否参与查询,此属性与select()映射配置不冲突

名称:@TableName
●类型:类注解
●位置:模型类定义上方
●作用:设置当前类对应与数据库表关系
●范例:

@TableName("tbl_user")
public class User{
    private Long id;
}

DML编程控制

id生成策略控制
●名称:@TableId
●类型:属性注解
●位置:模型类中用于表示主键的属性定义上方
●作用:设置当前类中主键属性的生成策略
●范例:

public class User{
    @TableId(type IdType.AUTO)
    private Long id;}

●相关属性
    ◆value:设置数据库主键名称
    ◆type:设置主键属性的生成策略,值参照IdType枚举值

    id生成策略控制
       ●AUTO(0):使用数据库id自增策略控制id生成
       ● NONE(1):不设置id生成策略
       ●INPUT(2):用户手工输入id
       ●ASSIGN ID(3):雪花算法生成id(可兼容数值型与字符串型)
       ●ASSIGN UUID(4):以UUID生成算法作为id生成策略

全局配置

mybatis-plus:
    global-config:
        db-config:
            id-type: auto
            table-prefix: tbl_

逻辑删除

       ●删除操作业务问题:业务数据从数据库中丢弃
       ●逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中
①:数据库表中添加逻辑删除标记字段

 ②:实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

public class User{
    private Long id;
    @TableLogic
    private Integer deleted;
}

③:配置逻辑删除字面值

mybatis-plus:
    global-config:
        db-config:
            logic-delete-field: deleted
            logic-not-delete-value: 0
            logic-delete-value: 1

执行SQL语句会变成:
        UPDATE tbl_user SET deleted=1 WHERE id=?AND deleted=0

乐观锁

●业务并发现象带来的问题:秒杀

①:数据库表中添加锁标记字段

 ②:实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

public class User{
    private Long id;
    @Version
    private Integer version;
}

③:配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装

@Configuration
public class MpConfig{
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        MybatisPlusInterceptor mpInterceptor new MybatisPlusInterceptor();
        mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mpInterceptor;}
}

④:使用乐观锁机制在修改前必须先获取到对应数据的verion方可正常进行

@Test
void testUpdate(){
    //先查询数据,获取version.数据
    User user userDao.selectById(1L);
    //执行数据修改操作
    user.setName("Tom and Jerry");
    userDao.updateById(user);}

执行修改前先执行查询语句:
        SELECT id,name,age,tel,deleted,version FROM tbl_user WHERE id=?
执行修改时使用version字段作为乐观锁检查依据
        UPDATE tbl_user SET name=?,age=?,tel=?,version=?WHERE id=?AND version=?

代码自动生成 

●使用mybatis-plus-generator自动生成代码

1.导入坐标

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

2.创建代码生成器对象生成代码

public class CodeGenerator {
    public static void main(String[] args) {
        AutoGenerator autoGenerator=new AutoGenerator();
        DataSourceConfig dataSource=new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/chj?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);
        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir("F:\\java后端\\projects\\mybatisplus_generator\\src\\main\\java");    //设置代码生成位置
        globalConfig.setOpen(false);    //设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("");    //设置作者
        globalConfig.setFileOverride(true);     //设置是否覆盖原始生成的文件
        globalConfig.setMapperName("%sDao");    //设置数据层接口名,%s为占位符,指代模块名称
        globalConfig.setIdType(IdType.ASSIGN_ID);   //设置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);

        //设置包名相关配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.chj");   //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
        packageInfo.setEntity("domain");    //设置实体类包名
        packageInfo.setMapper("dao");   //设置数据层包名
        autoGenerator.setPackageInfo(packageInfo);

       /* //策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("tbl_user");  //设置当前参与生成的表名,参数为可变参数
        strategyConfig.setTablePrefix("tbl_");  //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    //设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version");  //设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  //设置是否启用lombok
        autoGenerator.setStrategy(strategyConfig);*/
        //2.执行生成操作
        autoGenerator.execute();
    }
}

●使用idea插件easycode生成代码

1.安装插件

2.连接数据库

 3.选择数据库

 4.选择表右键选择EasyCode点击Generate Code

 5.选择生成在哪个包下,勾选需要的类点ok

 6.生成效果如下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值