mapper, service

首先有定义接口UserService, 接口中的方法名为getUserById(id), getUserByName(String name), registerUser(UserInfo user)这种.

然后,有如下目录:

1
2
3
4
5
com.springbootbasic.user
mapper
UserMapper
service
UserServiceImpl

mapper

mapper中的 接口UserMapper中就是 mybatis 对应的方法,这个接口需要@Mapper注解,接口中的方法一般都用@Select, @Insert, etc.注解;这些注解中写的就是要执行的sql; 至于这些方法本身,其中的参数用@Param注解; e.g.

example1:

1
2
@Select("select id, real_name as realName from table_user where id = #{id}")
UserInfo getUserById(@Param("id")int id);

看出来:

  1. 本身参数是int id, 前面用@Param("id")对应的是UserInfo类中定义的字段id;
  2. mybatis注解中的参数,也就是对应注解的方法中的参数,要用#{ }修饰
  3. 因为real_name是表中的字段, realNameUserInfo类中定义的字段,所以是real_name as realName

example2:

1
2
@Insert("insert into table_user (username, password)" + "values" (#{u.username}, #{u.password}))
void registerUser(@Param("u") UserInfo userInfo);

从上面的方法看出来,mybatis注解中#{}修饰的参数,就是被注解的方法中的@Param的参数

service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class UserServiceImpl implements UserService.Iface {

@Autowired
private UserMapper userMapper;

@Override
public UserInfo getUserById(int id) throws TException {
return userMapper.getUserById(id);
}

@Override
public void registerUser(UserInfo userInfo) throws TException {
userMapper.registerUser(userInfo);
}
}

这样分层的思路就表现的很好:

  1. mybatis作为半ORM框架,写sql,对数据库进行操作,一切都在mapper的interface中;
  2. 而真正的业务逻辑, i.e. 这里的查询过程,都是在service层中;具体表现为@Autowiredmapper,调用mybatis接口中调用的方法查询。这里直接简单地传递参数就行了,因为定义内容都在mapper

irrelevant

虽然和 springboot中整合使用mybatis不相关,但是也不能忽视: 属于那种并没有什么技术含量,但是如果不知道就可能花很多时间但是都徒劳无功的问题:

Q: pom.xml中导入各种dependency,但是import之后idea仍然全红,怎么办?

A: File > Invalidate Caches/Restart. Done.