关于springboot:cgb2008京淘day02

  1. SpringBoot高级用法

1.1 对于配置文件阐明

1.1.1 properties文件阐明

1.语法: k-v构造 key=value
2.数据类型: 默认是String数据类型 不要增加多余的””号
3.字符数据类型: properties的默认的加载的编码格局为ISO-8859-1 所以增加中文是须要字符转意.
4.毛病: 所有的key都必须手动的编辑 没有方法复用 所以引入了yml配置

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.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 的根底上只做加强不做扭转,为简化开发、提高效率而生。

个性

无侵入:只做加强不做扭转,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会主动注入根本 CURD,性能根本无损耗,间接面向对象操作
弱小的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过大量配置即可实现单表大部分 CRUD 操作,更有弱小的条件结构器,满足各类应用需要
反对 Lambda 模式调用:通过 Lambda 表达式,不便的编写各类查问条件,无需再放心字段写错
反对主键主动生成:反对多达 4 种主键策略(内含分布式惟一 ID 生成器 – Sequence),可自在配置,完满解决主键问题
反对 ActiveRecord 模式:反对 ActiveRecord 模式调用,实体类只需继承 Model 类即可进行弱小的 CRUD 操作
反对自定义全局通用操作:反对全局通用办法注入( Write once, use anywhere )
内置代码生成器:采纳代码或者 Maven 插件可疾速生成 Mapper 、 Model 、 Service 、 Controller 层代码,反对模板引擎,更有超多自定义配置等您来应用
内置分页插件:基于 MyBatis 物理分页,开发者无需关怀具体操作,配置好插件之后,写分页等同于一般 List 查问
分页插件反对多种数据库:反对 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能剖析插件:可输入 Sql 语句以及其执行工夫,倡议开发测试时启用该性能,能疾速揪出慢查问
内置全局拦挡插件:提供全表 delete 、 update 操作智能剖析阻断,也可自定义拦挡规定,预防误操作

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:

  1. 数据库只能辨认Sql语句. 不能辨认对象
  2. 如果每天都写特地简略的Sql 没有任何价值.

外围原理:

  1. 利用注解去标识对象与表的映射关系 @TableName(“表名称”) 字段与属性的映射
  2. 将公共的接口办法进行抽取,抽取到公共接口中,如果须要应用只需继承即可. 注意事项:
  3. 操作对象时须要有专门的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.QueryWrapper;
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.Arrays;
import java.util.List;
import java.util.Map;
@SpringBootTest //写测试类时如果须要从容器中动静的获取对象时应用
class Demo02ApplicationTests {
   @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.查问用户数据,依据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 4.>= ge 5.<=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=男
 */
 @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> userList1=userMapper.selectList(queryWrapper);
      System.out.println(userList1);
   }
   /**
 * 查问 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);
   }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理