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.1redis.port: 6379
2).为属性赋值
package com.jt.controller;import org.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic 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;importorg.springframework.context.annotation.PropertySource;importorg.springframework.web.bind.annotation.RequestMapping;importorg.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: testserver: port: 8090# 为Redis设定属性和属性值redis.host: 127.0.0.1redis.port: 6379# 通过---形式实现YML环境的宰割---spring: profiles: prod #2.4.0以下的写法server: port: 9000# 为Redis设定属性和属性值redis.host: 192.168.1.1redis.port: 7000
1.4 热部署配置
弊病: IDEA启动时特地消耗内存,如果配置了热部署,则卡上加卡 (本人决定)
1.4.1 增加jar包
<!--反对热部署 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId></dependency>`
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 入门案例测试
2.3MybatisPlus工作原理
ORM: 以对象的形式操作数据表
Sql:
- 数据库只能辨认Sql语句. 不能辨认对象
- 如果每天都写特地简略的Sql 没有任何价值.
外围原理:
- 利用注解去标识对象与表的映射关系 @TableName(“表名称”) 字段与属性的映射
- 将公共的接口办法进行抽取,抽取到公共接口中,如果须要应用只需继承即可. 注意事项:
- 操作对象时须要有专门的API实现对象与Sql的转化.最终交给Mybatis去执行.
例子: userMapper.insert(user对象)
Sql : insert into 表名(字段1,字段2,字段3…) values(值1,值2,值3…)
2.4 MybatisPlus入门案例
2.4.1 增加日志打印
2.4.2 入门案例
package com.jt;import com.baomidou.mybatisplus.core.conditions.query.Query;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.jt.mapper.UserMapper;import com.jt.pojo.User;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.Arrays;import java.util.List;import java.util.Map;@SpringBootTest //写测试类时如果须要从容器中动静的获取对象时应用class SpringbootDemo2ApplicationTests { @Autowired private UserMapper userMapper; @Test public void testMybatis01(){ List<User> userList = userMapper.findAll(); System.out.println(userList); } @Test public void testSelectList(){ //查问所有的数据 List<User> userList = userMapper.selectList(null); System.out.println(userList); } /** * 1.查问用户数据 * 1.1 依据id=51号数据 * Sql: select * from user where id=51 */ @Test public void select01(){ User user = userMapper.selectById(51) ; //依据主键查问 System.out.println(user); } /** * 2. name="王昭君"的用户 * Sql: select * from user where name="xxx" * 条件结构器:次要作用动静拼接where条件的 * 特殊符号: * 1. = eq, 2. > gt , 3. < lt * >= ge <=le */ @Test public void select02(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "王昭君"); List<User> userList = userMapper.selectList(queryWrapper); System.out.println(userList); } /** * 查问性别为男性,要求依照年龄降序排列 * Sql: select * from user where sex="男" order by age desc */ @Test public void select03(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("sex", "男") .orderByDesc("age"); List<User> userList = userMapper.selectList(queryWrapper); System.out.println(userList); } /** * 查问name中蕴含 "精"用户,依照年龄升序排序 * Sql: select * from user where name like "%精%" order by age asc * "%精" * "精%" */ @Test public void select04(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", "精") .orderByAsc("age"); List<User> userList = userMapper.selectList(queryWrapper); System.out.println(userList); } /** * 查问age>=18 and age<100 and sex=男性用户 * 默认的逻辑运算符and */ @Test public void select05(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.between("age", 18, 100) .eq("sex", "男"); /*queryWrapper.ge("age", 18) .lt("age", 100) .eq("sex", "男");*/ List<User> userList = userMapper.selectList(queryWrapper); System.out.println(userList); } /** * 查问id= 1,3,5,6,7的用户 * 查问name="黑熊精/白龙驴/大乔" */ @Test public void select06(){ Integer[] ids = {1,3,5,6,7}; List idList = Arrays.asList(ids); //转化时须要应用包装类型 List<User> userList = userMapper.selectBatchIds(idList); System.out.println(userList); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.in("name", "黑熊精","白龙驴","大乔"); List<User> userList2 = userMapper.selectList(queryWrapper); System.out.println(userList2); } /** * 查问 id,name 全副用户信息 */ @Test public void select07(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.select("id","name"); List<User> userList = userMapper.selectList(queryWrapper); System.out.println(userList); List<Map<String,Object>> userMap = userMapper.selectMaps(queryWrapper); System.out.println(userMap); } @Test public void insert(){ User user = new User(); user.setId(null).setName("嫦娥5号") .setAge(5).setSex("女"); userMapper.insert(user); }}