Categorías
spring

integración mybatis-spring y proyecto sencillo

Visión general

Mybatis nos proporciona tecnología de persistencia de datos y desempeña un cierto papel en la capa de persistencia.
En primaveraiocProporcionarnos desacoplamiento para reducir el grado de acoplamiento entre los códigos de programa.aopNos proporciona cierto control de cosas, también conocido como agente dinámico, lo que hace que nuestro desarrollo sea más conveniente y eficiente, y desempeña un cierto papel en la capa de negocio.

Pasos de integración

  1. Agregue el paquete de frascos necesario
  2. Crear clase de entidad
  3. Establecer la interfaz de acceso a datos
  4. Configurar el archivo de asignación sql
  5. Configurar el archivo de configuración de mybatis
  6. Configurar el origen de datos DataSource
  7. Configurar SqlSessionFactoryBean
  8. Usar SqlSessionTemplate para operaciones de persistencia de datos
  9. Configurar transacciones declarativas
  10. Añadir capa de negocio

Prepare el paquete de frascos

  1. Paquete esencial de Mybatis:mybatis-3.4.5.jar
  2. El contenedor de muelles encapsula el objeto en el contenedor de oc:spring-context.5.0.2.RELEASE
  3. Fuente de datos necesaria para conectarse a la base de datos:spring-jdbc.5.0.2.RELEASE
  4. Control de transacciones:spring-tx.5.0.2.RELEASE
  5. Análisis de expresión de punto de entrada de Aop:aspectjweaver.1.8.7
  6. Base de datos de enlaces:mysql-connector-java.8.0.16
  7. Dado que la velocidad de desarrollo del resorte es más rápida que la velocidad de desarrollo de mybatis, el equipo de desarrollo de primavera no quiere lanzar una versión sin lanzamiento del soporte de integración basado en mybatis, con el fin de que la primavera apoye mybatis, por lo que más tarde, el equipo de mybatis desarrolló el desarrollo relacionado de acuerdo con el estilo unificado del marco ORM integrado en primavera Integrar componentes para facilitar a los desarrolladores la integración y el uso de mybatis en primavera.
    En resumen: paquete de integración mybatis-spring:mybatis-spring.1.3.0
  8. Si desea completar la prueba unitaria y la salida de registro por sí mismo, puede importar:log4j.1.2.12junit

Precauciones
Dado que hay muchos paquetes involucrados, se recomienda crear un proyecto maven.pom.xmlEn el archivo, escriba la siguiente configuración y, a continuación, impórtela (si falta el paquete jar, se descargará automáticamente, el valor predeterminado es unidad C, puede establecer el conmutador usted mismo y operar específicamente Baidu).

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring_mybatis_xml</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>

<!--    mybatis    -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

<!-- Database -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

<!-- spring container -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

<!-- Data source -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

<!-- Aop entry point expression analysis -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>


<!-- Transaction control -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>


<!-- Test -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

Crear clase de entidad

Como su nombre indica, necesitamos asignar los campos de la base de datos a las clases de entidad. Es lo que a menudo llamamos ORM (Asignación de objetos/relacionales). Se establece un puente entre el modelo de objetos y las tablas de la base de datos relacional.

Creamos el siguiente estilo en la base de datos:

  [2021] Reparar el sistema Ubuntu16.04


En función del modelo ORM anterior, debemos crear una clase de entidad de este tipo en la ingeniería de proyectos, que corresponde a una de las entidades. Cabe señalar que con el fin de hacer que el desarrollo posterior sea más conveniente y no fácil de cometer errores,Para el tipo de datos, el nombre de la variable debe ser exactamente el mismo. Después del final, creegettersetterMétodo. Para ver los resultados, puede reescribirtostringMétodo

package domain;

public class Account {
    int id;
    String name;
    double money;

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name="" + name + "'' +
                ", money=" + money +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}

Establecer la interfaz de acceso a datos

En esta interfaz, normalmente incluimos, adiciones simples, eliminaciones, correcciones y comprobaciones. Operaciones más complejas, nos mantenemos en la capa de negocio, a través de diferentes adiciones, eliminaciones, cambios y anidamiento se puede hacer.

package dao;

import domain.Account;

import java.util.List;

public interface IAccountDao {
    // 1. View users by name
    Account findAccountByName(String name);
    // 2. Update users based on user information
    void updateAccount(Account account);
    // 3. Query all users
    List<Account> findAllAccount();
}

Configurar el archivo de asignación SQL

La ventaja de mybatis es que la operación SQL específica se coloca en el siguiente archivo de configuración xml, sólo tenemos que prestar atención a la instrucción sql. Para otras tareas, mybatis mapeará el pasado para nosotros.

Precauciones

La ruta de acceso del paquete de nuestra clase de entidad es, cómo se debe crear y el nombre de archivo debe ser exactamente el mismo, simplemente modifique el nombre del sufijo.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!-- 1. Configure the Dao layer. The benefit of mybatis seems to solve the entity class of the Dao layer.
                         Started asking questions and solved the entity class. How to increase my affairs?
            -->
