Spring Boot中使用MyBatis注解配置详解

传参方式

下面经过几种不一样传参方式来实现前文中实现的插入操做。java

使用@Param

在以前的整合示例中咱们已经使用了这种最简单的传参方式,以下:数据库

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);

这种方式很好理解,@Param中定义的name对应了SQL中的#{name}age对应了SQL中的#{age}
app

使用Map

以下代码,经过Map<String, Object>对象来做为传递参数的容器:单元测试

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})")
int insertByMap(Map<String, Object> map);

对于Insert语句中须要的参数,咱们只须要在map中填入同名的内容便可,具体以下面代码所示:测试

Map<String, Object> map = new HashMap<>();
map.put("name", "CCC");
map.put("age", 40);
userMapper.insertByMap(map);

使用对象

除了Map对象,咱们也可直接使用普通的Java对象来做为查询条件的传参,好比咱们能够直接使用User对象:spa

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insertByUser(User user);

增删改查

MyBatis针对不一样的数据库操做分别提供了不一样的注解来进行配置,在以前的示例中演示了@Insert,下面针对User表作一组最基本的增删改查做为示例:code

public interface UserMapper {

    @Select("SELECT * FROM user WHERE name = #{name}")
    User findByName(@Param("name") String name);

    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    int insert(@Param("name") String name, @Param("age") Integer age);

    @Update("UPDATE user SET age=#{age} WHERE name=#{name}")
    void update(User user);

    @Delete("DELETE FROM user WHERE id =#{id}")
    void delete(Long id);
}

在完成了一套增删改查后,不妨咱们试试下面的单元测试来验证上面操做的正确性:对象

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Transactional
public class ApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    @Rollback
    public void testUserMapper() throws Exception {
        // insert一条数据,并select出来验证
        userMapper.insert("AAA", 20);
        User u = userMapper.findByName("AAA");
        Assert.assertEquals(20, u.getAge().intValue());
        // update一条数据,并select出来验证
        u.setAge(30);
        userMapper.update(u);
        u = userMapper.findByName("AAA");
        Assert.assertEquals(30, u.getAge().intValue());
        // 删除这条数据,并select验证
        userMapper.delete(u.getId());
        u = userMapper.findByName("AAA");
        Assert.assertEquals(null, u);
    }
}

返回结果的绑定

对于增、删、改操做相对变化较小。而对于“查”操做,咱们每每须要进行多表关联,汇总计算等操做,那么对于查询的结果每每就再也不是简单的实体对象了,每每须要返回一个与数据库实体不一样的包装类,那么对于这类状况,就能够经过@Results@Result注解来进行绑定,具体以下:blog

@Results({
    @Result(property = "name", column = "name"),
    @Result(property = "age", column = "age")
})
@Select("SELECT name, age FROM user")
List<User> findAll();

在上面代码中,@Result中的property属性对应User对象中的成员名,column对应SELECT出的字段名。在该配置中故意没有查出id属性,只对User对应中的name和age对象作了映射配置,这样能够经过下面的单元测试来验证查出的id为null,而其余属性不为null:get

@Test
@Rollback
public void testUserMapper() throws Exception {
    List<User> userList = userMapper.findAll();
    for(User user : userList) {
        Assert.assertEquals(null, user.getId());
        Assert.assertNotEquals(null, user.getName());
    }
}
相关文章
相关标签/搜索