当前位置:   article > 正文

Mybatis-Spring(Spring整合Mybatis)

mybatis-spring

Mybatis-Spring

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

入门程序

  1. 环境配置
		<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  1. dao层逻辑
    实体类School.java
    Dao层接口
    package cn.supperbro.pojo;
public class School {
    private String name;
    private int id;

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

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

    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
package cn.supperbro.mapper;

import cn.supperbro.pojo.School;

import java.util.List;

public interface UserMapper {
    List<School> findSchool();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

当然还有sql的映射器

<?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">
<!--namespace指向持久层的接口-->
<mapper namespace="cn.supperbro.mapper.UserMapper">
    <!--id表示的是接口中的方法  resultType表示的返回的结果集类型-->
    <select id="findSchool" resultType="school">
        select * from school
    </select>
</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 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>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases>
    <!--别名操作-->
        <typeAlias  type="cn.supperbro.pojo.School" alias="school"/>
    </typeAliases>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. spring配置文件
    首先要实现接口,将接口注册到bean中
package cn.supperbro.mapper;
import cn.supperbro.pojo.School;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;

public class UserMapperImpl implements UserMapper {
    private SqlSessionTemplate sqlSession;

    public UserMapperImpl(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }
    @Override
    public List<School> findSchool() {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.findSchool();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
   <!--获取数据源的操作-->
   <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/jdbctest?serverTimezone=UTC&amp;useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
      <property name="username" value=""/>
      <property name="password" value=""/>
   </bean>

   <!--获取sqlSessionFactory对象-->
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <!--绑定mybatis的配置文件-->
      <property name="configLocation" value="mybatis-config.xml"/>
      <!--绑定映射的xml-->
      <property name="mapperLocations" value="cn/supperbro/mapper/UserMapper.xml"/>
   </bean>
   <!--注册sqlSession对象  对应的SqlSessionTemplate-->
   <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg index="0" ref="sqlSessionFactory"/>
   </bean>
   <!--给接口实现类注入sqlSession-->
   <bean class="cn.supperbro.mapper.UserMapperImpl" id="userMapper">
      <constructor-arg index="0" ref="sqlSession"/>
   </bean>
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  1. 测试
 public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("mybatis-spring.xml");
        UserMapper mapper = context.getBean("userMapper", UserMapper.class);
        List<School> school = mapper.findSchool();
        System.out.println(school);
        //[School{name='武汉商学院', id=1}, School{name='武汉大学', id=2}, School{name='武汉理工大学', id=3}]
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

总结

mybatis单独使用时:

  1. 通过配置文件进行了数据源的相关配置。(mybatis-config.xml)
  2. 通过SqlSessionFactoryBuilder绑定资源创建了SqlSessionFactory,通过SqlSessionFactory对象获取SqlSession。
  3. SqlSession绑定接口映射器实现数据库操作。(…mapper.xml)

spring整合mybatis时:

  • 数据源由spring创建,此处用的时spring-jdbc提供的数据源,还可以配置其他数据源druid,c3p0…
<!--获取数据源的操作-->
   <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/jdbctest?serverTimezone=UTC&amp;useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
      <property name="username" value=""/>
      <property name="password" value=""/>
   </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • SqlSessionFactory对象由spring创建,同时需要绑定数据源,也可以绑定配置文件,以及mapper映射文件,mybatis-spring提供的SqlSessionFactoryBean
 <!--获取sqlSessionFactory对象-->
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <!--绑定mybatis的配置文件-->
      <property name="configLocation" value="mybatis-config.xml"/>
      <!--绑定映射的xml-->
      <property name="mapperLocations" value="cn/supperbro/mapper/UserMapper.xml"/>
   </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • SqlSession对象由spring创建,通过sqlSessionFactory对象来获取
<!--注册sqlSession对象  对应的SqlSessionTemplate-->
   <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg index="0" ref="sqlSessionFactory"/>
   </bean>
  • 1
  • 2
  • 3
  • 4
  • 接口实现类注册到IOC容器,可以直接注册sqlSession
 <!--给接口实现类注入sqlSession-->
   <bean class="cn.supperbro.mapper.UserMapperImpl" id="userMapper">
      <constructor-arg index="0" ref="sqlSession"/>
   </bean>
  • 1
  • 2
  • 3
  • 4

注意:
上述过程中,加载数据源,我们的数据库配置文件是和spring的bean配置文件在一块的,我们可以通过引入context命名空间,加载db.properties文件

<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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

通过 context:property-placeholder加载文件

 <!--加载pro配置文件 classpath类加载器的位置-->
   <context:property-placeholder location="classpath:db.properties"/>
  • 1
  • 2

原来的数据源加载就可以写为

<!--获取数据源的操作-->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="${jdbc.driver}"/>
      <property name="url" value="${jdbc.url}"/>
      <property name="username" value="${jdbc.username}"/>
      <property name="password" value="${jdbc.password}"/>
   </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Spring配置数据源

上诉代码中,数据源用的是spring-jdbc的,下面介绍spring配置其他的第三方数据源。配置数据源其实就是在第三方数据源注册到IOC中。

配置c3p0

导入c3p0的依赖

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

配置数据源

 <!--加载pro配置文件-->
   <context:property-placeholder location="classpath:db.properties"/>
   <!--获取数据源的操作-->
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
      <property name="driverClass" value="${jdbc.driver}"/>
      <property name="jdbcUrl" value="${jdbc.url}"/>
      <property name="user" value="${jdbc.username}"/>
      <property name="password" value="${jdbc.password}"/>
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

配置Druid

导入依赖

 		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.3</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

配置

<!--加载pro配置文件-->
   <context:property-placeholder location="classpath:db.properties"/>
   <!--获取数据源的操作-->
   <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" >
      <property name="driverClassName" value="${jdbc.driver}"/>
      <property name="url" value="${jdbc.url}"/>
      <property name="username" value="${jdbc.username}"/>
      <property name="password" value="${jdbc.password}"/>
      <!-- 配置初始化大小、最小、最大 -->
      <!-- 通常来说,只需要修改initialSize、minIdle、maxActive -->
      <property name="initialSize" value="2" />
      <property name="minIdle" value="2" />
      <property name="maxActive" value="30" />
      <property name="testWhileIdle" value="false" />
      <!-- 配置获取连接等待超时的时间 -->
      <property name="maxWait" value="5000" />
      <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
      <property name="minEvictableIdleTimeMillis" value="30000" />
      <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
      <property name="timeBetweenEvictionRunsMillis" value="60000" />
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Spring事务说明

编程式事务控制(了解)

在这里插入图片描述

声明式事务控制(重点)

  • 事务管理不侵入开发组件:事务为系统层面的任务,而不是业务逻辑部分的,采用声明式控制事务将两者进行分离,降低耦合。
  • spring的声明式控制底层就是AOP
基于xml的事务控制

重点注意xml的配置

<!--声明事务的配置-->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <constructor-arg ref="dataSource" />
   </bean>
<!--使用aop进行事务的织入-->
   <tx:advice id="transactionTest" transaction-manager="transactionManager">
      <!--给那些方法配置事务 propagation="REQUIRED"配置事物的传播特性-->
      <tx:attributes>
         <tx:method name="*" propagation="REQUIRED"/>
      </tx:attributes>
   </tx:advice>
   <!--配置事务的切入-->
   <aop:config>
      <aop:pointcut id="test" expression="execution(* cn.supperbro.mapper.UserMapper.*(..))"/>
      <aop:advisor advice-ref="transactionTest" pointcut-ref="test"/>
   </aop:config>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

该配置详解:

  • 目标对象(切点):定义为要增强的方法,及事务要控制的方法
  • 通知(方法增强)
<!--声明事务的配置-->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <constructor-arg ref="dataSource" />
   </bean>
<tx:advice id="transactionTest" transaction-manager="transactionManager">
      <!--给那些方法配置事务 propagation="REQUIRED"配置事物的传播特性-->
      <tx:attributes>
         <tx:method name="*" propagation="REQUIRED"/>
      </tx:attributes>
   </tx:advice>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

关于声明事务的配置由不同的Dao层操作来决定使用哪种配置。

tx:attributes该命名空间指定的是事务操作的属性

name为指定的事务生效的方法:例如

 <tx:method name="add*" propagation="REQUIRED"/>
  • 1

表示的所有以add开头的方法

propagation
在这里插入图片描述

  • 织入
 -  <!--配置事务的织入-->
   <aop:config>
      <aop:pointcut id="test" expression="execution(* cn.supperbro.mapper.UserMapper.*(..))"/>
      <aop:advisor advice-ref="transactionTest" pointcut-ref="test"/>
   </aop:config>
  • 1
  • 2
  • 3
  • 4
  • 5
基于注解的事务控制
  • 导入命名空间,扫描支持注解组件
    自动扫描,该包下的所有都支持注解。
<context:component-scan base-package="cn.supperbro.mapper"/>
  • 1
  • 配置注解
@Repository("userMapper")
//该注解是注册该类
@Transactional
//该注解是将此类的所有方法添加事务操作
public class UserMapperImpl implements UserMapper {
    @Autowired
    //该注解自动匹配sqlSession对应的引用
    private SqlSessionTemplate sqlSession;


    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    //也可以作用在方法上,表示对该方法起作用
    public List<School> findSchool() {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        School school = new School();
        school.setId(11);
        school.setName("北京大学");
        add(school);
        delete(11);
        return mapper.findSchool();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 配置事务注解驱动
<!--声明事务的配置-->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <constructor-arg ref="dataSource" />
   </bean>
   下面为配置事务注解驱动,需要绑定上述的事务配置
   <tx:annotation-driven transaction-manager="transactionManager"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

好了,其他的就参考我们的官网

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/892597
推荐阅读
相关标签
  

闽ICP备14008679号