Spring整合Mybatis
(本文是我看着官方文檔寫的,建議對照官方文檔食用,香慘了http://mybatis.org/spring/zh/index.html)
打開官方文檔會發現會先找到一段話“MyBatis-Spring 會幫助你將 MyBatis 代碼無縫地整合到 Spring 中。”,這便是Mybatis-Spring的作用。
1.版本問題:
在官方文檔的簡介,基礎知識部分有了詳細介紹:
Mybatis-Spring | Mybatis | Spring框架 | Spring Batch | Java |
2.0 | 3.5+ | 5.0+ | 4.0+ | Java8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java6+ |
2.入門:
如果使用的是Maven,直接在pom.xml中加入一下依賴即可。
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency>
(這只是mybatis-spring的依賴,還需要junit、mysql、spring-mvc、spring-jdbc<會在文末給出代碼>,同時為了方便也可以導入lombok使用注解開發)
在包導入完之后,官方文檔里快速上手部分寫了一句話,“至少配置兩樣東西:一個SqlSessionFactory和至少一個數據映射器”,再往下看有一個注意后面有一句話“SqlSessionFactory需要一個DataSource(數據源)”反觀之前,所有數據源的配置都是交給mybatis配置死的,SqlSessionFactory是用冗長的代碼來實現的。
以上是官方文檔里面的入門部分的內容。
以下是我對入門的理解:
首先在resoures文件中建立一個application.xml文件;(resources右鍵--->New--->XML Configeration File--->Spring Config,直接有spring的配置,不用再去導入)
根據官方文檔所提供的信息,起碼需要兩個部分DataSource(數據源)和sqlSessonFactory。
DataSource:
首先要用Spring的數據源替換掉Mybatis自己寫死的配置,數據源選擇什么都無所謂,什么c3p0、dbcp、druid都可以,以Spring的Jdbc為例(DriverManagerDataSource,驅動管理數據源)
<bean id="dateSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSLL=true&useUnicode=true&charaterEnocding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>
driverClassName、url、username、password等都是自帶的屬性,切勿亂改!
可以把DriverManagerDataSource點進去看源碼,里面都已經定義好的,包括什么driverClassName不為空之類的,在此不多做贅述,源碼很強大,可以自行查看。
sqlSessonFactory:
這部分官方文檔(sqlSessonFactoryBean)很詳細,直接給了相應的配置,直接復制就好
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>
但是在這段代碼中,還可以進行mybatis配置文件的綁定,不加也沒事(官方文檔中,設置下面的屬性)
點開property name,可以發現它擁有很多跟mybatis有的配置,這時候,mybatis的xml文件基本是沒用了,包括configLocation、mapperLocation等,都可以進行配置(星號代表所有xml文件,同時原本的mybatis的xml最好保留,用於放置日志,緩存,別名等配置)
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/yu/mapper/*.xml"/>
完成以上之后,再回頭看官方文檔--->入門--->快速上手
看文檔可知,所有的SqlSession都有一個SqlSessionTemplate對象,Template百度翻譯給我的翻譯是“樣板; 模板; 型板; 模框; 標准”,我們得再xml文件中自己配置一個,代碼(官方文檔--->使用SqlSession--->SqlSessionTemplate中有這段代碼)如下:
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用構造器注入sqlSessionFactory,因為沒有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
這段代碼一開始我有個疑問,為啥只能用構造器注入,點開了這個類才知道,整個類里面並沒有set方法,因此只能使用構造器注入。
繼續讀官方文檔,下面有一行@Bean的代碼,我不使用這種方法,我換一種方法,使用實現類。
創造一個實現類MapperImpl,直接讓它 implement Mapper,沒整合兩個框架之前,操作是用sqlSession來執行,現在整合之后,則使用SqlSessionTemplate來實現,然后使用set方法將他注入到Spring,最后返回到自己的增刪改查操作就好,代碼如下:
package com.yu.mapper;
import com.yu.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
//原來我們的所有操作都是用sqlSession執行,現在都是用sqlSessionTemplate
private SqlSessionTemplate sqlsession;
//spring萬物都注入,直接一個set方法
public void setSqlsession(SqlSessionTemplate sqlsession) {
this.sqlsession = sqlsession;
}
//alt+enter
public List<User> selectUser() {
//相當於之前用sqlSession的時候的getmapper
UserMapper mapper = sqlsession.getMapper ( UserMapper.class );
return mapper.selectUser ();
}
}
在xml文件中注入impl,即可使用,代碼如下:
<bean id="userMapper" class="com.yu.mapper.UserMapperImpl">
<property name="sqlsession" ref="sqlSession"/>
</bean>
測試類:
import com.yu.mapper.UserMapper;
import com.yu.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class MyTest {
@Test
public void test() throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext ( "applicationContext.xml" );
UserMapper userMapper = context.getBean ( "userMapper", UserMapper.class );
for(User user : userMapper.selectUser ()){
System.out.println (user);
}
}
}
<注:usermapper后面的UserMapper.class是為了避免強制類型轉化>
步驟總結:
1.配置數據源
2.sqlSessionFactory
3.sqlSessionTemplate
4.給接口增加實現類,即Impl
5.把Impl注入到Spring中
6.測試
注:SqlSessionTemplate 是 MyBatis-Spring 的核心。作為 SqlSession 的一個實現,這意味着可以使用它無縫代替你代碼中已經在使用的 SqlSession。SqlSessionTemplate 是線程安全的,可以被多個 DAO 或映射器所共享使用。這句話是SqlSessionTemplate部分的第一句話
以上是第一種方法,下面是第二種方法
使用SqlSessionDaoSupport(終極簡化,香慘了)
這部分官方文檔沒有過多的贅述,只有兩段代碼,看代碼發現,Impl繼承了一個類SqlSessionDaoSupport,然后xml中sqlSessionFactory一放,就啥都能用。
代碼如下:
package com.yu.mapper;
import com.yu.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
public List<User> selectUser() {
return getSqlSession ().getMapper ( UserMapper.class ).selectUser ();
}
}
點開SqlSessionDaoSupport,其實只做了一些支持,其實就是剛才方法一的代碼被一個類簡化了
xml文件配置如下:
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
為什么注入sqlSessionFactory:雖然它現在不需要注入,但是它的父類是需要的,左鍵點開看源碼,打開新世界。而且自動提示的emm,應該不會錯吧(?)。同時,在方法一中的注入sqlSessionFactory都可以直接省略。
前文提到的junit、mysql、spring-mvc、spring-jdbc依賴
dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>3.1.14</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>