spring整合mybatis01

spring整合mybatis

1、mybatis回顾

mybatis的执行过程:

  • 需要有一个UserMapper接口
  • 在同包下写一个与接口名称相同的xml文件
  • 在mybatis的配置文件中注册xml文件
  • 获取sqlsession
  • 获取mapper
  • 执行相应的方法

而Spring整合后,所有的实例都由Spring来统一管理,也就是说mybatis中的sqlsession等都要被注册到Spring中。

2、依赖包

<dependencies>
<!--        单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
<!--        mysql连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
<!--        mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

<!--        spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

<!--        spring操作数据库的话还需要spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

<!--        aop切面-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>

<!--        spring和mybatis整合-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>

    </dependencies>

需要注意的是,由于我的xml文件是写在了与接口同一包下,所以还需要在maven的配置文件中配置资源的扫描:

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

这样就可以扫描到xml文件了。

3、pojo

很简单,一个用户类:

package com.mybatisSpring.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

4、接口及xml

  • 接口:

    package com.mybatisSpring.mapper;
    
    import com.mybatisSpring.pojo.User;
    
    import java.util.List;
    
    public interface UserMapper {
        public List<User> getAllUser();
    }
    
    
  • xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--        //命名空间应该指向一个具体的接口-->
    <mapper namespace="com.mybatisSpring.mapper.UserMapper">
    
        <select id="getAllUser" resultType="user">
            select * from user
        </select>
    
    
    </mapper>
    

5、实现类

由于是Spring接管了所有类,所以需要写一个实现类来实现接口的方法。

package com.mybatisSpring.mapper;

import com.mybatisSpring.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class UserMapperImp implements UserMapper{

    private SqlSessionTemplate sqlSession;

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

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

  • 此处需要注入sqlSession,mybatis官方文档中使用的是SqlSessionTemplate,所以此处我们传入的是一个SqlSessionTemplate对象。

6、mybatis.xml的配置

其实整合之后mybatis中就不用进行太多的配置了,为了能看出来此处是Spring和mybatis的整合,所以留下了一个mybatis的配置文件。此处配置也不多,只是为实体类中的实体起了别名,这里的别名是实体类的首字母小写,例如User的别名就是user:

<?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.mybatisSpring.pojo"/>
    </typeAliases>


</configuration>

7、spring-dao.xml的配置

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

<!--    配置数据源-->
    <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=ture&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/>
        <property name="username" value="root"/>
        <property name="password" value="xinxin520"/>
    </bean>

<!--    配置SQLSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
<!--        关联mybatis-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--        注册xml文件-->
        <property name="mapperLocations" value="classpath:com/mybatisSpring/mapper/*.xml"/>
    </bean>

<!--    配置sqlSession-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--        只能使用构造方法来注入,因为这个类没有set方法-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>


</beans>
  • 在这里最核心的是配置SQLSessionFactor和sqlSession,数据源的配置不只止这一种。

  • SQLSessionFactor

    • 必须配置一个数据源。
    • 关联mybatis也是必须的。
    • 注册xml文件可以在mybatis的配置中完成,此处也可以。
  • sqlSession

    • 该类中没有set方法,所以只能在构造时传入一个sqlSessionFactory。
  • 注意!!!:SQLSessionFactor引用数据源,sqlSession引用SQLSessionFactor,使用的是**ref ** **ref ** **ref **!!!!

8、applicationContext.xml的配置

该处就是接入spring-dao.xml,让spring-dao.xml专注于数据连接的配置,在该xml中则是注册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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <import resource="classpath:spring-dao.xml"/>

    <!--    第一种方式实现mybatis的整合-->
    <!--    注册userdao的实现类-->
    <bean id="userMapperImp" class="com.mybatisSpring.mapper.UserMapperImp">
        <property name="sqlSession" ref="sqlSession"/>
    </bean>

</beans>
  • 注册UserMapper的实现类,该类中需要注入一个SqlSessionTemplate,我们直接将spring-dao.xml中注册的sqlsession注入。

9、测试

import com.mybatisSpring.mapper.UserMapper;
import com.mybatisSpring.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 org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyTest {


    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper mapper = context.getBean("userMapperImp2", UserMapper.class);
        List<User> userList = mapper.getAllUser();
        for (User user : userList) {
            System.out.println(user);
        }
    }

}

结果当然是读出了数据库中的数据:

User{id=1, name='2', pwd='2'}
User{id=2, name='2', pwd='2'}
User{id=3, name='3', pwd='3'}
User{id=4, name='4', pwd='4'}
User{id=5, name='5', pwd='5'}

10、总结

大概的捋一下思路。

1.首先是mybatis中的内容,需要一个接口,一个相应的xml。

2.因为整合了spring,所以另外需写一个实现类实现接口。

3.然后便是在spring-dao.xml中配置mybatis所需的数据源、sqlSessionFactor、sqlsession。

4.接着便是在applicationContext.xml中注册实现类。

5.测试类中从spring容器中取出该类,使用即可。

posted @ 2020-03-09 20:52  Nevesettle  阅读(122)  评论(0编辑  收藏  举报