mybatis-spring-boot-starter 使用

187 阅读2分钟

前言

mybatis-spring-boot-starter出来有一段时间了,一直没机会用.最近正好有时间, 想尝试看看有没有什么亮点,并记录一下期间遇到的问题.

使用

1. 添加dependency

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.3</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.23</version>
</dependency>

我这里使用的是2.1.3 你可以使用其他版本.

2. 添加数据库配置

spring:
  dataSource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
    username: root
    password: 123456

因为我是用mysql 8.0.13,所以driver-class-name 设置为 com.mysql.cj.jdbc.Driver. 如果使用5.x, 不需要加cj. 另外,记得加allowPublicKeyRetrieval=true,在我这不加报错Public Key Retrieval is not allowed

2. 添加实体类

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
public class User {
  private int id;
  private String name;
  private String nickName;
  private String password;
  private String salt;
  private String email;
  private String mobile;
  private boolean valid;

}

3. 添加对应Mapper

import com.abc.blog.domain.auth.User;
import org.apache.ibatis.annotations.*;
import java.util.List;

@Mapper
public interface UserMapper {
  @Select("select * from user")
  @Results({
      @Result(column = "nick_name", property = "nickName", javaType = String.class)
  })
  List<User> getAll();

  @Insert("insert into user(id,name,nick_name,password,salt,valid,email,mobile) " +
      "values(#{id},#{name},#{nickName},#{password},#{salt},#{valid},#{email},#{mobile})")
  int add(User user);

}

这里我们把传统的mapper xml文件中的sql跟mapper类进行了整合. mapper类包含了两个方法getAlladd.

getAll方法用@Select()修饰,它接受一个select语句. 如果列名和字段名不一样,可以使用@Results进行说明. 例子中有个字段叫nick_name,对应的属性叫nickName,所以用下面的语句进行说明

@Result(column = "nick_name", property = "nickName", javaType = String.class)

@Results 相当于xml文件中的resultmap标签

add方法用Insert()修饰,它接受一个insert语句. values子句中我们直接用#{属性名}作为字段值.

其他标签还有DeleteUpdate,这里不再单独说明.

注意: 记得给mapper类添加 @Mapper标签. 如果你觉得为每个类添加 @Mapper很麻烦,可以在启动类上加@MapperScan标签. 如:@MapperScan("com.abc.blog.dao"). 如果都不加会报异常: No qualifying bean of type 'com.abc.blog.dao.UserMapper' available

测试

import com.neal.blog.dao.UserMapper;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestUser {
  @Autowired private UserMapper userMapper;

  @Test
  public void testInsert(){
    User user=new User(10002,"tom","tom","123456","1a2b3c","tom@live.com","158123232323",true);
    Assert.assertTrue(userMapper.add(user)==1);
  }
}