1. SpringBoot高级用法
1.1 关于配置文件说明
1.1.1 properties文件说明
1.语法 1. key=value 结构
2.pro中的属性-值默认条件下都是String类型 不需要添加引号
1.1.2 YML文件说明
#语法
# 1. 数据结构 key: value 使用:(空格)链接
# 2. YML文件中有文件父子级结构 采用缩进的方式实现.
server:
port: 8090
1.2 为属性赋值
1.2.1 业务需求
有时需要动态的获取属性的值,如果直接写到代码中需要重新打包编译,代码的耦合性较高.
能否利用配置文件的方式,动态的为属性赋值?
1.2.2 YML方式为属性赋值
1).编辑YML配置文件
#语法
# 1. 数据结构 key: value 使用:(空格)链接
# 2. YML文件中有文件父子级结构 采用缩进的方式实现.
server:
port: 8090
# 为Redis设定属性和属性值
redis.host: 127.0.0.1
redis.port: 6379
2).为属性赋值
package com.jt.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RedisController {
/**
* 当程序启动时,会自动的加载YML配置文件,将数据保存到Spring的内部.
* 之后通过${key}(spel表达式)进行数据的取值.
*/
@Value("${redis.host}")
private String host; // = "127.0.0.1";
@Value("${redis.port}")
private int port; // = 6379;
@RequestMapping("/getNode")
public String getNode(){
return host + ":" + port;
}
}
1.2.3 指定配置文件为属性赋值
1).定义properties文件
2).编辑RedisController
package com.jt.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
//指定配置文件进行加载
@PropertySource("classpath:/properties/redis.properties")
public class RedisController {
/**
* 当程序启动时,会自动的加载YML配置文件,将数据保存到Spring的内部.
* 之后通过${key}(spel表达式)进行数据的取值.
* 1.通过YML方式赋值
*
*/
@Value("${redis.host}")
private String host; // = "127.0.0.1";
@Value("${redis.port}")
private int port; // = 6379;
//2.通过pro方式赋值
@Value("${redis2.host}")
private String host2;
@Value("${redis2.port}")
private int port2;
@RequestMapping("/getNode")
public String getNode(){
return "YML取值方式"+host + ":" + port+"| " +
"pro取值方式:"+host2+":"+port2;
}
}
1.2.4 如果YML和Properties属性重名以谁为准?
答: YML方式为准, 注意事项:属性最好不要重复.
1.3 环境切换
1.3.1 业务需求
如果小李进入外包公司,需要频繁切换不同的工作地点.由于公司的环境配置非常繁琐,每次切换小李都需要修改大量的配置文件,问: 能否优化?
1.3.1 实现多环境配置
#挑选执行环境 SpringCloud微服务配置 N多个YML配置文件 配置中心
spring:
profiles:
active : test
--- #环境分割线
#语法
# 1. 数据结构 key: value 使用:(空格)链接
# 2. YML文件中有文件父子级结构 采用缩进的方式实现.
#定义环境名称 2.4.0版本需要如下的格式
spring:
config:
activate:
on-profile: test
server:
port: 8090
# 为Redis设定属性和属性值
redis.host: 127.0.0.1
redis.port: 6379
# 通过---方式实现YML环境的分割
---
spring:
profiles: prod #2.4.0以下的写法
server:
port: 9000
# 为Redis设定属性和属性值
redis.host: 192.168.1.1
redis.port: 7000
1.4 热部署配置
弊端: IDEA启动时特别耗费内存,如果配置了热部署,则卡上加卡 (自己决定)
1.4.1 添加jar包
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
- 1
- 2
- 3
- 4
- 5
1.4.2 IDEA配置
组合键: ctrl + alt+shift + /
1.5 关于LOMBOK复习
1.5.1 添加jar包
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
1.5.3 面试问题
问:如果项目需要在Linux系统中运行,问系统是否需要提前安装LomBok插件?
A.需要 B.不需要
答案: B 不需要
原因: LOMBOK插件在编译期有效. 由.java文件编译为.class文件时生效.
1.5 SpringBoot整合Mybatis
1.5.1 导入jar包
<!--添加数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--springBoot整合jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--springBoot整合mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
1.5.2 编辑YML配置文件
1).关于URL说明
serverTimezone=GMT%2B8& %2B=+ 设定时区
useUnicode=true&characterEncoding=utf8& 设定字符集编码格式
autoReconnect=true& 如果链接中断是否自动重连
allowMultiQueries=true 是否允许批量操作.
2).YML文件配置
server:
port: 8090
servlet:
context-path: / #项目根目录发布
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
# Spring整合Mybatis配置
mybatis:
type-aliases-package: com.jt.pojo
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
1.5.3 编辑Mapper.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 唯一确定Mapper接口的 一定不能重复-->
<mapper namespace="com.jt.mapper.UserMapper">
<!--定义别名包 type-aliases-package: com.jt.pojo
在程序执行时,如果定义了别名包则会自动的拼接路径
resultType="com.jt.pojo.User"
规则: 1.如果根据别名找不到则根据自己的定义查询类型
-->
<select id="findAll" resultType="User">
select * from user
</select>
<!--
开启驼峰映射规则的说明
说明:属性user_id 根据驼峰命名规则应该叫userId
例子:
1.user表: user_id user_name user_age
2.User对象: userId, userName userAge 驼峰命名规则
只要开启驼峰映射规则,则Mybatis会自动的完成映射.
原理:
user_id(字段) ~~~去除中间的"_"线之后首字母大写 userId
将数据映射给属性userId(属性)
注意事项:一旦开启驼峰映射规则,则必须按照要求来写.
-->
</mapper>
1.5.4 入门案例测试
package com.jt;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest //写测试类时如果需要从容器中动态的获取对象时使用
class SpringbootDemo2ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testMybatis01(){
List<User> userList = userMapper.findAll();
System.out.println(userList);
}
}
2.MybatisPlus
2.1 ORM思想介绍
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
核心: 采用对象的方式操作数据库.
思考:
userMapper.insert(user对象) ~~~~~剩余的入库sql由框架自动完成!!!
2.2 MybatisPlus介绍
2.2.1 介绍
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2.2.2 引入jar包
<!--SpringBoot整合MybatisPlus mybatis和plus jar包冲突的-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2.2.3 编辑POJO对象
2.2.4 Mapper接口继承
2.2.5 修改YML配置
server:
port: 8090
servlet:
context-path: / #项目根目录发布
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
# Spring整合Mybatis-plus配置
mybatis-plus:
type-aliases-package: com.jt.pojo
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
- 2.2.6 入门案例测试
//1.查询用户id=51的数据
@Test
void select01(){
User user = userDao.selectById(51);
System.out.println(user);
}
//2.查询name=王昭君的数据
//条件构造器:动态拼接where条件的
//特殊符号= eq,> gt,< lt,>= ge,<= le
@Test
void select03(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("name", "王昭君");
List<User> user = userDao.selectList(queryWrapper);//括号里是一个条件构造器
System.out.println(user);
}
//3.sex=男的数据降序查询
@Test
void select04(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("sex", "男").orderByDesc("age");
List<User> user = userDao.selectList(queryWrapper);//括号里是一个条件构造器
System.out.println(user);
}
//4.查询name中包含"精"用户,按照年龄升序排序
@Test
void select05(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.like("name", "精").orderByAsc("age");
List<User> user = userDao.selectList(queryWrapper);//括号里是一个条件构造器
System.out.println(user);
}
//5.查询age>=18 age<100 男性用户
@Test
void select06(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.between("age", 18, 100).eq("sex", "男");
//queryWrapper.ge("age","18").lt("age","100").eq("sex","男");
List<User> user = userDao.selectList(queryWrapper);//括号里是一个条件构造器
System.out.println(user);
}
//6.查询id=1,3,5,7的用户
@Test
void select07(){
Integer [] ids={1,3,5,7};
List idList= Arrays.asList(ids);//转的是对象
List<User> users = userDao.selectBatchIds(idList);
System.out.println(users);
}
//7.查询name="黑熊精/大乔"
@Test
void select08(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.in("name", "黑熊精","大乔");
List<User> users = userDao.selectList(queryWrapper);
System.out.println(users);
}
//8.查询id和name的全部用户信息
@Test
void select09(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.select("id","name");
List<User> users = userDao.selectList(queryWrapper);
System.out.println(users);
List<Map<String, Object>> maps = userDao.selectMaps(queryWrapper);
System.out.println(maps);
}
//9.删除指定id=51
@Test
public void delete10(){
int i = userDao.deleteById(51);
}
//10.删除多个id=52,53
@Test
public void deleteids11(){
Integer a[]={52,53};
List<Integer> ints = Arrays.asList(a);//将数组转换成对象
int i = userDao.deleteBatchIds(ints);
}
//11.将id=50数据名字改为火星5号
@Test
public void upadate12(){
User u=new User();
u.setName("火星5号").setId(50);
userDao.updateById(u);
}
//12.将火星五号数据改为太阳5号 ,age改为1000
@Test
public void upadate13(){
User u=new User();
u.setName("太阳5号").setAge(1000);
UpdateWrapper<User> objectUpdateWrapper = new UpdateWrapper<>();
objectUpdateWrapper.eq("name","火星5号");
userDao.update(u,objectUpdateWrapper);
}
//13.新增信息 李白 25 男
@Test
public void upadate14(){
User u=new User();
u.setId(null).setName("李白").setAge(25).setSex("男");
userDao.insert(u);
}
}