<mapper namespace="dao.IAccountDao">
    <!--1. View users by name -->
    <select id="findAccountByName" resultType="domain.Account">
        select * from account where name = #{name}
    </select>
    <!--2. Update users based on user information -->
    <update id="updateAccount">
        update account
        <set>
            <if test="name != null and name != ''">
                name = #{name} ,
            </if>
            <if test="money >= 0">
                money = #{money} ,
            </if>
        </set>
        where id = #{id}
    </update>
    <!--3. Query all users -->
    <select id="findAllAccount" resultType="domain.Account">
        select * from account
    </select>
</mapper>

Configurar el archivo de configuración de mybatis

Este paso todavía no está a la altura de mi nivel de desarrollo actual. Si necesita cambiar el paso, puede agregarlo usted mismo. Cabe señalar que este archivo de configuración es el archivo de configuración principal de mybatisconfiguration.xmlEn ese momento, configuramos la relación de origen de datos y asignación en el archivo de configuración, pero durante el proceso de integración, ya no necesitamos establecerla en mybatis, lo dejamos para que se complete. Por lo tanto, si no hay otros requisitos, este paso se puede omitir.

Configurar el origen de datos DataSource

La fuente de datos proporcionada por la primavera se utiliza aquíDriverManagerDataSourceEso es todo. La configuración específica es la siguiente:

<!-- Configure data source -->
    <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/bilibili_ioc?useSSL=false&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

Configurar SqlSessoionFactoryBean

Recuerda, en mybatis, ¿cómo lo obtenemos y luego agregamos, eliminamos, modificamos y comprobamos?
En MyBatis, la instancia de SqlSessionFactory debe crearse mediante SqISessionFactoryBuilder; en un enseno integradoVironment, puede usar SqISessionFactoryBean en el paquete de integración MyBatis-Spring en su lugar. SqISessionFactoryBean encapsula el proceso de uso de SqISessionFactoryBuilder para crear SqISessionFactory. Podemos obtener instancias sqlsessionfactory configurando SqlSessionFactoryBean en forma de archivos de configuración en primavera. La configuración de la clave es la siguiente:

<!-- Configure sqlsessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- Give him the data source -->
        <property name="dataSource" ref="dataSource"/>
<!-- Configure the java entity class corresponding to the database table -->
        <property name="typeAliasesPackage" value="domain.*" />
<!-- Configure SQL mapping file information -->
        <property name="mapperLocations" value="classpath:dao/IAccountDao.xml" />
    </bean>

SqlSessionTemplate para operaciones de persistencia de datos

Realizar la interfaz de acceso a los datos, crearsqlsessiontemplateLa finalización del objeto en el sentido verdadero, asignando todo el trabajo. Debido al uso deSqlSessionTemplate No olvide agregar el objeto al contenedor de oc.

package dao.impl;

import dao.IAccountDao;
import domain.Account;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class AccountDaoImpl implements IAccountDao {

    private SqlSessionTemplate sqlSessionTemplate;

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    public Account findAccountByName(String name) {
        // Add transaction to transfer
         List<Account> list = sqlSessionTemplate.selectList("dao.IAccountDao.findAccountByName",name);
         System.out.println(list);
         if(list.size() > 1 || list == null)
             throw new RuntimeException("The result set is not unique, this person was not found");
         return list.get(0);
    }

    public void updateAccount(Account account) {
        sqlSessionTemplate.update("dao.IAccountDao.updateAccount",account);
    }

    public List<Account> findAllAccount() {
        return sqlSessionTemplate.selectList("dao.IAccountDao.findAllAccount");
    }
}

Agregar control declarativo de transacciones

Hay un inconveniente en las operaciones anteriores. Para estos, el envío automático se agrega de forma predeterminada. Por lo tanto, cuando nuestros datos están equivocados, como la transferencia, la red se corta repentinamente, lo que hace que otra persona no los acepte, lo que lleva a la transferencia fallida, y hubo un problema con la transacción. Por lo tanto, necesitamos agregar un control de transacciones declarativo.
Explicación detallada de operaciones específicas, puede verControl de transacciones declarativas basado en SPRING XML


<!-- 1. Add transaction management -->
    <bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!-- 2. Notification of configuration transaction -->
    <tx:advice id="txAdvice" transaction-manager="txManger">
        <tx:attributes>
            <tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
            <tx:method name="*" read-only="false" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

<!-- 3. Configure the general entry point in AOP -->
    <aop:config>
        <aop:pointcut id="pt1" expression="execution(* service.impl.*.*(..))"/>
<!-- 4. Establish the corresponding relationship between the entry point expression and the entry point expression -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
    </aop:config>

Añadir capa de negocio

La capa de negocio es más bien una llamada a la capa de persistencia y, a continuación, completa algunas operaciones complejas de adición, eliminación, modificación y comprobación.
Para la comodidad de la comprensión, sólo publico el código de transferencia. Puedo verlo cuidadosamente, hay un error a continuación, que es simular si el control de transacciones se puede completar cuando el programa tiene un error.

