springboot中使用Mybatis註解配置詳解
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Winter_chen001/article/details/78623700
之前寫了關於Spring boot Mybatis 整合(註解版) 中使用了簡單的註解配置,接下來講解一下更加詳細的配置。
傳參方式
使用不同的傳參方式:
使用@Param
之前博文中的專案使用了這種簡單的傳參方式:
@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(#{name}, #{password}, #{phone})")
int insert(@Param("name") String name, @Param("password") String password, @Param("phone") String phone);
1
2
3
理解: @Param中定義了name對應了sql中的#{name}, password 對應了sql中的#{password}, phone 對應了sql中的 #{phone}。
使用Map
通過Map物件來傳遞引數:
@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(" +
"#{name, jdbcType=VARCHAR}, #{password, jdbcType=VARCHAR}, #{phone, jdbcType=VARCHAR})")
int insertByMap(Map<String, Object> map);
1
2
3
對於Insert語句中需要的引數,我們只需要在map中填入同名的內容即可,具體如下面程式碼所示:
Map<String, Object> map = new HashMap<>();
map.put("name","王五");
map.put("password","23423");
map.put("phone", "13400000000");
userMapper.insertByMap(map);
1
2
3
4
5
使用物件
如果我們使用普通的java物件作為查詢條件的引數:
@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(#{name}, #{password}, #{phone})")
int insertByUser(User user);
1
2
3
只需要語句中的#{name}、#{age}就分別對應了User物件中的name和age屬性。
User u = new User();
u.setName("趙六");
u.setPassword("12312312");
u.setPhone("13888888888");
userMapper.insertByUser(u);
1
2
3
4
5
增刪改查
MyBatis針對不同的資料庫操作分別提供了不同的註解來進行配置,在之前的示例中演示了@Insert,下面針對User表做一組最基本的增刪改查作為示例:
@Select("SELECT * FROM T_USER WHERE PHONE = #{phone}")
User findUserByPhone(@Param("phone") String phone);
@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(#{name}, #{password}, #{phone})")
int insertByUser(User user);
@Update("UPDATE T_USER SET NAME = #{name}, PASSWORD = #{password} WHERE PHONE = #{phone}")
void update(User user);
@Delete("DELETE FROM T_USER WHERE ID = #{id}")
void delete(Integer id);
1
2
3
4
5
6
7
8
9
10
11
進行測試:
package com.winterchen;
import com.winterchen.domain.User;
import com.winterchen.mapper.UserMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisDemo2ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
@Transactional
public void test3(){
userMapper.insert("張三", "123456", "18600000000");
User u = userMapper.findUserByPhone("18600000000");
Assert.assertEquals("123456", u.getPassword());
u.setName("趙六");
u.setPassword("12312312");
userMapper.update(u);
u = userMapper.findUserByPhone("18600000000");
Assert.assertEquals("12312312", u.getPassword());
userMapper.delete(u.getId());
u = userMapper.findUserByPhone("18600000000");
Assert.assertEquals(null, u);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
注意:當使用@Transactional進行了事務管理,在單元測試結束之後會自動回滾,所以,測試跑完之後資料庫中沒有資料。所以只要測試通過了就沒有問題了。
返回結果繫結
對於增、刪、改操作相對變化較小。而對於“查”操作,我們往往需要進行多表關聯,彙總計算等操作,那麼對於查詢的結果往往就不再是簡單的實體物件了,往往需要返回一個與資料庫實體不同的包裝類,那麼對於這類情況,就可以通過@Results和@Result註解來進行繫結,具體如下:
@Results({
@Result(property = "name", column = "NAME"),
@Result(property = "password", column = "PASSWORD"),
@Result(property = "phone", column = "PHONE")
})
@Select("SELECT NAME, PASSWORD, PHONE FROM T_USER")
List<User> findAll();
1
2
3
4
5
6
7
在上面程式碼中,@Result中的property屬性對應User物件中的成員名,column對應SELECT出的欄位名。在該配置中故意沒有查出id屬性,只對User對應中的name,password,phone物件做了對映配置,這樣可以通過下面的單元測試來驗證查出的id為null,而其他屬性不為null:
@Test
@Transactional
public void test4(){
userMapper.insert("張三", "123456", "18600000000");
userMapper.insert("李四", "123456", "13500000000");
List<User> list = userMapper.findAll();
Assert.assertEquals(2, list.size());
}
1
2
3
4
5
6
7
8
9
10
11
12
原始碼:https://github.com/WinterChenS/springboot-mybatis-demo2/
---------------------
來源:CSDN
原文:https://blog.csdn.net/winter_chen001/article/details/78623700
版權宣告:本文為博主原創文章,轉載請附上博文連結!