CRUD
官方檔案:https://baomidou.com/
(建議多看看官方檔案,每種功能里面都有講解)【本文章使用的mybatisplus版本為3.5.2】
條件構造器
一般都是用service層的方法,因為比mapper層的全,十分重要:Wrapper 記住查看輸出的SQL進行分析
相當于創建一個構造器物件,然后講需要查詢or更新的條件寫在里面,最后打包給mapper or service層的插入、更新方法
下圖是Wapper的子類,QueryWrapper和UpdateWrapper是一般的Wrapper,AbstractLambdaWrapper 是lambda語法糖的鏈式操作(兩者選擇一種使用即可)

下圖是wrapper的條件方法,就不一一介紹了,下面舉了六個就基本例子

1、測驗一
@Test
public void testWrapper1() {
//引數是一個wrapper ,條件構造器,和剛才的map對比學習!
//查詢name不為空,email不為空,age大于18的用戶
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.isNotNull("name")
.isNotNull("email")
.ge("age",18);
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
測驗二
@Test
public void testWrapper2() {
//查詢name=wsk的用戶
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","wsk");
//查詢一個資料selectOne,若查詢出多個會報錯
//Expected one result (or null) to be returned by selectOne(), but found: *
//若出現多個結果使用list或map
User user = userMapper.selectOne(wrapper);//查詢一個資料,若出現多個結果使用list或map
System.out.println(user);
}
測驗三
@Test
public void testWrapper3() {
//查詢age在10-20之間的用戶
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age", 10, 20);//區間
Integer count = userMapper.selectCount(wrapper);//輸出查詢的數量selectCount
System.out.println(count);
}
測驗四
@Test
public void testWrapper4() {
//模糊查詢
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.notLike("name","s")
.likeRight("email","qq");//qq% 左和右?
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
測驗五
@Test
public void testWrapper5() {
//模糊查詢
// SELECT id,name,age,email,version,deleted,create_time,update_time
//FROM user
//WHERE deleted=0 AND id IN
//(select id from user where id<5)
QueryWrapper<User> wrapper = new QueryWrapper<>();
//id 在子查詢中查出來
wrapper.inSql("id","select id from user where id<5");
List<Object> objects = userMapper.selectObjs(wrapper);
objects.forEach(System.out::println);
}
測驗六
@Test
public void testWrapper6() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
//通過id進行降序排序
wrapper.orderByDesc("id");
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
CRUD介面
基本配置:
0、創建資料庫
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主鍵ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年齡',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
version INT(10) NOT NULL DEFAULT 1 COMMIT '樂觀鎖版本號',
DELETED INT(10) NOT NULL DEFAULT 0 COMMIT '邏輯洗掉',
CREATE_TIME DATE COMMIT '創建時間',
modify_time DATE COMMIT '更新時間',
PRIMARY KEY (id)
);
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, '工藤新一','[email protected]'),
(2, '毛利蘭','[email protected]'),
(3, '柯南', 28, '[email protected]'),
(4, '灰原哀', 21, '[email protected]'),
(5, '工藤有希子', 24, '[email protected]');
1、創建專案,匯入依賴
<!--spring-boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBootTest-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mysql 驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
2、yaml
#設定開發環境
spring:
datasource:
username: root
password: 123456
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf
#配置日志 log-impl:日志實作
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、創建物體類
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
Long id;
String name;
int age;
String email;
@Version//樂觀鎖version注解
private Integer version;
private Integer isDelete;
@TableField(fill = FieldFill.INSERT)
private Date cTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date upTime;
}
4、寫Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
5、寫Service介面和實作類
//Service介面
public interface UserService extends IService<User> { //別忘了繼承這個父類
}
//實作類
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { //記得繼承父類
}
6、之后就可以測驗了
Mapper CRUD介面
顧名思義這個只有mapper層物件才有的方法
Insert
寫資料庫的時候id設定了主鍵自增的話,插入的時候不需要加入id,因為MP會自動添加并且自增的,
注:資料庫寫了id自增的話,在物體類設定主鍵生成策略是沒用的,因為資料庫設定了自增,資料庫優先級高于代碼
@Test//測驗插入
public void insertTest(){
User user = new User();
user.setName("wsk");
user.setAge(18);
user.setEmail("[email protected]");
Integer result = userMapper.insert(user); //會幫我們自動生成id
System.out.println(result); //受影響的行數
System.out.println(user); //通過日志發現id會自動回填(id是由雪花演算法生成的,在主鍵生成策略部分有講到)
}