public void transfer(String giveName, String receiveName,double money) {
        // 1. Find people
        Account user1 = accountDao.findAccountByName(giveName);
        Account user2 = accountDao.findAccountByName(receiveName);
        // 2. Transfer
        user1.setMoney(user1.getMoney() - money);
        user2.setMoney(user2.getMoney() + money);
        // 3. Update
        accountDao.updateAccount(user1);
        int a = 1/0;
        accountDao.updateAccount(user2);
    }

para resumir

Lo anterior es un proceso completo de integración primavera-mybatis.
Aquí voy a publicar todo el código. Para ayudar a entender.

  1. Introducción a JavaSE y caso de construcción del medio ambiente

Estructura del proyecto

Clase de entidad

domain.Account

package domain;

public class Account {
    int id;
    String name;
    double money;

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name="" + name + "'' +
                ", money=" + money +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}

Capa de persistencia

Dao.IAccountDao

package dao;

import domain.Account;

import java.util.List;

public interface IAccountDao {
    // 1. View users by name
    Account findAccountByName(String name);
    // 2. Update users based on user information
    void updateAccount(Account account);
    // 3. Query all users
    List<Account> findAllAccount();
}

Dao.Impl.AccountDaoImpl

package dao.impl;

import dao.IAccountDao;
import domain.Account;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class AccountDaoImpl implements IAccountDao {

    private SqlSessionTemplate sqlSessionTemplate;

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    public Account findAccountByName(String name) {
        // Add transaction to transfer
         List<Account> list = sqlSessionTemplate.selectList("dao.IAccountDao.findAccountByName",name);
         System.out.println(list);
         if(list.size() > 1 || list == null)
             throw new RuntimeException("The result set is not unique, this person was not found");
         return list.get(0);
    }

    public void updateAccount(Account account) {
        sqlSessionTemplate.update("dao.IAccountDao.updateAccount",account);
    }

    public List<Account> findAllAccount() {
        return sqlSessionTemplate.selectList("dao.IAccountDao.findAllAccount");
    }
}

Capa de negocio

service.IAccountService

package service;

import domain.Account;

import java.util.List;

public interface IAccountService {

    // 1. Query all users
    List<Account> findAllAccount();

    // 2. Transfer
    void transfer(String giveName,String receiveName,double money);


}

service.Impl.AccountServiceImpl

package service.impl;

import dao.IAccountDao;
import domain.Account;
import service.IAccountService;

import java.util.List;

public class AccountServiceImpl implements IAccountService {

    IAccountDao accountDao;

    public void setAccountDao(IAccountDao accountDao) {
        this.accountDao = accountDao;
    }

    public List<Account> findAllAccount() {
        return accountDao.findAllAccount();
    }

    public void transfer(String giveName, String receiveName,double money) {
        // 1. Find people
        Account user1 = accountDao.findAccountByName(giveName);
        Account user2 = accountDao.findAccountByName(receiveName);
        // 2. Transfer
        user1.setMoney(user1.getMoney() - money);
        user2.setMoney(user2.getMoney() + money);
        // 3. Update
        accountDao.updateAccount(user1);
        int a = 1/0;
        accountDao.updateAccount(user2);
    }
}

Archivo de configuración

dao.IAccountDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!-- 1. Configure the Dao layer. The benefit of mybatis seems to solve the entity class of the Dao layer.
                         Started asking questions and solved the entity class. How to increase my affairs?
            -->
<mapper namespace="dao.IAccountDao">
    <!--1. View users by name -->
    <select id="findAccountByName" resultType="domain.Account">
        select * from account where name = #{name}
    </select>
    <!--2. Update users based on user information -->
    <update id="updateAccount">
        update account
        <set>
            <if test="name != null and name != ''">
                name = #{name} ,
            </if>
            <if test="money >= 0">
                money = #{money} ,
            </if>
        </set>
        where id = #{id}
    </update>
    <!--3. Query all users -->
    <select id="findAllAccount" resultType="domain.Account">
        select * from account
    </select>

</mapper>

applicationContext.xml

<?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/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd">

<!-- Add the dao layer to the spring container -->
    <bean id="accountDao" class="dao.impl.AccountDaoImpl">
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    </bean>

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

<!-- Add the service layer to the spring container -->
    <bean id="accountService" class="service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>


<!-- 1. Add transaction management -->
    <bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!-- 2. Notification of configuration transaction -->
    <tx:advice id="txAdvice" transaction-manager="txManger">
        <tx:attributes>
            <tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
            <tx:method name="*" read-only="false" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

<!-- 3. Configure the general entry point in AOP -->
    <aop:config>
        <aop:pointcut id="pt1" expression="execution(* service.impl.*.*(..))"/>
<!-- 4. Establish the corresponding relationship between the entry point expression and the entry point expression -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
    </aop:config>

<!-- Configure sqlsessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- Give him the data source -->
        <property name="dataSource" ref="dataSource"/>
<!-- Configure the java entity class corresponding to the database table -->
        <property name="typeAliasesPackage" value="domain.*" />
<!-- Configure SQL mapping file information -->
        <property name="mapperLocations" value="classpath:dao/IAccountDao.xml" />
    </bean>


<!-- Configure data source -->
    <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/bilibili_ioc?useSSL=false&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>


</beans>

.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *