橙小张的Java后端学习之路

那些书本中没告诉你的MyBatis

2019-01-07  本文已影响5人  橙小张

不管是《MyBatis从入门到精通》,还是21天精通MyBatis,都告诉了你怎么做?但是没告诉你为什么以及是什么。
本篇将会讲解MyBatis(Spring-MyBatis)的一些关键类,以及关于DB操作的内容

关键类

如何访问数据库

mysql -uadmin -pxxx -h58.87.87.129 -P32007

当我们需要连接MySQL时,需要用到几个属性:

这在MySQL中叫一次会话(session),在JDBC中JDBC定义了规范,其实现类具体去操作,在MyBatis中,MyBatis的关键类SqlSession定义了如何去操作数据库,例如:

具体的实现类有:

当然我们都不会直接使用这几个实现类,我们一般是这样的:

public class UserService {
    
    @Resource
    private UserMapper userMapper;
}

那这其中究竟是怎么做到这样简化的呢?

实现细节

SqlSessionFactoryBean&SqlSessionFactory

上面介绍了关键类SqlSession, 那如何创建SqlSession呢?MyBatis使用了工厂方法来创建SqlSession,由于工厂和SqlSession是一对多的关系,也就是说一个Factory可以创建多个SqlSession,MyBatis-Spring将SqlSessionFactory放入了容器的生命周期中,也就出现了SqlSessionFactoryBean,我们一般这样配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
</bean>

MapperFactoryBean

大家都知道MyBatis是基于Mapper的,一般情况MyBatis的一个Mapper就对应一张DB的Table,就有了

那MapperFactoryBean是干什么用的呢?

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

到目前为止,我们没有定义mapper.xml文件,但是我们可以这样用了

public interface UserMapper {
  @Select("SELECT * FROM users WHERE id = #{userId}")
  User getUser(@Param("userId") String userId);
} 

AND

public class FooServiceImpl implements FooService {

private UserMapper userMapper;

public void setUserMapper(UserMapper userMapper) {
  this.userMapper = userMapper;
}

public User doSomeBusinessStuff(String userId) {
  return this.userMapper.getUser(userId);
}
}

但是只用注解的话面对繁杂的SQL,会显得代码凌乱,就出现了使用xml来描述SQL(当然其他的ORM甚至可以使Markdown),MyBatis要知道SQL文件在哪里有两种方式:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>

MapperScannerConfigurer

在上面的方法中,我们需要把Mapper当做Service的Bean中的属性设置进去,这样显得太麻烦了,就有了MapperScannerConfigurer

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
上一篇 下一篇

猜你喜欢

热点阅读