1. 程式人生 > >springboot中使用Mybatis註解配置詳解

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!