Spring整合mybatis

思想是跟使用mybatis一样的。

  • 编写数据源

  • Spring注入sqlsessionFactory

  • Spring注入sqlSessionTemplate

  • 需要给接口添加实现类

  • 将实现类注入到Spring中

  • 测试

  1. 官方文档:http://mybatis.org/spring/zh/index.html

  2. 需要用到的依赖:junit、mybatis、mysql-connection、spring-mvc(它包含了很多依赖包)、aspectjweaver、mybatis-spring,spring-jdbc

  3. <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.5</version>
        </dependency>
    
    </dependencies>
    
  4. 新建application.xml,导入mybatis的配置xml

  5. <?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="spring-mybatis.xml"/> 
    </beans>
    
  6. 编写spring-mybatis.xml,思路:

  7. 配置引用外部数据

  8. 注入数据源的bean,注意设置驱动

  9. 注入sqlSessionFactory的bean,注意绑定spring-mybatis.xml,绑定mapper(也可不绑定mapper)

  10. <?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>
        <!--注意设置的顺序-->
        <!--引入外部配置文件-->
        <properties resource="db.properties"/>
        <!--mybatis设置-->
        <settings>
            <!--文档官网查看功能解释https://mybatis.org/mybatis-3/zh/configuration.html#settings-->
            <setting name="mapUnderscoreToCamelCase" value="false"/>
            <!--日志打印,可设置别的日志,参考官网文档-->
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
        <!--可设置别名-->
        <typeAliases>
            <!--规定javaBean的别名,可在mapper.xml中直接使用别名-->
            <!-- <typeAlias type="pojo.User" alias="User"/>-->
            <!--自动扫描包,包下的javaBean自动设置别名,使用时使用类名的首字母小写即可,可用注解@Alis方式给Javabean起别名-->
            <package name="pojo"/>
        </typeAliases>
    
    </configuration>
    
  11. 注入sqlSession的Bean,注意SqlSessionTemplate的参数注入参数是用构造方法即注入sqlSessionFactory

  12. <?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">
            <!--导入外部数据库配置文件:多个文件使用逗号隔开,同属性名,取加载在最后的那个属性-->
            <context:property-placeholder location="classpath:db.properties"/>
            <!--使用spring的数据源替换mybatis的配置 c3p0 dbcp
                使用Spring提供的jdbc:org.springframework.jdbc.dataSource.DriverManagerDataSource
            -->
            <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                <property name="driverClassName" value="${jdbcDriver}"/>
                            <property name="url" value="${jdbcUrl}"/>
                            <property name="username" value="${jdbcUsername}"/>
                            <property name="password" value="${jdbcPassword}"/>
            </bean>
            <!--注册sqlSessionFactory-->
            <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                <property name="dataSource" ref="dataSource"/>
                <!--绑定Mybatis的配置文件-->
                <property name="configLocation" value="classpath:mybatis-config.xml"/>
                <property name="mapperLocations" value="classpath:dao/UserMapper.xml"/>
            </bean>
            <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
                <!--注入sqlFactory,无set方法,查看SqlSessionTemplate原码-->
                <constructor-arg index="0" ref="sqlSessionFactory"/>
            </bean>
    </beans>
    
  13. 给接口添加实现类,因为session要交给spring管理,要写个实现类注入spring,调用session,执行sql

//UserMapper接口
package dao;

import org.apache.ibatis.annotations.Param;
import pojo.User;

public interface UserMapper {
    User getUserById(@Param("id") int id);
}
//UserMapper接口实现类
package dao;

import org.mybatis.spring.SqlSessionTemplate;
import pojo.User;

/**
 * @Author: nsk
 * @Description:
 * @Date: create in 2021/4/14 20:46
 */

public class UserMapperImpl implements UserMapper{

    //所有操作用session执行,现在使用sessionTemplate执行
    private SqlSessionTemplate sessionTemplate;
    //要在spring配置中生效注入,必须写set方法
    public void setSessionTemplate(SqlSessionTemplate sessionTemplate) {
        this.sessionTemplate = sessionTemplate;
    }

    public User getUserById(int id) {
        UserMapper mapper = sessionTemplate.getMapper(UserMapper.class);
        return mapper.getUserById(id);
    }
}
```
  1. UserMapper.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可以使用mybatis-config中的alis别名-->
<mapper namespace="dao.UserMapper">
    <select id="getUserById" resultType="user">
        select * from user where id = #{id}
    </select>

</mapper>
```
  1. applicationContext.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">
    <import resource="spring-mybatis.xml"/>
    <!--spring要管理sqlSession,要写个实现类注入spring-->
    <bean id="UserMapperImpl" class="dao.UserMapperImpl">
        <property name="sessionTemplate" ref="sqlSession"/>
    </bean> 
</beans>
```
  1. 测试,因为我们是用spring管理,所以要先使用applicationContext.xml,使用里面的bean

@Test
public void getUser(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserMapper mapper = context.getBean(UserMapperImpl.class);
    User user = mapper.getUserById(2);
    System.out.println(user);
}
```

更加简单的方法:使用mybatis提供的类

  1. 实现类使用继承的方式:

  2. package dao;
    
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    import pojo.User;
    
    /**
     * @Author: nsk
     * @Description:
     * @Date: create in 2021/4/14 20:46
     */
    
    public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{ 
    
        public User getUserById(int id) {
            return getSqlSession().getMapper(UserMapper.class).getUserById(id);
        }
    }
    
  3. 其实继承的这个类原码中跟我们上面的方法做了同样的事情,创建SqlSessionTemplate,然后调用

  4. 然后可以使用getSession()获取session

  5. 注意:如果使用这个方式的话,那在spring中注册UserMapperImpl2的bean的时候是使用set方法注入SqlSessionFactory的。因为我们本来要在实现类中注入session,但是我们使用这个方式,他使用了set设置SqlSessionFactory,所以我们要给实现类注入SqlSessionFactory

  6. <?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="spring-mybatis.xml"/>
        <!--spring要管理sqlSession,要写个实现类注入spring-->
        <bean id="UserMapperImpl" class="dao.UserMapperImpl">
            <property name="sessionTemplate" ref="sqlSession"/>
        </bean>
        <bean id="UserMapperImpl2" class="dao.UserMapperImpl2">
            <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        </bean>
    </beans>
    
  7. 测试

   @Test
   public void getUser2(){
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       UserMapper mapper = context.getBean(UserMapperImpl2.class);
       User user = mapper.getUserById(2);
       System.out.println(user);
   }
   ```