乐趣区

关于java:第四阶段笔记-Jingtaoday02

day 02 SpringBoot 高级用法,整合 MyBatis

此文档是依据上课操作流程进行的整顿,更多细节和图片请参见刘老师的专栏

一. SpringBoot 高级用法
  1. 对于配置文件的阐明

    i. application.properties

    ​ 语法:key = value,属性 - 值默认条件下都是 String 类型,不须要增加引号

    ii. yml 文件文件阐明

    ​ 语法:key:value,yml 文件中有文件父子级成果,采纳缩进的形式实现

  2. 为属性赋值

    i. 创立 RedisController

    @RestController
    public class RedisController {
        private String host = "127.0.0.1";
        private int port = 6379;
    
        @RequestMapping("/getNode")
        public String getNode(){return host+":"+port;}
    }

    ​ 业务需要:有时须要动静获取属性的值,如果间接写到代码中,须要从新打包编译,代码的耦合性高。是否利用配置文件的形式动静的为属性赋值?

    ​ ii. yml 形式为属性赋值

    ​ 1) 编辑 yml 配置文件;2) 为属性赋值 @value(“”)

    == application.yml ===
    # 为 Redis 设定属性和属性值
    redis.host: 127.0.0.1
    redis.port: 6379
    == RedisController.java ===
    /* 当程序启动时, 会主动加载 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;}

    iii. 指定配置文件为属性赋值

    ​ 1) 定义 properties 文件; 2) 编辑 RedisController

    === properties/redis.properties ===
    # 个别的业务数据须要独立的配置文件为属性赋值
    redis2.host = 192.168.126.129
    redis2.port = 7000
    === RedisController ===
    // 指定配置文件进行加载
    @PropertySource("classpath:/properties/redis.properties")
    ...
    @Value("${redis2.host}")
    private String host2 /*= "127.0.0.1"*/;
    @Value("${redis2.port}")
    private int port2 /*= 6379*/;
    
    @RequestMapping("/getNode")
    public String getNode(){return "YML 取值形式:"+host+":"+port+"<br>PRO 取值形式:"+host2+":"+port2;}

    iv. 如果 yml 和 properties 属性重名,以谁为准?

    ​ 答:以 yml 形式为准,注意事项:属性尽量不要反复

  3. 环境切换

    i. 业务需要

    ​ 如果小李进入了一个外包公司,须要频繁切换不同的工作地点。因为公司的环境配置十分的繁琐,每次切换小李都须要批改大量的配置文件,问是否优化?

    ii. 实现多环境切换

    # 通过 --- 形式实现 yml 环境的宰割
    ---
    # 定义环境的名称
    spring:
      profiles: prod
    
    server:
      port: 9000
    
    # 为 Redis 设定属性和属性值
    redis.host: 114.114.114.1
    redis.port: 7000
    # 筛选执行的环境 SpringCloud 微服务配置 N 多个 yml 配置文件 配置核心
    spring:
      profiles:
        active: prod
  4. 热部署配置

    ​ 弊病:IDEA 启动时特地消耗内存,如果配置了热部署,则卡上加卡。

    i. 增加 jar 包

    <!-- 反对热部署 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

    ii. IDEA 配置

    ​ 组合键:ctrl + alt + shift + /

  5. Lombok

    i. 增加 jar 包

    <!-- 引入插件 lombok 主动的 set/get/ 构造方法插件  -->
    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
    </dependency>

    ii. 创立 pojo 对象

    @Data  //get/set/toString(只能打印本人的属性, 不能输入父类的属性, 如想获取 getXXX)/equals 等办法
    @NoArgsConstructor // 无参结构
    @AllArgsConstructor // 全参结构
    @Accessors(chain = true) // 链式加载规定
    public class User extends Parent {
        //pojo 实体类型中属性类型必须为包装类
        private Integer id; //private int id;
        private String name;
        private Integer age;
        private String sex;
    }

    iii. 面试问题:如果咱们的我的项目须要在 Linux 零碎中运行,零碎是否须要提前装置 Lombok 插件?

    ​ 答:不须要,因为 Lombok 插件在编译期无效。由.java 文件编译为.class 文件时失效。

