第四階段筆記 Jingtao_day02

day 02 SpringBoot高級用法,整合MyBatis

此文檔是根據上課操做流程進行的整理,更多細節和圖片請參見劉老師的專欄java

一. SpringBoot高級用法
  1. 關於配置文件的說明

    i. application.propertiesmysql

    ​ 語法:key = value,屬性-值默認條件下都是String類型,不須要添加引號面試

    ii. yml文件文件說明redis

    ​ 語法:key: value,yml文件中有文件父子級效果,採用縮進的方式實現spring

  2. 爲屬性賦值sql

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

    ​ 業務需求:有時須要動態獲取屬性的值,若是直接寫到代碼中,須要從新打包編譯,代碼的耦合性高。可否利用配置文件的方式動態的爲屬性賦值?mybatis

    ​ ii. yml方式爲屬性賦值app

    ​ 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);
    }
相關文章
相關標籤/搜索