11.Spring整合Mybatis

11.Spring整合Mybatis

11.1 搭建基礎環境(跟着官網走)

第一步:導入相關依賴java

 <dependencies>
     <!--junit單元測試-->
     <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.20</version>
     </dependency>
     <!--mybatis-->
     <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.5.5</version>
     </dependency>
     <!--spring整合mybatis-->
     <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis-spring</artifactId>
         <version>2.0.5</version>
     </dependency>
     <!--日誌-->
     <dependency>
         <groupId>log4j</groupId>
         <artifactId>log4j</artifactId>
         <version>1.2.17</version>
     </dependency>
     <!--spring全套-->
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-webmvc</artifactId>
         <version>5.2.7.RELEASE</version>
     </dependency>
     <!--spring操做數據庫-->
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>5.2.7.RELEASE</version>
     </dependency>
     <!--織入(切入點表達式)-->
     <dependency>
         <groupId>org.aspectj</groupId>
         <artifactId>aspectjweaver</artifactId>
         <version>1.9.5</version>
     </dependency>
 </dependencies>

 

第二步: 將SqlSessionFactory注入到springIOC容器中mysql

  • 因爲spring要接管mybatis的SqlSessionFactory類因此須要注入到spring中web

  • name屬性能夠指定mybatis相關配置文件的路徑spring

 <!--可以使用 SqlSessionFactoryBean來建立 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="com/xuan/mapper/UserMapper.xml"/>
     <!--起別名-->
     <property name="typeAliases" value="com.xuan.pojo.User"/>
 </bean>

 

第三步:SqlSessionFactory又關聯到DataSource數據源,因此咱們也須要將DataSource注入到spring中sql

  • 這裏用的是Spring的數據源數據庫

  • 與此同時能夠刪除mybatis主配置文件的數據源apache

 <!--用spring的數據源配置mybatis的配置-->
 <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?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
     <property name="username" value="root"/>
     <property name="password" value="root"/>
 </bean>

 

第四步:有了SqlSessionFactory,咱們能夠用它建立功能幾乎與SqlSession相等的SqlSessionTemplatesession

  • 因爲該類沒有set注入因此咱們須要經過構造方法注入來建立sqlSessionTemplate對象並加入到springIOC容器中mybatis

 <!--SqlSessionTemplate等價於咱們使用的SqlSession-->
 <!--因爲沒有set注入 因此咱們使用構造方法注入-->
 <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
     <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
 </bean>

 

第五步:編寫UserMapper的實現類以將UserMapper實現類對象注入SpringIOC得到SqlSessionTemplate來執行方法mvc

  • 經過set方法將SqlSessionTemplate注入進來

  • 調用SqlSessionTemplate參數執行方法

 package com.xuan.mapper;
 
 import com.xuan.pojo.User;
 import org.mybatis.spring.SqlSessionTemplate;
 
 import java.util.List;
 
 /**
  * xuan
  * 2020/7/16
  * 1870136088@qq.com
  **/
 public class UserMapperImpl implements UserMapper{
     private SqlSessionTemplate sqlSessionTemplate;
 
     public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
         this.sqlSessionTemplate = sqlSessionTemplate;
    }
 
     @Override
     public List<User> findAll() throws Exception {
         UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
         return mapper.findAll();
    }
 
     @Override
     public User findById(Integer id) throws Exception {
         return null;
    }
 }

 

第六步:將UserMapperImpl注入到springIOC容器中

 <!--編寫實現類將SqlSessionTemplate注入-->
 <bean id="userMapperImpl" class="com.xuan.mapper.UserMapperImpl">
     <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
 </bean>

 

第七步:編寫測試

 public class UserMapperTest2 {
 
     @Test
     public  void testFindAll() throws Exception {
 
         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
         UserMapper users = context.getBean( "userMapperImpl",UserMapperImpl.class);
         for (User user : users.findAll()) {
             System.out.println(user);
        }
    }
 
 }

-------------------------------測試成功----------------------------------

 

Spring整合Mybatis方法二

  • 關鍵類:SqlSessionDaoSupport

  • SqlSessionDaoSupport 是一個抽象的支持類,用來爲你提供 SqlSession。調用 getSqlSession() 方法你會獲得一個 SqlSessionTemplate,以後能夠用於執行 SQL 方法

代碼實現:

 package com.xuan.mapper;
 
 import com.xuan.pojo.User;
 import org.apache.ibatis.session.SqlSession;
 import org.mybatis.spring.SqlSessionTemplate;
 import org.mybatis.spring.support.SqlSessionDaoSupport;
 
 import java.util.List;
 
 public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
     @Override
     public List<User> findAll() throws Exception {
         UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
         return mapper.findAll();
    }
 
 }

關鍵配置:

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

 

 

總結:其實兩個整合方式本質上都是同樣的,咱們能夠看一下SqlSessionDaoSupport 類的源碼。

  • private SqlSessionTemplate sqlSessionTemplate;一樣都是注入SqlSessionTemplate

  • 而且對其是否存在作出判斷不存在則建立(經過sqlSessionFactory建立)這也是爲何咱們第二次設置實現類屬性的時候是SqlSessionFactory

 public abstract class SqlSessionDaoSupport extends DaoSupport {
 
   private SqlSessionTemplate sqlSessionTemplate;
 
   /**
    * Set MyBatis SqlSessionFactory to be used by this DAO. Will automatically create SqlSessionTemplate for the given
    * SqlSessionFactory.
    *
    * @param sqlSessionFactory
    *         a factory of SqlSession
    */
   public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
     if (this.sqlSessionTemplate == null || sqlSessionFactory != this.sqlSessionTemplate.getSqlSessionFactory()) {
       this.sqlSessionTemplate = createSqlSessionTemplate(sqlSessionFactory);
    }
   public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
       this.sqlSessionTemplate = sqlSessionTemplate;
  }
 }
相關文章
相關標籤/搜索