Spring 整合 MyBatis

1.什么是Spring整合MyBatis?

Spring整合MyBatis是指将Spring框架和MyBatis持久化框架结合起来使用,实现数据访问层和业务逻辑层的整合。Spring是一个轻量级的Java开发框架,提供了面向切面编程(AOP)、依赖注入(DI)等功能,可以简化企业级应用程序的开发。而MyBatis是一种持久化框架,通过将数据库操作与Java对象的映射进行配置,实现了数据库操作的简化。

Spring整合MyBatis的好处包括:

  1. 提供了事务管理机制:Spring的事务管理功能可以统一管理数据库操作的事务,确保数据的一致性和完整性。

  2. 简化了数据访问层的开发:MyBatis提供了灵活的SQL映射配置,通过将SQL语句与Java方法进行映射,可以方便地进行数据库操作。结合Spring的依赖注入和AOP特性,可以进一步简化数据访问层的代码编写。

  3. 提高了代码的可测试性和可维护性:通过将数据库操作与业务逻辑层解耦,可以更容易地进行单元测试和模块化开发,提高代码的可测试性和可维护性。

Spring整合MyBatis主要需要配置Spring的ApplicationContext、数据源、事务管理器以及MyBatis的SqlSessionFactory等组件,以及定义Mapper接口和对应的映射文件。通过配置这些组件,可以在Spring中使用MyBatis进行数据库操作,并结合Spring的功能进行更加灵活和方便的开发。

2.Spring整合MyBatis的步骤有哪些? 

Spring整合MyBatis的步骤如下:

先和我建立这些包和类:

 

  1. 引入依赖:在项目的构建文件(例如Maven或Gradle)中添加Spring和MyBatis的相关依赖。

    <dependencies>
            <!--spring用到的依赖-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.2.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>5.2.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>5.2.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>5.2.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>5.3.10</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.3.10</version>
            </dependency>
            <!--mybatis用到的依赖-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
            </dependency>
    
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjtools</artifactId>
                <version>1.9.5</version>
            </dependency>
            <dependency>
                <groupId>aopalliance</groupId>
                <artifactId>aopalliance</artifactId>
                <version>1.0</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.0</version>
            </dependency>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>3.3.0</version>
            </dependency>
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.4</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.3.0</version>
            </dependency>
    
            <!--junit,mysql,log4j的依赖-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.19</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
    
            <!--util-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.28</version>
            </dependency>
    
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.4</version>
            </dependency>
        </dependencies>

  2. 配置数据源:在Spring的配置文件(例如applicationContext.xml)中配置数据库的连接信息和数据源,可以使用Spring提供的内置数据源,也可以使用其他第三方数据源。

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!--1.配置数据源-->
        <context:property-placeholder location="database.properties"></context:property-placeholder>
    
        <!--2.配置环境 配置数据源-->
        <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${driver}"></property>
            <property name="url" value="${url}"></property>
            <property name="username" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>
    
        <!--配置sqlSessionFactory-->
        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="datasource"></property>
            <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        </bean>
    
        <!--配置扫描包-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="mapper"></property>
        </bean>
    
        <context:component-scan base-package="service"/>
    </beans>
    

    database.properties的配置

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/数据库名字?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
    jdbc.username=root
    jdbc.password=root

    mybatis-config.xml文件配置

    <?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>
        <!-- 配置项 -->
        <settings>
            <setting name="autoMappingBehavior" value="FULL"/>
            <setting name="cacheEnabled" value="true" />
        </settings>
        <typeAliases>
            <package name="domain"/>
        </typeAliases>
    
        <!--3.配置需要引用的SQL映射文件的位置(SysUserMapper.xml将在后续步骤中创建)-->
        <mappers>
            <mapper resource="mapper/UserMapper.xml"></mapper>
        </mappers>
    </configuration>
    

  3. 配置SqlSessionFactory:在Spring的配置文件中配置MyBatis的SqlSessionFactory,包括指定数据源、配置MyBatis的属性和设置映射文件等。

  4. 配置Mapper扫描器:通过配置MapperScannerConfigurer,扫描并注册Mapper接口,使其能够被Spring自动管理和注入。

  5. 编写Mapper接口和映射文件:在Mapper接口中定义数据库操作的方法,并在对应的映射文件(例如XML文件)中编写SQL语句和结果映射规则。

  6. 配置事务管理器:如果需要进行事务管理,可以配置Spring的事务管理器,以确保数据库操作的一致性和完整性。

  7. 使用MyBatis进行数据库操作:在业务逻辑层(Service层)中注入Mapper接口的实例,并调用其方法进行数据库操作。

以上是Spring整合MyBatis的一般步骤,具体的配置和使用方式可能会因项目和需求而有所不同。但总体来说,通过配置数据源、SqlSessionFactory和Mapper扫描器,以及编写Mapper接口和映射文件,就可以在Spring中使用MyBatis进行数据库操作了。

3.获取映射接口实例,实现数据操作有哪几种方式? 

