🍅 Java學習路線:搬磚工的Java學習路線
🍅 作者:程式員小王
🍅 程式員小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF
🍅 掃描主頁左側二維碼,加我微信 一起學習、一起進步
🍅 歡迎點贊 👍 收藏 ?留言 📝
🍅 如有編輯錯誤聯系作者,如果有比較好的文章歡迎分享給我,我會取其精華去其糟粕
一、什么是mybatis-plus

1、在java中訪問資料庫
1. 直接使用jdbc,訪問資料庫,創建Connection,ResultSet
2. 把jdbc操作進行了封裝,創建了很多工具類,比如DBUtil
3. 持久層框架
(1)hibernate:全程的ORM框架, 實作java object ---表的映射,操作java物件操作資料庫表
可以使用hibernate訪問不同的資料庫,不需要改變代碼
(2)jpa規范:hibernate open-jpa ,link(定義一樣的方法操作資料庫)
(3)mybatis:撰寫xml檔案,在xml中撰寫sql陳述句,訪問資料庫,任何操作都需要使用xml檔案
需要熟悉sql語言,開發效率低一些,單表的CRUD也需要使用xml檔案撰寫sql陳述句
(4)Mybatis-plus 簡稱MP,對mybatis的增強,在mybatis-plus之外加一層,單表操作
可以不使用xml檔案,分頁,性能統計,邏輯洗掉等,
2、Mybatis-plus簡介
MyBatis-Plus(簡稱 MP )是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生,Mybatis-Plus 在 MyBatis 之上套了一層外衣,單表 CURD 的操作幾乎都可以由 MyBatis-Plus 代替執行,而且提供了各種查詢方式,分頁行為,作為使用者無需撰寫 xml,直接呼叫 MyBatis-Plus 提供的 API 就可以了,
官網:http://mp.baomidou.com/
3、Mybatis-plus特性
1.無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
2.損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向物件操作
3.強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實作單表大部分 CRUD 操作,
更有強大的條件構造器,滿足各類使用需求
4.支持 Lambda 形式呼叫:通過 Lambda 運算式,方便的撰寫各類查詢條件,無需再擔心欄位寫錯
5.支持主鍵自動生成:支持多達 4 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),
可自由配置,完美解決主鍵問題
6.支持 ActiveRecord 模式:支持 ActiveRecord 形式呼叫,
物體類只需繼承 Model 類即可進行強大的 CRUD 操作
7.支持自定義全域通用操作:支持全域通用方法注入( Write once, use anywhere )
8.內置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,
支持模板引擎,更有超多自定義配置等您來使用
9.內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作,
配置好插件之后,寫分頁等同于普通 List 查詢
10.分頁插件支持多種資料庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種資料庫
11.內置性能分析插件:可輸出 SQL 陳述句以及其執行時間,建議開發測驗時啟用該功能,能快速揪出慢查詢
12.內置全域攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
二、第一個mybatis-plus開發
1、使用MP的步驟:
前提:資料庫/表創建
CREATE TABLE USER (
id INT ( 11 ) NOT NULL AUTO_INCREMENT,
NAME VARCHAR ( 50 ) DEFAULT NULL,
email VARCHAR ( 80 ) DEFAULT NULL,
age INT ( 11 ) DEFAULT NULL,
PRIMARY KEY ( id )
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
(1)新建的Spring Boot 工程
(2)指定maven的mp坐標
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
(3)指定資料庫的驅動
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 在application.yml中進行配置資料庫(資料庫名plus)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/plus?useSSL=false&serverTimezone=UTC
username: root
password: root
(4)創建物體類 定義屬性 指定主鍵的型別
public class User {
/**
* 指定主鍵的方式
* value:主鍵欄位的名稱,如果是id可以不用寫
* type:指定主鍵的型別,主鍵的值如何生成:IdType.AUTO表示自動增長
*/
@TableId(value ="id",type = IdType.AUTO)
private Integer id;
private String name;
private String email;
private Integer age;
(5)創建dao介面,需要繼承BaseMapper<物體.class>
/**
* @author 王恒杰
* @Description:
* 自定義的mapper,dao介面
* 1.實作BaseMapper
* 2.要指定物體類物件
*
* BaseMapper是mybatis-plus的物件,定義了17個方法(crud)
*/
public interface UserMapper extends BaseMapper<User> {
}
(6)在springboot的啟動類上,加入@MappperScan(value=“指定dao介面的包名”);
/**
* @author 王恒杰
* @MapperScan:掃描器,指定Mapper所在的包名
*/
@SpringBootApplication
@MapperScan(value = "com.tjcu.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
(7)測驗使用
在測驗類或Service注入Dao介面,框架使用動態代理 創建Dao的實作類物件 ,
呼叫BaseMapper 中的方法,完成CRUD操作
/*
SuppressWarnings:該批注的作用是給編譯器一條指令,
告訴它對被批注的代碼元素內部的某些警告保持靜默,
添加@SuppressWarnings("all")之后 private UserMapper UserDao;中的UserDao才不報錯
*/
@SuppressWarnings("all")
@SpringBootTest
class MybatisPlusApplicationTests {
/**
使用自動注入,注入Mapper物件(Dao)
* @Autowired 注釋,它可以對類成員變數、方法及建構式進行標注,
* 完成自動裝配的作業, 通過 @Autowired的使用來消除 set ,get方法,
*/
@Autowired
private UserMapper UserDao;
/**
* 測驗添加操作
*/
@Test
public void testUserInsert() {
//創建User物件
User user = new User();
user.setName("王恒杰");
user.setAge(20);
user.setEmail("123@qq.com");
//呼叫UserMapper的方法,也就是父介面BaseMapper中提供的方法
int i = UserDao.insert(user);
System.out.println(i);
}
}
- @Autowired解釋
@Autowired 注釋,它可以對類成員變數、方法及建構式進行標注,完成自動裝配的作業,
通過 @Autowired的使用來消除 set ,get方法,
- @SuppressWarnings(“all”)解釋
@SuppressWarnings:該批注的作用是給編譯器一條指令,
告訴它對被批注的代碼元素內部的某些警告保持靜默,
2、mybatis-plus日志
在application.yml中進行配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 配置日志檔案后的控制臺

四、MP操作CRUD 的 基本用法
1、添加資料后,獲取主鍵值(MP可以自動實作主鍵回填)
- 操作插入資料之前資料庫的資料

- 測驗代碼
/**
* 測驗添加資料后,獲取主鍵值
*/
@Test
public void testUserInsertGetId() {
User user = new User();
user.setName("楊福君");
user.setAge(19);
user.setEmail("10019@qq.com");
int rows = UserDao.insert(user);
//獲取主鍵的id,剛添加資料的id ,getId主鍵欄位對應的get方法
Integer id = user.getId();
System.out.println("主鍵的id"+id);
}

- 操作插入資料之后資料庫的資料

2、更新資料
- BaseMapper介面中的更新方法(原始碼 )
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
(1)更新資料實作
- 更新資料之前資料庫的資料

- mybatis-plus封裝的sql陳述句
UPDATE user SET name=?, email=?, age=? WHERE id=?
- 測驗代碼
/**
* 更新用戶
*/
@Test
public void updateUser(){
User user = new User();
user.setName("被修改后的王恒杰");
user.setAge(22);
user.setEmail("1259387078@qq.com");
//被更改的用戶
user.setId(2);
//更新所有非null的值
int i = UserDao.updateById(user);
System.out.println("影響行數"+i);
}

- 更新資料之后資料庫的資料

(2)更新資料的是所有非null的值
int updateById(@Param("et") T entity);
這個方法更新的是所有非null的值,如果物體類是int型別的(非包裝型別),那這個數就自動更改為0
- 將age的型別改為int之后
@TableId(value ="id",type = IdType.AUTO)
private Integer id;
private String name;
private String email;
private int age;
- 測驗代碼
/**
* 更新用戶,只更新姓名資料
*/
@Test
public void updateUser(){
User user = new User();
user.setName("被修改后的楊福君");
//被更改的用戶
user.setId(3);
//更新所有非null的值
int i = UserDao.updateById(user);
System.out.println("影響行數"+i);
}
- mybatis-plus封裝的sql陳述句
UPDATE user SET name=?, age=? WHERE id=?
- 更新資料之后資料庫的資料

注意: 我們使用mybatis-plus時物體類最好使用包裝型別 ,避免出現基本資料型別 ,更新資料時,沒修改的為0的情況
3、洗掉資料
- BaseMapper介面中的洗掉方法(原始碼 )
1.int deleteById(Serializable id);
2.int deleteByMap(@Param("cm") Map<String, Object> columnMap);
3.int delete(@Param("ew") Wrapper<T> wrapper);
4.int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
(1)deleteById:按主鍵洗掉
- 洗掉資料之前資料庫的資料

- 測驗代碼
/**
* 洗掉用戶
* 按主鍵洗掉一條用戶
* 方法為:deleteById
* 引數:主鍵值
* 回傳值:是洗掉的成功的記錄數
*/
@Test
public void deleteUserById(){
int i = UserDao.deleteById(2);
System.out.println(i);
}

- mybatis-plus封裝的sql陳述句
DELETE FROM user WHERE id=?
- 洗掉資料之后資料庫的資料

(2)根據Map中條件洗掉
- 洗掉資料之前資料庫的資料

- 測驗代碼
/**
* 按條件洗掉資料,條件是封裝到Map物件中
* 方法:deleteByMap(map物件)
*/
@Test
public void deleteUserByMap(){
// 創建Map物件,保存條件值
HashMap<String, Object> map = new HashMap<>();
map.put("name","王恒杰");
map.put("age",20);
//DELETE FROM user WHERE name = ? AND age = ?
int i = UserDao.deleteByMap(map);
System.out.println(i);
}

- mybatis-plus封裝的sql陳述句
DELETE FROM user WHERE name = ? AND age = ?
- 洗掉資料之后資料庫的資料

(3)批量洗掉
- 洗掉資料之前資料庫的資料

- 測驗代碼
/**
* 批量洗掉
* deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
*/
@Test
public void deleteBatchIds(){
ArrayList<Integer> ids = new ArrayList<>();
ids.add(4);
ids.add(5);
ids.add(6);
int i = UserDao.deleteBatchIds(ids);
System.out.println(i);
}

- mybatis-plus封裝的sql陳述句
DELETE FROM user WHERE id IN ( ? , ? , ? )
- 洗掉資料之后資料庫的資料

(4)使用Lambda運算式實作批量洗掉
- 批量洗掉資料之前資料庫的資料

- 測驗代碼
/**
* Lambda實作批量洗掉
* deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
*/
@Test
public void deleteByLambda(){
List<Integer> ids=
Stream.of(3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19).collect(Collectors.toList());
int i = UserDao.deleteBatchIds(ids);
System.out.println(i);
}

- mybatis-plus封裝的sql陳述句
DELETE FROM user WHERE id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? )
- 批量洗掉資料之后資料庫的資料

4、查詢資料
- BaseMapper介面中的查詢十種 方法(原始碼 )
//通過id查詢
T selectById(Serializable id);
//批量查詢
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
//多個條件查詢
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
//查詢一個物件
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
//統計的count值
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
//條件查詢
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
//分頁查詢
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
(1)根據 id 主鍵查詢
- 測驗代碼
/**
* 通過id查詢
* 如果根據主鍵沒有查到資料,得到的回傳值是null
*
*/
@Test
public void selectUserById(){
User user = UserDao.selectById(26);
System.out.println(user);
}
- mybatis-plus封裝的sql陳述句
SELECT id,name,email,age FROM user WHERE id=?
- 控制臺展示

(2)批量查詢記錄
- 測驗代碼
/**
* 實作批處理查詢,根據多個主鍵查詢,獲取到list
* 方法:selectBatchIds
* 引數:id集合
* 回傳值:list<T>
*/
@Test
public void selectBatchIds(){
ArrayList<Integer> ids = new ArrayList<>();
ids.add(23);
ids.add(24);
ids.add(25);
ids.add(26);
List<User> users = UserDao.selectBatchIds(ids);
for (User user : users) {
System.out.println(user);
}
}
- mybatis-plus封裝的sql陳述句
SELECT id,name,email,age FROM user WHERE id IN ( ? , ? , ? , ? )
- 控制臺輸出結果

(3)Lambda實作批量查詢
- 測驗代碼
/**
* 使用Lambda實作批處理查詢,根據多個主鍵查詢,獲取到list
* 方法:selectBatchIdsByLambda
* 引數:id集合
* 回傳值:list<T>
*/
@Test
public void selectBatchIdsByLambda(){
List<Integer> ids = Stream.of(24, 25, 26, 27, 28).collect(Collectors.toList());
List<User> users = UserDao.selectBatchIds(ids);
//遍歷
for (int i = 0; i < users.size(); i++) {
System.out.println("查詢出來的第"+(i+1)+"個用戶:"+users.get(i));
}
}
- mybatis-plus封裝的sql陳述句
SELECT id,name,email,age FROM user WHERE id IN ( ? , ? , ? , ? , ? )
- 控制臺輸出結果

(4)使用Map條件查詢查詢單個用戶
- 測驗代碼
//查詢單個用戶
HashMap<String, Object> map1 = new HashMap<>();
// 姓名:楊福君
map1.put("name", "楊福君");
// 年齡 :19
map1.put("age", 19);
List<User> users = UserDao.selectByMap(map1);
for (User user : users) {
System.out.println(user);
}
- mybatis-plus封裝的sql陳述句
SELECT id,name,email,age FROM user WHERE name = ? AND age = ?
- 控制臺輸出結果

(5)使用Map條件查詢查詢多個用戶
- 測驗代碼
//詢多個用戶
HashMap<String, Object> map2 = new HashMap<>();
// 姓名:王恒杰
map2.put("name", "王恒杰");
// 年齡 :21
map2.put("age", 21);
List<User> users1 = UserDao.selectByMap(map2);
for (User user : users1) {
System.out.println(user);
}
- mybatis-plus封裝的sql陳述句
SELECT id,name,email,age FROM user WHERE name = ? AND age = ?
- 控制臺輸出結果

5、mybatis-plus中CRUD的底層實作原理
通過使用動態代理 的方式來生成dao物件,來呼叫sqlSession底層方法,對mybatis進行封裝和增強,用mybatis-plus替代mybatis
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/352439.html
標籤:java