二. SpringBoot 整合 MyBatis
  1. 在我的项目中引入 MyBatis

    i. 增加 jar 包 (3 个)

    <!-- 引入数据库驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
        <version>5.1.32</version>
    </dependency>
            
    <!--springBoot 数据库连贯  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!--spring 整合 mybatis  临时  -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>

    ii. 编辑 yml 配置文件

    ​ 1) 对于 url 的阐明:

    ​ 设定时区 %2B = + & 设定字符集编码格局 & 如果连贯中断是否重连 & 是否容许批量操作

    === application.yml ===
    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
    
    mybatis:
      # 类型别名包
      type-aliases-package: com.jt.demo.pojo
      mapper-locations: classpath:/mybatis/mappers/*.xml
      # 开启驼峰映射
      configuration:
        map-underscore-to-camel-case: true

    ​ 2) 驼峰映射规定

    <!-- 开启驼峰映射规定的阐明
       字段名 user_id 依据驼峰命名的规定应该叫 userId
       例子:
         1.user 表: user_id user_name user_age
         2.User 对象:userId userName userAge
       只有开启驼峰映射规定,Mybatis 会主动实现映射
       原理:
          user_id(字段)- 去除下划线 -userid- 首字母大写 -userId(属性)
       注意事项:
          一旦开启了驼峰映射, 必须依照要求来写
    -->
    <select id=""resultMap="userRM">
       SELECT * FROM user
    </select>
    <resultMap id="userRM" type="user">
       <id column="user_id" property="userId"/>
       <result column="user_name" property="userName"/>
       <result column="user_age" property="userAge"/>
    </resultMap>

    iii. 编写 MyBatis 测试方法

    @Autowired
    private UserMapper userMapper;
    @Test
    public void testMyBatis01(){List<User> list = userMapper.findAll();
       System.out.println(list);
    }
三. SpringBoot 整合 MyBatisPlus

​ 以对象形式操作数据库,单表操作不须要写 SQL 语句。

  1. ORM 思维

    对象关系映射 – Object Relational Mapping

    外围:采纳对象的形式操作数据库

    思考:userMapper.insert(User 对象) — 残余的入库 SQL 由框架主动实现

  2. MyBatisPlus

    i. 介绍

    ​ 参见官网《简介 | MyBatis-Plus》

    ii. 引入 jar 包

    <!--spring 整合 mybatis-plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.2.0</version>
    </dependency>

    iii. 编辑 pojo 对象

    //1. 实现对象与表的映射
    @TableName(value = "user") // 如果表名与对象名称统一, 能够省略
    public class User{
        //pojo 实体类型中属性类型必须为包装类
        //2. 设定主键自增
        @TableId(type = IdType.AUTO)
        private Integer id; //private int id;
        //@TableField("name") 如果数据库的字段与属性名称统一, 则能够省略不写
        private String name;
        private Integer age;
        private String sex;
    }

    iv. Mapper 接口继承

    @Mapper // 将 Mapper 接口交给 spring 治理, 为其创立代理对象 CGLIB
    public interface UserMapper extends BaseMapper<User> {...}

    v. 批改 yml 配置

    mybatis-plus:
      # 类型别名包 

    vi. 编写配置办法

    @Test
    public void testMyBatisPlus01(){
       // 查问所有的数据
       List<User> userList = userMapper.selectList(null);
       System.out.println(userList);
    }
  3. MyBatisPlus 工作原理

    ​ ORM:利用对象的形式操作数据表

    ​ SQL:1) 数据库只能辨认 SQL 语句,不能辨认对象;2) 如果每天都写特地简略的 SQL 没有任何价值

    ​ 外围原理:1) 利用注解示意对象与表的映射关系 @TableName(“ 表名称 ”),字段与属性映射;2) 将公共的接口办法抽取到公共接口中,如果须要应用只须要继承即可;3) 操作对象时须要有专门的 API 实现对象与 SQL 的转化,最终交给 MyBatis 去执行

    ​ 例子:userMapper.insert(User entity);

    INSERT INTO 表名 #{entity.getClass().getAnnotation("TableName").getValue()}
    (字段 1, 字段 2, 字段 3... 遍历拿到属性的注解, 拿到字段名)
    VALUES
    (值 1, 值 2, 值 3... 遍历拿到属性值)
  4. MyBatisPlus 入门案例

    i. 增加日志打印

    # 打印 SQL 语句
    logging:
      level:
        com.jt.mapper: debug

    ii. 编写测试方法 — selectById(),selectList()

    /* 1. 查问用户数据, 依据 id = 51
       SQL: SELECT * FROM user WHERE id = 51 */
    @Test
    public void testSelect01(){User user = userMapper.selectById(51); // 依据主键查问
       System.out.println(user);
    }
    
    /* 2. 查问用户数据, 依据 name = "王昭君"
       SQL: SELECT * FROM user WHERE name = "王昭君" */
    @Test
    public void testSelect02(){
       // 条件结构器: 次要作用是动静拼接 WHERE 条件
       // = eq,> gt,< lt,>= ge,<= le
       QueryWrapper<User> queryWrapper = new QueryWrapper<>();
       queryWrapper.eq("name", "王昭君");
       List<User> list = userMapper.selectList(queryWrapper);
       System.out.println(list);
    }

    iii. 编写测试方法 — orderBy(),like()

    /* 3. 查问性别为男性, 按年龄降序 "SQL: SELECT * FROM user WHERE sex =" 男 " ORDER BY age DESC*/
    @Test
    public void testSelect03(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();
       queryWrapper.eq("sex", "男").orderByDesc("age");
       List<User> list = userMapper.selectList(queryWrapper);
       System.out.println(list);
    }
    
    /* 4. 查问名字蕴含 "精", 按年龄降序 "SQL: SELECT * FROM user WHERE name LIKE"% 精 %" ORDER BY age ASC*/
    @Test
    public void testSelect04(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();
       queryWrapper.like("name", "精").orderByAsc("age");
       List<User> list = userMapper.selectList(queryWrapper);
       System.out.println(list);
    }

    iv. 编写测试方法 — between(),or(),selectBatchIds(),in()

    /* 5. 查问 age>=18 age<100 男性 */
    @Test
    public void testSelect05(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();
       // 默认的逻辑运算符就是 and
       //queryWrapper.ge("age", 18).lt("age", 100).eq("sex", "男");
       queryWrapper.between("age", 18, 100).eq("sex", "男");
       List<User> list = userMapper.selectList(queryWrapper);
       System.out.println(list);
    }
    
    /* 6.id = 1,3,5,6,7
       name = "黑熊精","白龙驴","大乔" */
    @Test
    public void testSelect06(){Integer[] ids = {1,3,5,6,7};
       List idList = Arrays.asList(ids);
       List<User> list = userMapper.selectBatchIds(idList);
    
       QueryWrapper queryWrapper = new QueryWrapper();
       queryWrapper.in("name", "黑熊精","白龙驴","大乔");
       List<User> list2 = userMapper.selectList(queryWrapper);
       System.out.println(list2);
    }

    v. 编写测试方法 — selectMaps(),insert()

    /* 7. 查问 id,name 字段信息 */
    @Test
    public void testSelect07(){QueryWrapper queryWrapper = new QueryWrapper();
       queryWrapper.select("id","name");
       List<User> list = userMapper.selectList(queryWrapper);
       System.out.println(list);
    
       List<Map<String,Object>> map = userMapper.selectMaps(queryWrapper);
       System.out.println(map);
    }
    
    @Test
    public void insert(){User user = new User();
       user.setId(null).setName("嫦娥").setAge(5).setSex("女");
       userMapper.insert(user);
    }

    练习:测试 update()

    /* 将 id = 67 的数据名称改为火星 5 号 */
    @Test
    public void update(){User user = new User();
       user.setName("火星 5 号").setId(65);
       // 依据对象中不为空的属性当做 set 的条件, 主键当做更新的条件
       userMapper.updateById(user);
    }
    
    /* 将火星 5 号的数据改为太阳 5 号, 年龄改为 1000 */
    @Test
    public void update02(){
       // 参数阐明: 实体对象 - 封装须要批改的数据
       //       wrapper - 构建批改条件
       User user = new User();
       user.setName("太阳 5 号").setAge(1000);
       UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
       updateWrapper.eq("name", "火星 5 号");
       userMapper.update(user,updateWrapper);
    }
退出移动版