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"-/>

动态代理模板
Spring以及Mybatis整合

反射

调用指定的方法:首先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接口
Spring以及Mybatis整合
实现方式2:自定义实现
Spring以及Mybatis整合
实现方式3:注解实现
Spring以及Mybatis整合

Spring以及Mybatis整合

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>
上一篇:mybatis 第一个实例


下一篇:MyBatis---动态Sql