Spring框架(五)实战Spring整合Mybatis

基于:【狂神说Java】Spring5最新完整教程IDEA版通俗易懂

1 Mybatis回顾

可以参考:MyBatis(一)第一个MyBatis程序(idea+maven)

使用原生mybatis的一般性流程:

  1. 使用maven导入mybatis、mysql依赖包;
  2. 配置mybatis-config.xml文件,包括数据库信息、注册mapper等;
  3. 编写一个MybatisUtils类,用来从.xml加载数据源,返回SqlSession对象;
  4. 编写业务Mapper接口;
  5. 编写Mapper配置文件,编写相应的SQL业务逻辑;
  6. 测试使用:获得sqlSession对象,获得mapper,调用mapper方法返回结果;

2 Spring使用Mybatis

由于Spring的IoC功能,所有的对象都交给Spring去管理,所以原生mybatis的对象也需要交给Spring去管理,不再使用new关键字去创建对象,而采用bean;

2.1 spring-dao.xml配置

2.1.1 dataSource

<!--数据源,代替MybatisUtils.java的数据库链接类-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/datasets?useSSL=false&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=UTC"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

以上代码将数据源注册为对象,类似于原生的从xml加载资源:
InputStream inputStream = Resources.getResourceAsStream(resource)

2.1.2 sqlSessionFactory

<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!--mybatis配置文件-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

sqlSessionFactory注册为对象,类似于原生的创建工厂:
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2.1.3 sqlSession

<!--sqlSession-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

获得sqlSession,类似于原生的sqlSessionFactory.openSession(),此处的SqlSessionTemplate实现了SqlSession 接口。

2.2 测试使用

和原生mybatis一样的使用方法:

public void springAllUsersGet(){
    //读入配置
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
    SqlSession sqlSession = context.getBean("sqlSessionTemplate",SqlSession.class);
    //建立映射
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    for (User user : mapper.getAllUsers()) {
        logger.debug(user);
    }
}

问题来了,既然Spring的设计理念是IoC,那么在以上使用的时候mappersqlSession之间的关系,也是属于依赖注入,mapper实例对象也可以交给Spring去管理,用户只关心从context拿就行。

2.2.1 Mapper实现类

public class UserMapperImpl implements UserMapper{
    private SqlSessionTemplate sqlSessionTemplate;

    //set进来
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    @Override
    public List<User> getAllUsers() {
        UserMapper mapper=sqlSessionTemplate.getMapper(UserMapper.class);
        return mapper.getAllUsers();
    }
}

2.2.2 Mapper注册bean

<bean id="userMapper" class="dao.UserMapperImpl">
    <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>

2.2.3 测试使用

@Test
public void springAllUsersGet() {
    //读入配置
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
    //获得
    UserMapper mapper = context.getBean("userMapper",UserMapper.class);
    //获得
    for (User user : mapper.getAllUsers()) {
        logger.debug(user.toString());
    }
}

可以注意到,直接从context上下文就获得了bean对象,直接使用,耦合性大大降低;
但是注意:设计接口和编写Mapper对应的sql语句是必须的,这是mybatis的核心,并且需要使用<property name="configLocation" value="classpath:mybatis-config.xml"/>导入进去,spring-mybatis仅仅是提供了一种优雅的对象管理机制而已。

2.3 使用SqlSessionDaoSupport

2.3.1 接口实现

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public List<User> getAllUsers() {
        return getSqlSession().getMapper(UserMapper.class).getAllUsers();
    }
}

继承了SqlSessionDaoSupport,可以直接获得SqlSession,不用在spring中配置SqlSession的bean;

2.3.2 配置注册Bean

<bean id="userMapper" class="dao.UserMapperImpl2">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

注意:使用sqlSessionFactory注入是UserMapperImpl实现类,跨过了SqlSession

3 总结

使用Spring去整合Mybatis主要就是利用了Spring IoC的思想,把一些配置类直接在Spring配置文件中进行注册成Bean,让程序更多的关注业务逻辑实现,而不是一堆获取数据库的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值