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&characterEncoding=utf8&useSSL=true&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&characterEncoding=utf8&useSSL=true&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>