目录
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.生成效果如下