获取映射接口实例,实现数据操作有以下几种方式:

  1. XML配置方式:在Mapper映射文件中编写SQL语句和结果映射规则,在Java代码中使用MyBatis提供的SqlSession对象执行数据库操作,并通过指定Mapper接口的命名空间和方法名进行调用。

  2. 注解方式:在Mapper接口的方法上使用注解(例如@Select、@Insert、@Update等)来定义SQL语句和参数映射,然后通过SqlSession对象的getMapper()方法获取Mapper接口实例,并直接调用方法进行数据库操作。

  3. 动态代理方式:通过MyBatis的Mapper动态代理机制,将Mapper接口的方法与对应的SQL语句绑定起来,无需编写XML映射文件或注解。通过SqlSession对象的getMapper()方法获取Mapper接口的代理实例,然后直接调用方法进行数据库操作。

这些方式各有特点,XML配置方式相对灵活,适用于复杂的SQL语句和结果映射;注解方式简单快捷,适用于简单的数据库操作;动态代理方式结合了XML配置和注解的优点,可以灵活控制SQL语句的生成和执行过程。

在实际项目中,可以根据具体需求选择适合的方式进行数据操作。通常推荐使用注解方式或动态代理方式,因为它们更加简洁、易于维护,并且减少了XML映射文件的编写和配置工作。

4.基本整合方式 

思路梳理 
(1)以上流程可以全部移交给 Spring 来处理
(2)读取配置文件、组件的创建、组件之间的依赖关系以及整个框架的生命周期都由 Spring 容器统一管理

 

5.代码

增删改查

mapper接口

@Repository
public interface UserMapper {
    public List<User> getAllUser();

    public int insertUser(@Param("user") List<User> user);

    public int updateUser(User user);

    public int deleteUser(String id);
}

user实体类

@Data
public class User {
    private Integer id;
    private String name;
    private Integer gradeid;

    public User(String name, Integer gradeid,Integer id) {
        this.name = name;
        this.gradeid = gradeid;
        this.id=id;
    }

    public User() {

    }
}

service接口

public interface UserService {
    public List<User> getAllUser();

    public int insertUser(@Param("user")List<User> user);

    public int updateUser(User user);

    public int deleteUser(String id);
}

serviceImpl

@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> getAllUser() {
        return userMapper.getAllUser();
    }

    @Override
    public int insertUser(List<User> user) {
        return userMapper.insertUser(user);
    }

    @Override
    public int updateUser(User user) {
        return userMapper.updateUser(user);
    }

    @Override
    public int deleteUser(String id) {
        return userMapper.deleteUser(id);
    }
}

mapper映射文件

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

<!--将下列SQL语句绑定到cn.cvs.dao.sysUser.SysUserMapper接口-->
<mapper namespace="mapper.UserMapper">

    <select id="getAllUser" resultType="domain.User">
        select * from User
    </select>

    <insert id="insertUser" parameterType="java.util.List">
        INSERT INTO user (id,name, gradeid) values
        <foreach collection="user" item="value" separator=",">
            (#{value.id},#{value.name},#{value.gradeid})
        </foreach>
    </insert>

    <update id="updateUser" parameterType="domain.User">
        update user
        <trim prefix="set"  suffixOverrides="," suffix="where id=#{id}">
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="gradeid!=null">
                gradeid=#{gradeid}
            </if>
        </trim>
    </update>

    <delete id="deleteUser" parameterType="java.lang.String">
        delete from user
        <trim prefix="where" prefixOverrides="and|or">
            <if test="id!=null">
                id=#{id}
            </if>
        </trim>
    </delete>
</mapper>


text类

import domain.User;
import lombok.val;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
import service.UserServiceImpl;

import java.util.ArrayList;
import java.util.List;

public class test {
    @Test
    public void test(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)applicationContext.getBean("userService");
        userService.getAllUser().stream().forEach(item->{
            System.out.println(item);
        });
    }

    @Test
    public void insertUser(){
        List<User> list=new ArrayList<>();
        User user=new User();
        user.setId(3);
        user.setName("黄晓宇");
        user.setGradeid(2);

        list.add(user);

        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        final UserService userService=(UserService) context.getBean("userService");
        System.out.println(userService.insertUser(list));
    }

    @Test
    public void updateUser(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        final UserService userService=(UserService) context.getBean("userService");
        System.out.println(userService.updateUser(new User("黄晓宇",1,3)));
    }

    @Test
    public void deleteUser(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        final UserService userService=(UserService) context.getBean("userService");
        System.out.println(userService.deleteUser("3"));

    }
}

6.配置声明式事务

(1)硬编码方式
弊端:
事务相关代码分散在业务方法中难以重用
复杂事务的编码难度高,增加了开发难度
(2)Spring基于AOP实现声明式事务处理机制
优势:
全在配置文件完成,将事务处理与业务代码分离,降低了开发和维护难度
(3)配置步骤
1. 导入命名空间
2. 定义事务管理器
3. 设置事务属性
4. 定义事务切面
事务属性说明

 

          使用注解实现声明式事务 

 

 

 

 7.总结

 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值