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 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/heguiliang_123/article/details/84178341