乐趣区

关于java:京淘002

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
*   3
*   4
*   5

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` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9

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
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25
*   26
*   27
*   28

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
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25
*   26
*   27
*   28
*   29
*   30
*   31
*   32
*   33
*   34
*   35
*   36
*   37
*   38

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
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25
*   26
*   27
*   28
*   29
*   30
*   31
*   32
*   33
*   34
*   35
*   36
*   37

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
*   2
*   3
*   4
*   5
*   6

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
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18

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
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20

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
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25
*   26
*   27
*   28
*   29
*   30

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);
    }

}` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24

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>` 

*   1
*   2
*   3
*   4
*   5
*   6

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` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20

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.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);
    }
} 
退出移动版