1. 程式人生 > 其它 >Spring以及Mybatis整合

Spring以及Mybatis整合

簡介:Spring是一款輕量級,非入侵式框架,它的前身是interface21,Spring支援事務的處理,支援幾乎市面上所有的框架整合,最核心的兩個點是控制反轉(IOC)和麵向切面程式設計(AOP)!

什麼是控制反轉?

簡單來說,控制反轉是一種設計思想,沒有使用它之前,物件的建立與物件之間的依賴完全編碼在程式之中,物件的建立是由程式來控制的,而使用控制反轉之後,則將這個過程交給了第三方(使用者等...),很大程度上解耦,在Spring中實現控制反轉的是IOC容器,其實現方法是依賴注入(DI)。

spring所需的jar包

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.3.6</version>
</dependency>

使用註解需要在bean中匯入context約束

<context:annotation-config />

掃描指定包,這個包下的註解就會生效

<context:component-scan base-package="xxx" />

註解說明

@Autowired 標註在類中的成員變數或方法上,完成的是bean的注入,方式預設ByType,如果型別找不到再通過ByName
如果不能唯一自動裝配上屬性,需要配合@Qualifier(value = "xxx")

@Nullable 打上這個註解,則該欄位可以為null

@Resource 自動裝配通過名字,型別,可以說是@Autowired和@Qualifier的集合體

@Component 元件,將被標註的類註冊到Spring容器中,將類的例項化交給Spring管理,完成的是bean的註冊,例項化物件名預設為類名的小寫
衍生出來的有 @Repository @Service @Controller,作用等同於@Component,只是為了符合SpringMVC的架構,分別用於Dao,Service,Controller層

@Configuration 代表這是一個配置類,就和之前看到的beans.xml一樣,表示會生成bean並註冊到Spring容器中,交給Spring託管
兩種使用方法:1.在配置類中定義一個方法,並使用@Bean註解宣告
2.在實體類上使用@Component註解,並在配置類上使用@ComponentScan("實體類的包或路徑名"),這樣會自動掃描@Component並生成Bean
最後在使用時,使用AnnotationConfigApplicationContext來獲取上下文物件
注意:第一種方法bean的名字是方法名,第二種方法bean名字為小寫的實體類名

@Bean 註冊一個bean,相當於寫的bean標籤,id=方法名,class=返回值

@Value("xxx") 注入屬性,等價於 <-property name="xxx" value="xxx"-/>

動態代理模板

反射

呼叫指定的方法:首先ClassForName例項化物件,然後找到指定的方法,以及傳入引數的屬性,最後使用invoke呼叫方法

若要更改私有屬性的值,可以設定setAccessible(true)

呼叫Class物件的newInstance()方法時,類必須要有一個無參構造器

AOP

概述:通過預編譯的方式和動態代理實現程式執行期間的統一維護,是OOP(面向物件)的一種延續,即在不影響原程式的情況下,對業務進行增強

環境:需要在spring中匯入對應的jar包,使用時匯入aop的相關配置

<dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
</dependency>

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"

實現方式1:Spring的API介面

實現方式2:自定義實現

實現方式3:註解實現

Spring中整合Mybatis

所需的jar包

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.2</version>
    </dependency>
</dependencies>

mybatis原始使用方式

mybatis核心配置檔案

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

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=UTC"/>
                <property name="username" value="xxx"/>
                <property name="password" value="xxx"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="Mapper/UserMapper.xml" />
    </mappers>
</configuration>

實體類和介面
1.編寫資料庫對應的實體類;
2.編寫實現所需功能的介面以及它對應的mapper.xml配置檔案
3.自己寫好的mapper.xml配置檔案在核心配置檔案中註冊

過濾設定
若註冊繫結xml之後IDEA依舊提示有繫結異常,可以在pom.xml中加入過濾設定

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

整合到spring中

1.編寫資料來源配置
可以在資原始檔中建立一個總的applicationContext.xml檔案,spring-dao.xml中專注資料庫的處理以及sqlSession的建立,總的xml檔案中專注bean的處理,最後import匯入即可

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--datasource:使用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?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=UTC" />
    <property name="username" value="root"/>
    <property name="password" value="Gyh!1027"/>
</bean>

<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:Mapper/*.xml" />
</bean>

<!--SqlSessionTemplate:就是我們使用的sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
</beans>

2.sqlSessionFactory
3.sqlSessionTemplate
4.需要給介面加一個實現類
一定要使用set方法來手動注入

public class UserMapperImpl implements UserMapper {
    //原來的所有操作都使用sqlSession來完成,現在使用SqlSessionTemplate
    private SqlSessionTemplate sqlSession;

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

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

5.將自己寫的實現類注入到spring的配置檔案中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <import resource="spring-dao.xml"/>

    <bean id="usermapper" class="Mapper.UserMapperImpl">
        <property name="sqlSession" ref="sqlSession" />
    </bean>
</beans>

6.測試使用

public class MyTest {
    @Test
    public void test() throws IOException {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper mapper = context.getBean("usermapper", UserMapper.class);
        List<User> userList = mapper.selectUser();
        for (User user:userList){
            System.out.println(user);
        }
    }
}

宣告式事務(在Spring中配合AOP使用)

    <bean id="transactionManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="datasource"/>
    </bean>

<!--結合AOP實現事務的置入-->
    <tx:advice id="txadvice" transaction-manager="transactionManger">
        <tx:attributes>
            <!--給哪些方法配置事務-->
            <!--propagation:事務的傳播特性,預設為REQUIRED,支援當前事務,若沒有則新建一個-->
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

<!--配置AOP-->
    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* Mapper.*.*(..))"/>
        <aop:advisor advice-ref="txadvice" pointcut-ref="txPointCut"/>
    </aop:config>