Spring学习(九)Spring整合Mybatis

spring整合mybatis

导入相关jar包

  • junit
  • mybatis
  • mysql
  • spring
  • aop织入
  • mybatis-spring
  • lombok【非必要】

mybatis使用步骤

这部分不理解的可以先去学习mybatis:mybatis专栏

  1. 编写实体类

    package com.hj.pojo;
    import lombok.Data;
    @Data
    public class User {
        private int id;
        private String name;
        private String pwd;
    }
    
  2. 编写核心配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <typeAliases>
            <package name="com.hj.pojo"/>
        </typeAliases>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper class="com.hj.mapper.UserMapper"/>
        </mappers>
    </configuration>
    
  3. 编写接口

    package com.hj.mapper;
    import com.hj.pojo.User;
    import java.util.List;
    public interface UserMapper {
        public List<User> selectUser();
    }
    
  4. 编写Mapper.xml

    UserMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org/DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--核心配置文件-->
    <mapper namespace="com.hj.mapper.UserMapper">
        <select id="selectUser" resultType="user">
            select * from mybatis.user;
        </select>
    </mapper>
    
  5. 测试

    import com.hj.mapper.UserMapper;
    import com.hj.pojo.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    public class MyTest {
        @Test
        public void test() throws IOException {
            String resources = "mybatis-config.xml";
            InputStream in = Resources.getResourceAsStream(resources);
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
            SqlSession sqlSession = sessionFactory.openSession(true);
    
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = mapper.selectUser();
            for (User user : userList) {
                System.out.println(user);
            }
        }
    }
    

mybatis整合

首先给一个mybatis-spring的文档:mybatis-spring

整合方式一

首先在刚刚的mybatis项目里引入spring。在resources里面新建一个spring-dao.xml(名称不重要)作为spring的配置文件,我们首先把mybatis的sqlSessionFactory对象交给spring托管。同时也将mybatis中的数据源替换成spring的数据源。这样可以把mybatis的配置文件完全用spring的配置文件来代理,把内容都放到bean里

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--DataSource:使用spring的数据源替换mybatis的配置 c3p0 dbcp druid
    我们这里使用spring提供的jdbc
    有了这段后,可以把mybatis-config.xml里的environments标签以及内容都删除
    -->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <!--sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="datasource"/>
        <!--绑定mybatis配置文件,这里可以写mybatis-config.xml里的内容,包括起别名等等-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--有了这段后,可以把mybatis-config.xml里的mapper标签以及内容都删除-->
        <property name="mapperLocations" value="classpath:com/hj/mapper/*.xml"/>

    </bean>
</beans>

这样其实就已经很完备了。我们只需要写一个UserMapper实现类:

public class UserMapperImpl implements UserMapper {
    //我们所有的操作,在mybatis的时候都使用sqlSession来执行,现在都使用SqlSessionTemplate执行
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    public List<User> selectUser() {
        return sqlSession.getMapper(UserMapper.class).selectUser();
    }
}

然后我们可以把UserMapperImpl类也交给spring托管,然后根据set方法注入我们在spring的bean中注册的sqlSession就可以使用了!

<!--这就是mybatis里的sqlSession,有了以后就不需要自己再去new sqlSession对象了-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <!--这里只能用构造器注入sqlSessionFatory,因为源码里没有set方法,但有构造方法-->
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

<!--我们把UserMapper的实现类也放到spring中管理,这样直接使用就好了-->
<bean id="userMapper" class="com.hj.mapper.UserMapperImpl">
    <property name="sqlSession" ref="sqlSession"/>
</bean>

这样一来我们的spring-dao.xml就完整了。直接再开一个测试类:

public class MyTest {
    @Test //spring使用方法
    public void test2(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
        UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
        List<User> userList = userMapper.selectUser();
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

可以看到结果和mybatis的是一样的,成功使用spring整合了mybatis。我们不需要去写mybatis的配置文件了,也不需要去new sqlSession了。转而在类里直接使用sqlSessionTemplate当做mybatis里的sqlSession来使用就可以了。最后把类也托管给spring。就可以直接使用该对象了!

由此,我们整合的步骤为:

1.在spring中编写数据源配置(替换掉mybatis里的)

<!--DataSource:使用spring的数据源替换mybatis的配置 c3p0 dbcp druid
我们这里使用spring提供的jdbc
有了这段后,可以把mybatis-config.xml里的environments标签以及内容都删除
-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>

2.sqlSessionFactory交给spring托管 这里托管的时候要求注入数据源属性,也就是1的内容

<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="datasource"/>
    <!--绑定mybatis配置文件,这里可以写mybatis-config.xml里的内容,包括起别名等等-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!--有了这段后,可以把mybatis-config.xml里的mapper标签以及内容都删除-->
    <property name="mapperLocations" value="classpath:com/hj/mapper/*.xml"/>
</bean>

3.sqlSessionTemplate(就是mybatis里的sqlSession) 这里托管的时候要求注入sqlSessionFactory,也就是2的内容

<!--这就是mybatis里的sqlSession,有了以后就不需要自己再去new sqlSession对象了-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <!--这里只能用构造器注入sqlSessionFatory,因为源码里没有set方法,但有构造方法-->
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

4.给接口加实现类(实现类里使用sqlSessionTemplate对象) 和mybatis一样,直接使用sqlSessionTemplate就完事了。这个sqlSessionTemplate对象可以无缝代替mybatis里的sqlSession对象。而且sqlSessionTemplate还是线程安全的,可以在多个DAO或映射器使用。

public class UserMapperImpl implements UserMapper {
    //我们所有的操作,在mybatis的时候都使用sqlSession来执行,现在都使用SqlSessionTemplate执行
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    public List<User> selectUser() {
        return sqlSession.getMapper(UserMapper.class).selectUser();
    }
}

5.将自己的实现类注入到spring中 这里是spring的内容了,IOC容器思想

<!--我们把UserMapper的实现类也放到spring中管理,这样直接使用就好了-->
<bean id="userMapper" class="com.hj.mapper.UserMapperImpl">
    <property name="sqlSession" ref="sqlSession"/>
</bean>

6.直接在spring容器中拿对象

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
List<User> userList = userMapper.selectUser();
for (User user : userList) {
    System.out.println(user);
}

整合方式二 sqlSessionDaoSupport

SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法。现在利用这个,我们连sqlSession都不需要写了。

新建一个UserMapperImpl2.java文件:

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    public List<User> selectUser() {
        SqlSession sqlSession = getSqlSession();
        return sqlSession.getMapper(UserMapper.class).selectUser();
    }
}

我们连sqlSession都不需要配置了,直接就可以获取到sqlSession对象,然后如mybatis一般使用即可!

然后再把这个UserMapperImpl2对象注册到bean里。

<bean id="userMapper2" class="com.hj.mapper.UserMapperImpl2">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

然后直接测试!

@Test //SqlSessionDaoSupport
public void test3(){
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
    UserMapper userMapperImpl2 = context.getBean("userMapper2", UserMapper.class);
    List<User> userList = userMapperImpl2.selectUser();
    for (User user : userList) {
        System.out.println(user);
    }
}

方式二其实就是省略了spring配置文件中把sqlSessionTemplate注册到bean里的步骤,直接在实现类里继承SqlSessionDaoSupport就可以直接获得sqlSession对象。

本章节代码

spring-11

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值