Power designer-2

1.項目發佈問題
1.1 項目打包

說明:若是須要項目的發佈則須要將項目打包處理.打完包以後,會在target目錄中動態生成jar/war包. 以及本地倉庫中也會有包?
擴展: 本地倉庫的包有啥做用? 做用:就是被其餘項目依賴.由於項目未來會有多個而且極其複雜.
clean: 的做用是刪除target目錄.
打包項目java

1.1.1 項目打包複製換名
從項目中複製出來
1.2 項目發佈

說明:將項目打包以後,發佈到指定的文件中,以後利用命令啓動.
java -jar 後面跟文件名.jar 命令~~~~
發佈項目mysql

2.SpringBoot增強
2.1 熱部署
2.1.1添加jar包
<!--支持熱部署 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
2.2 環境切換
2.2.1 業務場景

通常開發時使用的都是測試環境.當項目上線時須要在生產環境下部署項目.
問題: 在測試環境中的配置與生產環境下的配置可能不一致,常常須要修改IP地址及端口.
想法:可否簡化該操做?
策略:指定多個運行環境. 當如今處於測試環境時,讓配置文件指向測試. 反之作相同的操做.程序員

2.2.2 編輯YML配置文件

YML文件配置

2.3 配置LomBok
2.3.1添加jar包文件

`面試

<!--引入插件lombok 自動的set/get/構造方法插件  -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

`spring

2.3.2 添加註解
package com.jt.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data  //set/get/toString方法只會重寫本身的屬性,不會添加父級的屬性
@Accessors(chain = true) //鏈式加載規則
@NoArgsConstructor       //無參構造
@AllArgsConstructor      //全參構造
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;

    //accessors重寫了set方法
   /* public User setId(Integer id){
        this.id = id;
        return this;
    }*/

}

2.3.3 面試題

問:項目發佈是在Linux中發佈的,LomBok的使用通常都須要安裝插件.問題:若是在Linux中發佈項目,是否須要重寫安裝LomBok插件.sql

答案: 不須要
原有: Lombok是編輯期有效.重寫了set/get/toString等方法. 編輯期指代碼由.java文件編譯爲.class文件.數據庫

3 SpringBoot整合Mybatis
3.1 建立項目

建立、導包、編輯、配置YML文件以及編輯測試類

3.6 ORM介紹

對象關係映射(Object Relational Mapping,簡稱ORM)是經過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另一種形式。 這也同時暗示着額外的執行開銷;然而,若是ORM做爲一種中間件實現,則會有不少機會作優化,而這些在手寫的持久層並不存在。 更重要的是用於控制轉換的元數據須要提供和管理;可是一樣,這些花費要比維護手寫的方案要少;並且就算是遵照ODMG規範的對象數據庫依然須要類級別的元數據。
歸納: 利用對象的方式操做數據庫.後端

3.6 關於Mybatis配置文件說明
3.6.1 別名包定義
<!--當查詢結果返回值會本身拼接包路徑 com.jt.pojo.User
        雖然使用了別名包,可是也能夠本身指定包路徑
        結論:本身不寫執行別名包
             本身寫了就執行本身的.
        -->
    <!--<select id="findAll" resultType="com.jd.pojo.User">
        select * from user
    </select>-->
3.6.2 駝峯規則映射

1).配置
駝峯規則映射api

2).具體說明mybatis

<?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">
<mapper namespace="com.jt.mapper.UserMapper">

    <!--當查詢結果返回值會本身拼接包路徑 com.jt.pojo.User
        雖然使用了別名包,可是也能夠本身指定包路徑
        結論:本身不寫 執行別名包
             本身寫了就執行本身的.
        -->
    <!--<select id="findAll" resultType="com.jd.pojo.User">
        select * from user
    </select>-->

    <!--需求
        字段信息: user_id,user_name,user_age
        對象屬性: userId,userName,userAge
        需求:查詢數據庫,實現數據的映射.

        補充知識: ORM:以對象的形式操做數據庫.
        resultType:將數據庫中的結果動態的封裝爲對象.
        原則: 字段的名稱必須與對象屬性的名稱一致.

        駝峯規則映射:
        目的: 主要簡化mybatis 映射的過程
        規則: user_id(字段) ~~~ 去除下劃線 ~~~以後首字母大寫
                                userid       userId
