Основы Spring (6)

Spring Foundation (6) Интеграция Mybatis

Необходимо загрузить банку с mybatis-spring.

Потому что в mybatis также много новых объектов, таких как SqlSession и т. Д., Которые можно разместить весной для хостинга.

<!-- spring操作数据库还需要一个spring-jdbc的包 -->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <!-- 与webmvc版本相同 -->
        <version>5.2.0.RELEASE</version>
    </dependency>
    
    <dependency>
    	<groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.2</version>
    </dependency>
    
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.3</version>
    </dependency>
</dependencies>

Примечание! Пакет jar mybatis требуется во время настройки, В противном случае отчет: Bean должен быть из'org.apache.ibatis.session.SqlSessionFactory '

Mybatis-Spring

mybatis-spring поможет вам интегрировать код mybatis в Spring!

Шаги по использованию:

  1. Импортируйте банку mybatis-spring.
  2. Необходимо встроить SqlSessionFactory в контейнер Spring (Эта фабрика нуждается в создании источника данных
  3. Необходимо встроить DataSource в контейнер Spring (Поскольку он изначально находится в файле конфигурации conf, используйте источник данных spring для замены источника данных в файле конфигурации.) Org.springframework.jdbc.datasource.DriverManagerDataSource
  4. Сгенерируйте sqlSession через SqlSessionTemplate (Шаблон необходимо ввести в sqlSessionFactory
  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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 创建一个spring的数据源对象 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="111111"/>
    </bean>

    <!-- 根据数据源创建一个sqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 以下属性不是必须的,绑定mybatis的配置文件,这样这个sqlSessionFactory就可以根据mybatis的配置文件的一些信息生成 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    
    <!-- 使用模板生成sqlSession,模板是根据SQLSessionFactory生成sqlSession -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

</beans>

В исходном sqlSessionFactory был сгенерирован на основе конфигурационного файла conf mybatis, теперь он создается после настройки в bean-компоненте, == поэтому этот bean-компонент SQLSessionFactory может настраивать все в файле mybatis-conf (включая подключение к конфигурационному файлу mybaits-conf ) == Но источник данных просто необходим!

Таким образом, файл конфигурации mybatis можно полностью заменить.

Как правило, в файле mybatis-conf осталось два элемента:Управление псевдонимами; управление настройками. Затем используйте configLocation для подключения.

public class User {
    
    
    private String name;
    public User() {
    
    
    }
    public User(String name) {
    
    
        this.name = name;
    }
    public String getName() {
    
    
        return name;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
}
public interface UserMapper {
    
    
    List<User> getUsers();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org/DTD Mapper 3.0"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiu.mapper.UserMapper">
    <select id="getUsers" resultType="User">
        select * from `user`
    </select>
</mapper>

Оказывается, объект сопоставления используется на уровне сервиса. После использования spring вам необходимо поместить объект сопоставления в контейнер Spring , но нет соответствующего класса для его создания, поэтому вы можете реализовать только следующий UserMapper в качестве класса реализации для создания объекта сопоставления и помещения его в контейнер spring. для менеджмента!

Согласно оригинальным mybaits, картограф создается посредством отражения. Но интерфейс не может создавать объекты, поэтому его нельзя поместить в контейнер Spring. Нет другого выхода, кроме как добавить еще один уровень Impl для реализации интерфейса, чтобы он мог создавать объекты.

public class UserMapperImpl implements UserMapper {
    
    
    SqlSessionTemplate sqlSession;

    @Override
    public List<User> getUsers() {
    
    
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.getUsers();
        return users;
    }

    public SqlSessionTemplate getSqlSession() {
    
    
        return sqlSession;
    }
    public void setSqlSession(SqlSessionTemplate sqlSession) {
    
    
        this.sqlSession = sqlSession;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <import resource="spring-dao.xml"/>

    <bean id="userMapper" class="com.qiu.mapper.UserMapperImpl">
        <property name="sqlSession" ref="sqlSession"/>
    </bean>

</beans>

SqlSessionDaoSupport

Это абстрактный класс, предоставляемый mybatis-spring. С этим классом нет необходимости писать sqlSession (то есть нет необходимости настраивать sqlSession в контейнере spring, но также требуются Factory и DataSource)

public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
    
    
    public getUsers(){
    
    
        SqlSession session = getSqlSession();
        retuen session.selectLise("com.qiu.mapper.UserMapper.getUsers");
    }
}
<bean id="userMapper" class="com.qiu.mapper.UserMapperImpl">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

На самом деле это не сильно упрощает, просто не нужно регистрировать sqlSession весной. Предыдущая операция должна зарегистрировать SqlSessionTemplate в контейнере spring и ввести его в UserMapperImpl для использования при создании sqlSession.

На одну операцию впрыска меньше. А инъекция bean-компонента userMapper - это фабрика инъекций (требуется родительскому классу SqlSessionDaoSupport)

Декларативная сделка

Основная причина использования mybatis-spring заключается в том, что он позволяет mybatis участвовать в управлении транзакциями Spring. Вместо создания нового выделенного диспетчера транзакций для mybatis, mybatis-spring использует класс Spring DataSourceTransactionManager для реализации управления транзакциями,

Чтобы включить функцию обработки транзакций Spring, создайте объект DataSourceTransactionManager в bean-компонентах файла конфигурации spring:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSoueceTransactionManager">
	<constructor-arg ref="dataSource"/>
</bean>

Весной есть два метода управления транзакциями:

  • Декларативная транзакция: реализация АОП
  • Программные транзакции: необходимо изменить исходный код

Этапы реализации:

  1. Создайте объект управления транзакцией и передайте его в контейнер Spring для управления (указывая, что источник управляется транзакцией. Поскольку источник владеет какой базой данных и какая база данных используется)Создайте класс аспекта. Этот аспект предоставлен вам mybatis-spring! Вам нужно только создать объекты и настроить классы аспектов!

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSoueceTransactionManager">
    	<constructor-arg ref="dataSource"/>
    </bean>
    
  2. Настройте уведомление о транзакции (уведомление - это метод, который нужно вставить. Это означает, что должны быть вставлены все методы добавления и удаления)Настроить этот класс аспекта

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/aop/spring-tx.xsd">
    <!-- 注意这里的头信息需要配置 -->
        
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSoueceTransactionManager">
            <constructor-arg ref="dataSource"/>
        </bean>
        
        <!-- 配置事务的通知 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <!-- 给哪些方法配置事务 -->
        	<tx:attributes>
                <!-- 给所有的add、delete方法添加事务 -->
            	<tx:method name="add"/>
                <tx:method name="delete"/>
                <!-- 给所有的方法添加事务(增删改查) -->
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
    
    </beans>
    

    Вы можете думать о transactionManager как о классе аспектов, а advice - это уведомление для настройки класса аспектов!

  3. Запись транзакции конфигурации.Нарежьте лапшу в точке входа

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSoueceTransactionManager">
        <constructor-arg ref="dataSource"/>
    </bean>
    
    <!-- 配置事务的通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 给哪些方法配置事务 -->
        <tx:attributes>
            <!-- 给所有的add、delete方法添加事务 -->
            <tx:method name="add"/>
            <tx:method name="delete"/>
            <!-- 给所有的方法添加事务(增删改查) -->
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
    	<aop:pointcut id="txPointCut" expression="execution(* com.qiu.mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>
    

    Обратите внимание, что точкой входа здесь являются все методы всех классов mapper в пакете mapper.Поскольку метод в классе сопоставления является наиболее атомарным методом, после того, как эти атомарные методы операций jdbc поддерживают транзакции, метод сопоставления, используемый в службе, естественным образом поддерживает транзакции.

рекомендация

отblog.csdn.net/qq_43477218/article/details/113836577