spring整合mybatis的兩種方法


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&amp;useUnicode=true&amp;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 的一個實現,這意味着可以使用它無縫代替你代碼中已經在使用的 SqlSessionSqlSessionTemplate 是線程安全的,可以被多個 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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM