此文檔是根據上課操做流程進行的整理,更多細節和圖片請參見劉老師的專欄java
i. application.propertiesmysql
語法:key = value,屬性-值默認條件下都是String類型,不須要添加引號面試
ii. yml文件文件說明redis
語法:key: value,yml文件中有文件父子級效果,採用縮進的方式實現spring
爲屬性賦值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方式爲準,注意事項:屬性儘可能不要重複
環境切換
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
熱部署配置
弊端:IDEA啓動時特別耗費內存,若是配置了熱部署,則卡上加卡。
i. 添加jar包
<!--支持熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
ii. IDEA配置
組合鍵:ctrl + alt + shift + /
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文件時生效。
在項目中引入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); }
以對象方式操做數據庫,單表操做不須要寫SQL語句。
對象關係映射 - Object Relational Mapping
核心:採用對象的方式操做數據庫
思考:userMapper.insert(User對象) -- 剩餘的入庫SQL由框架自動完成
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); }
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... 遍歷拿到屬性值)
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); }