第四阶段笔记 Jingtao_day02

day 02 SpringBoot高级用法,整合MyBatis

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

江哥的专栏

cgb2008-京淘day02

一. 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+"
    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包

    
    
        org.springframework.boot
        spring-boot-devtools
    

    ii. IDEA配置

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

  5. Lombok

    i. 添加jar包

    
    
       org.projectlombok
       lombok
    

    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个)

    
    
        mysql
        mysql-connector-java
        runtime
        5.1.32
    
            
    
    
        org.springframework.boot
        spring-boot-starter-jdbc
    
    
    
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        1.3.2
    

    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) 驼峰映射规则

    
    
    
       
       
       
    

    iii. 编写MyBatis测试方法

    @Autowired
    private UserMapper userMapper;
    @Test
    public void testMyBatis01(){
       List 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包

    
    
        com.baomidou
        mybatis-plus-boot-starter
        3.2.0
    

    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 {
        ...
    }

    v. 修改yml配置

    mybatis-plus:
      # 类型别名包

    vi. 编写配置方法

    @Test
    public void testMyBatisPlus01(){
       //查询所有的数据
       List 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 queryWrapper = new QueryWrapper<>();
       queryWrapper.eq("name", "王昭君");
       List 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 queryWrapper = new QueryWrapper<>();
       queryWrapper.eq("sex", "男").orderByDesc("age");
       List 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 queryWrapper = new QueryWrapper<>();
       queryWrapper.like("name", "精").orderByAsc("age");
       List list = userMapper.selectList(queryWrapper);
       System.out.println(list);
    }

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

    /* 5.查询age>=18 age<100 男性 */
    @Test
    public void testSelect05(){
       QueryWrapper queryWrapper = new QueryWrapper<>();
       //默认的逻辑运算符就是and
       //queryWrapper.ge("age", 18).lt("age", 100).eq("sex", "男");
       queryWrapper.between("age", 18, 100).eq("sex", "男");
       List 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 list = userMapper.selectBatchIds(idList);
    
       QueryWrapper queryWrapper = new QueryWrapper();
       queryWrapper.in("name", "黑熊精","白龙驴","大乔");
       List 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 list = userMapper.selectList(queryWrapper);
       System.out.println(list);
    
       List> 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 updateWrapper = new UpdateWrapper<>();
       updateWrapper.eq("name", "火星5号");
       userMapper.update(user,updateWrapper);
    }

你可能感兴趣的:(java,spring)