day 02 SpringBoot高级用法,整合MyBatis

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

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

    i. application.properties

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

    ii. yml文件文件阐明

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

  2. 为属性赋值

    i. 创立RedisController

    @RestControllerpublic 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.1redis.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.129redis2.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: prodserver:  port: 9000# 为Redis设定属性和属性值redis.host: 114.114.114.1redis.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: rootmybatis:  # 类型别名包  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测试方法

    @Autowiredprivate UserMapper userMapper;@Testpublic 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治理,为其创立代理对象 CGLIBpublic interface UserMapper extends BaseMapper<User> {    ...}

    v. 批改yml配置

    mybatis-plus:  # 类型别名包

    vi. 编写配置办法

    @Testpublic 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 */@Testpublic void testSelect01(){   User user = userMapper.selectById(51); //依据主键查问   System.out.println(user);}/* 2.查问用户数据,依据name = "王昭君"   SQL: SELECT * FROM user WHERE name = "王昭君" */@Testpublic 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*/@Testpublic 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*/@Testpublic 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 男性 */@Testpublic 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 = "黑熊精","白龙驴","大乔" */@Testpublic 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字段信息*/@Testpublic 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);}@Testpublic void insert(){   User user = new User();   user.setId(null).setName("嫦娥").setAge(5).setSex("女");   userMapper.insert(user);}

    练习:测试update()

    /* 将id = 67的数据名称改为火星5号 */@Testpublic void update(){   User user = new User();   user.setName("火星5号").setId(65);   //依据对象中不为空的属性当做set的条件,主键当做更新的条件   userMapper.updateById(user);}/* 将火星5号的数据改为太阳5号,年龄改为1000 */@Testpublic 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);}