說明:若是須要項目的發佈則須要將項目打包處理.打完包以後,會在target目錄中動態生成jar/war包. 以及本地倉庫中也會有包?
擴展: 本地倉庫的包有啥做用? 做用:就是被其餘項目依賴.由於項目未來會有多個而且極其複雜.
clean: 的做用是刪除target目錄.java
說明:將項目打包以後,發佈到指定的文件中,以後利用命令啓動.
java -jar 後面跟文件名.jar 命令~~~~mysql
<!--支持熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
通常開發時使用的都是測試環境.當項目上線時須要在生產環境下部署項目.
問題: 在測試環境中的配置與生產環境下的配置可能不一致,常常須要修改IP地址及端口.
想法:可否簡化該操做?
策略:指定多個運行環境. 當如今處於測試環境時,讓配置文件指向測試. 反之作相同的操做.程序員
`面試
<!--引入插件lombok 自動的set/get/構造方法插件 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
`spring
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; }*/ }
問:項目發佈是在Linux中發佈的,LomBok的使用通常都須要安裝插件.問題:若是在Linux中發佈項目,是否須要重寫安裝LomBok插件.sql
答案: 不須要
原有: Lombok是編輯期有效.重寫了set/get/toString等方法. 編輯期指代碼由.java文件編譯爲.class文件.數據庫
對象關係映射(Object Relational Mapping,簡稱ORM)是經過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另一種形式。 這也同時暗示着額外的執行開銷;然而,若是ORM做爲一種中間件實現,則會有不少機會作優化,而這些在手寫的持久層並不存在。 更重要的是用於控制轉換的元數據須要提供和管理;可是一樣,這些花費要比維護手寫的方案要少;並且就算是遵照ODMG規範的對象數據庫依然須要類級別的元數據。
歸納: 利用對象的方式操做數據庫.後端
<!--當查詢結果返回值會本身拼接包路徑 com.jt.pojo.User 雖然使用了別名包,可是也能夠本身指定包路徑 結論:本身不寫執行別名包 本身寫了就執行本身的. --> <!--<select id="findAll" resultType="com.jd.pojo.User"> select * from user </select>-->
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"> <!–執行的是sql,返回的是List<User>–> 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
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
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); }