注意事項:一旦使用駝峯規則,必須知足條件
    面試點: 若是開啓了駝峯規則映射,
            問: 字段user_id 與對象屬性user_id
            可否映射???

-->
<!--<select id="xxx" resultType="User">
    &lt;!&ndash;執行的是sql,返回的是List<User>&ndash;&gt;
    select * from user
</select>-->

</mapper>

###### 4 MybatisPlus(MP)
###### 4.1 業務場景需求
我是一個開發10年的老鳥.,可是我也有個人困擾.後端開發的實質就是如何"優雅"的書寫CURD操做,做爲老鳥特別喜歡有難度的業務. 可是某些需求**執行單表的CURD操做**(特別沒有養分).  
可否有一種框架能夠幫助咱們自動的實現單表的CURD操做呢?提升開發的效率???

4.2 MybatisPlus
###### 4.2.1 介紹
Mybatis-plus  - log官網圖片
url地址: https://baomidou.com  
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的加強工具,在 **MyBatis 的基礎上只作加強**不作改變,爲簡化開發、提升效率而生。
![mybatis-plus](/img/bVbOFHz)
### 4.2.2 特性

無侵入:只作加強不作改變,引入它不會對現有工程產生影響,如絲般順滑  
損耗小:啓動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操做  
強大的 CRUD 操做:內置通用 Mapper、通用 Service,僅僅經過少許配置便可實現單表大部分 CRUD 操做,更有強大的條件構造器,知足各種使用需求  
支持 Lambda 形式調用:經過 Lambda 表達式,方便的編寫各種查詢條件,無需再擔憂字段寫錯  
支持主鍵自動生成:支持多達 4 種主鍵策略(內含分佈式惟一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題  
支持 ActiveRecord 模式:支持 ActiveRecord 形式調用,實體類只需繼承 Model 類便可進行強大的 CRUD 操做  
支持自定義全局通用操做:支持全局通用方法注入( Write once, use anywhere )  
內置代碼生成器:採用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用  
內置分頁插件:基於 MyBatis 物理分頁,開發者無需關心具體操做,配置好插件以後,寫分頁等同於普通 List 查詢  
分頁插件支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB二、H二、HSQL、SQLite、Postgre、SQLServer 等多種數據庫  
內置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啓用該功能,能快速揪出慢查詢  
內置全局攔截插件:提供全表 delete 、 update 操做智能分析阻斷,也可自定義攔截規則,預防誤操做

4.3 MP工做原理說明
------------

### 4.3.1 原理實現說明

說明:以對象的方式操做數據庫.  
需求分析:  
1.對象與數據庫表如何映射?  
利用註解實現對象與表綁定 屬性與字段綁定.  
2.如何解決衆多接口編輯雷同的CRUD操做?  
定義一個公共的Mapper接口,定義公共的CRUD操做 利用泛型區分對象.  
3.數據庫只對Sql感興趣,對對象沒興趣?(如何將對象轉化爲sql)  
思想:按照特定的語法,將對象轉化爲sql語句.

例子: 將user對象插入數據庫中.

userMapper.insert(user對象);  //程序員完成的最後的代碼
    sql: insert into 表名(字段.....) values (屬性值......); 由mp動態拼接以後交由mybatis執行.
##### 4.4 SpringBoot整合MP
##### 4.4.1 導入MPjar包

<!--spring整合mybatis-plus 只導入MP包,刪除mybatis包 -->

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

</dependency>

###### 4.4.2 編輯POJO對象

package com.jt.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

@Data
@Accessors(chain = true)
@TableName("user") //實現表與對象的關聯 若是名稱一致(忽略大小寫)能夠省略表名
public class User implements Serializable {

//但凡定義pojo實體對象中的屬性類型必須使用包裝類型.
@TableId(type = IdType.AUTO)
private Integer id;  //主鍵,而且主鍵自增
//@TableField(value = "name")
private String name;
//@TableField(value = "age")
private Integer age;
private String sex;

//動態生成get和set方法及構造方法 快捷鍵 alt+insert

}

###### 4.4.3 編輯Mapper接口
![編輯mapper接口](/img/bVbOFHN)
###### 4.4.4 修改YML文件配置

server:
port: 8090
servlet:

context-path: /

spring:
datasource:

#driver-class-name: com.mysql.cj.jdbc.Driver  #驅動註釋,採用默認的方式
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root

Mybatisplus整合

mybatis-plus:
#定義別名包 將實體對象的包路徑進行封裝.
type-aliases-package: com.jt.pojo
#添加xml文件的依賴
mapper-locations: classpath:/mybatis/mappers/*.xml
#開啓駝峯映射
configuration:

map-underscore-to-camel-case: true
###### 4.4.5 MP入門案例

package com.jt.test;

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
public class TestMybatis {

@Autowired
private UserMapper userMapper;

@Test
public void test01(){

    List<User> userList = userMapper.findAll();
    System.out.println(userList);
}

//測試MP方法
@Test
public void test02(){
    //查詢user表的所有數據
    List<User> userList = userMapper.selectList(null);
    System.out.println(userList);
}

}

###### 4.4.6 補充知識-關於數據庫連接地址說明

spring:
datasource:

#driver-class-name: com.mysql.cj.jdbc.Driver  #驅動註釋,採用默認的方式
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
1).時區 數據庫驅動的高版本須要使用時區操做.  
serverTimezone=GMT%2B8 %2B +  
2).使用useUnicode=true編碼  
characterEncoding=utf8 字符采用utf-8編碼  
3).autoReconnect=true 若是mysql連接斷掉以後是否重連.  
4).allowMultiQueries=true 是否容許批量操做.

###### 4.5 MP API介紹
###### 4.5.1 開放Sql日誌

server:
port: 8090
servlet:

context-path: /

spring:
datasource:

#driver-class-name: com.mysql.cj.jdbc.Driver  #驅動註釋,採用默認的方式
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root

Mybatisplus整合

mybatis-plus:
#定義別名包 將實體對象的包路徑進行封裝.
type-aliases-package: com.jt.pojo
#添加xml文件的依賴
mapper-locations: classpath:/mybatis/mappers/*.xml
#開啓駝峯映射
configuration:

map-underscore-to-camel-case: true

配置數據庫日誌

logging:
level:

#打印哪一個包下的日誌信息.
com.jt.mapper: debug
###### 4.5.2 insert操做

/**

*  1.測試入庫
 *  將用戶信息  王大錘  20  男 入庫
 */

@Test
public void insert(){
    User user = new User();
    user.setName("王大錘").setAge(20).setSex("男");
    userMapper.insert(user); //基本告別單表sql
}
###### 4.5.3 查詢操做

/**

*  2.查詢聯繫 查詢ID爲21的用戶
 */
@Test
public void select01(){

    User user = userMapper.selectById(21);
    System.out.println(user);
    //查詢總記錄數
    int count = userMapper.selectCount(null);
    System.out.println(count);
}

/**
 * 需求: 查詢性別爲(=)女 and 年齡大於100歲
 * 條件構造器: 動態拼接where條件的. 多條件中默認的連接符and
 * 常見邏輯運算符
 *  1.eq =   2.gt >   3.lt  <
 *  ge >= ,le  <=
 * */
@Test
public void select03(){

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("sex", "女")
                 .gt("age",100);
    List<User> userList = userMapper.selectList(queryWrapper);
    System.out.println(userList);
}

/**
 * 需求: 1.查詢名稱中包含'精'字的男性  "%精%"
 *       2.查詢以精結尾的              %精
 *       3.查詢以精開頭                精%
 *       * */
@Test
public void select04(){

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.likeLeft("name", "精")
   // queryWrapper.like("name", "精")
                .eq("sex", "男");
    List<User> userList = userMapper.selectList(queryWrapper);
    System.out.println(userList);
}

/**
 * 需求: 查詢sex=女,以後按照age 倒敘排列.若是年齡相同按照id降序排列.
 * */
@Test
public void select05(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("sex", "女")
                .orderByDesc("age","id");
    List<User> userList = userMapper.selectList(queryWrapper);
    System.out.println(userList);
}

/**
 * 需求: 查詢id爲 1,3,5,7,8,9的數據???
 * 關鍵字  in  or
 * 在關聯查詢中慎用
 * */
@Test
public void select06(){
    Integer[] ids = {1,3,5,7};
   /* List<Integer> idList = new ArrayList<>();
    idList.add(1);
    idList.add(3);
    idList.add(5);
    idList.add(7);
    idList.add(8);*/
    List<Integer> idList = Arrays.asList(ids);
    List<User> userList = userMapper.selectBatchIds(idList);
    System.out.println(userList);
}
相關文章
相關標籤/搜索