資料庫插入的id的默認值為:全域的唯—id
Update
@Test//測驗更新
public void updateTest(){
User user = new User();
user.setId(2L);//怎么改id??
//通過條件自動拼接動態Sql
user.setName("root");
user.setAge(12);
user.setEmail("[email protected]");
int i = userMapper.updateById(user);//updateById,但是引數是個user
System.out.println(i);
}

Select
- 通過id查詢單個用戶
@Test//通過id查詢單個用戶
public void testSelectById(){
User user = userMapper.selectById(1L);
System.out.println(user);
}

- 通過id查詢多個用戶
@Test//通過id查詢多個用戶
public void testSelectBatchIds(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
users.forEach(System.out::println);
//System.out.println(users);
}


- 條件查詢 通過map封裝
@Test//通過條件查詢之一 map(這里的map,相當于where后面的 name="conan"等條件)
public void testMap(){
HashMap<String, Object> map = new HashMap<>();
//自定義要查詢的
map.put("name","www"); //查詢名字是www的資料
map.put("name","111"); //查詢名字是111的資料 最后的結果是取兩者交集
map.put("age",18);
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}


Delete
基本的洗掉任務:

@Test
public void testDeleteById(){
userMapper.deleteById(1359507762519068681L);
}
@Test
public void testDeleteBatchIds(){
userMapper.deleteBatchIds(Arrays.asList(1359507762519068675L,1359507762519068676L));
}
@Test
public void testD(){
HashMap<String, Object> map = new HashMap<>();
map.put("age","18");
map.put("name","lol");
userMapper.deleteByMap(map);
}
Service CRUD介面
顧名思義這是Service層才有的方法
Save
為了區分mapper層和service層的方法,所以service層的插入方法取名為save
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
//插入單條資料
userService.save(user);
// 插入(批量)
userService.saveBatch(Arrays.asList(user));
}
Remove
service層洗掉方法取名為remove
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","毛利小五郎");
userService.remove(wrapper); //根據條件構造器洗掉資料
userService.removeById(16L); //根據id洗掉資料,也可以根據物體類物件洗掉資料
userService.removeByMap(map); //根據map的條件洗掉記錄
userService.removeBatchByIds(Arrays.asList(user)); //批量洗掉
}
Update
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","毛利小五郎")
.ge("age",18);
userService.update(wrapper); //根據條件構造器更新
userService.updateById(user); //根據傳入的物體類id確定需要更新的資料,更新為傳入的物體類物件
userService.updateBatchById(Arrays.asList(user)); //批量更新
}
Get
該方法只能查詢一條資料,所以不推薦,查詢用list方法
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","毛利小五郎")
.ge("age",18);
userService.getById(12L); //根據id查詢一條資料
userService.getMap(wrapper); //根據構造器查詢一條資料,回傳Mapper集合
}
List
查詢多條資料
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","毛利小五郎")
.ge("age",18);
userService.list(); //查詢全部資料
userService.listMaps(); //查詢全部資料,以map形式回傳
userService.listByMap(map); //根據map查詢資料
userService.listByIds(Arrays.asList(10L,15L)); //根據id查詢資料
}
SaveOrUpdate
運行邏輯:直接更新,更新0行的話;就select,查詢出來是0行;則就插入
有傳入id的情況會優先更新,如果更新不了,則會插入新的資料
記得在物體類寫上@TableId!!!
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("name","毛利小五郎")
.ge("age",18);
userService.saveOrUpdate(user); //傳入的物件id存在則更新,否則插入新資料
userService.saveOrUpdate(user,wrapper); //根據更新條件構造器,更細資料
userService.saveOrUpdateBatch(Arrays.asList(user)); //批量修改插入
}
Count
統計符合條件的資料的數量
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","毛利小五郎")
.ge("age",18);
userService.count();
userService.count();
}
Chain
鏈式呼叫,可以不用條件構造器完成 條件設定和增刪改查,推薦!因為優雅!
Query
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","毛利小五郎")
.ge("age",18);
List<User> userList = userService.query()
.eq("name", "工藤新一")
.gt("age", 17)
.list();
for(User user01: userList) {
System.out.println(user);
}
}
Update
@Test
void test(){
User user = new User();
user.setName("Conan");
user.setAge(18);
user.setEmail("毛利偵探事務所");
HashMap<String,Object> map = new HashMap<>();
map.put("name","Conan");
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","毛利小五郎")
.ge("age",18);
userService.update()
.eq("name", "工藤新一")
.gt("age", 17)
.update();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502370.html
標籤:Java
