spring-3-spring整合mybatis

版本和依赖

MyBatis-Spring 需要以下版本:

image-20210507144752542

maven依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.2</version>
</dependency>
        <!--至少有下面一种-->
<!--spring管理的 jdbc ,以及事务相关的-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.17.RELEASE</version>
</dependency>
<!--Druid-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.8</version>
</dependency>

第一种方式

配置数据源参数db.properties

druid.driverClass=com.mysql.cj.jdbc.Driver
druid.jdbcUrl=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8
druid.user=root
druid.password=123456
druid.maxActive=8
druid.minIdle=0

spring核心配置文件(IOC)

<?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:bean="http://mybatis.org/schema/mybatis-spring"
       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://mybatis.org/schema/mybatis-spring
       http://mybatis.org/schema/mybatis-spring.xsd
       http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--
       读取 jdbc.properties 中的内容
            property-placeholder: 占位符
            location: 属性文件的位置
    -->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--
        扫描包下的类注册到IOC容器中去
    -->
    <context:component-scan base-package="com.wang"/>

    <!-- 1、 获得数据库连接池对象,并交由 spring 同一管理,在mybatis配置文件中就不需要再配置了 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

        <!-- 连接数据库的驱动,连接字符串,用户名和登录密码-->
        <property name="driverClassName" value="${druid.driverClass}"/>
        <property name="url" value="${druid.jdbcUrl}"/>
        <property name="username" value="${druid.user}"/>
        <property name="password" value="${druid.password}"/>

        <!-- 数据池中最大连接数和最小连接数-->
        <property name="maxActive" value="${druid.maxActive}"/>
        <property name="minIdle" value="${druid.minIdle}"/>
    </bean>

    <!--2、获取 SqlSessionFactory 对象,并交由 spring 管理,取代了下面的代码-->
    <!--
        InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入连接池
         给 sqlsessionFactory 的属性 dataSource 赋值
            ref="引用该 spring容器 中的另一个 bean的id"
        -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 注入 映射文件 mapper
         给 sqlsessionFactory 的属性 mapperLocation 赋值
           value="映射文件 XXXmapper.xml 的相对路径"
          -->
        <property name="mapperLocations" value="classpath:com/wang/dao/xml/*.xml"/>
        <property name="typeAliasesPackage" value="com.wang.entity"/>
        <!--上面是完全spring取代mybatis-config配置文件,下面这行还可以加载mybatis-->
        <!--property name="configLocation" value="classpath:mybatis-config.xml"/>-->
    </bean>


    <!-- 3、 获取 SqlSession 对象,并交由 spring 管理  用SqlSessionTemplate得到的SqlSession可以不用我们自己操心事务的管理,以及关闭操作-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <!-- 给 SqlSessionTemplate 的构造函数赋值-->
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>

</beans>

多了一个service的层(用来直接获取Mapper接口实例化好的对象,直接调用对应的方法)

//使用这个类之前需要先传入一个从spring配置文件中得到的sqlSessionTemplate对象
//我们这里一般在springIOC容器中帮助注入
@Service
public class EmployeeService {
    @Autowired
    private SqlSession sqlSession;

    public List<Department> getAllEmployee(){
        DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
        return mapper.selectByExample(null);
    }
}

测试调用:

@org.junit.Test
public void test1(){
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Application.xml");
    EmployeeMapperImpl employeeMapperImpl = context.getBean("EmployeeMapperImpl", EmployeeMapperImpl.class);
    List<Employee> employees = employeeMapperImpl.queryEmployees();
    Iterator<Employee> iterator = employees.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

第二种方式

主要在service层发生了修改

@Component
public class EmployeeMapperImpl extends SqlSessionDaoSupport implements EmployeeMapper {
    //我们这里直接继承sqlSessionDaoSupport,使用里面的getSqlSession方法直接获取sqlSession
    //而不是用DI的方式取注入sqlSession
    private SqlSession sqlSession = getSqlSession();

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

    public List<Employee> queryEmployees() {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        return mapper.queryEmployees();
    }

不需要DI之后

我们就不需要再IOC容器中管理这些Service层了

  • 便于管理
  • 便于事务操作

在Application.xml核心配置文件中:

  • 我们不需要再把sqlsessiontemplate也放入到IOC容器中了
  • 但是在我们的service层类中仍需要放到IOC容器中,不过只需要再注入sqlSessionFactory类就可以了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
username = root
password = 123456-->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

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

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

<!--    <bean id="EmployeeMapper" class="com.wang.service.EmployeeMapperImpl">-->
<!--        <property name="sqlSession" ref="sqlSession"/>-->
<!--    </bean>-->

    <bean id="userEmployeeMapper" class="com.wang.service.EmployeeMapperImpl2">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
</beans>
posted @ 2021-06-07 15:58  Coder-Wang  阅读(41)  评论(0编辑  收藏  举报