• Spring 与 Mybatis整合


    准备所需JAR包



    编写配置文件

    db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
    jdbc.username=root
    jdbc.password=root
    jdbc.maxTotal=30
    jdbc.maxIdle=10
    jdbc.initialSize=5
    

    连接数据库的基本4项外,还配置了数据库连接池的最大连接数(maxTotal)、最大空闲连接数(maxIdle)以及初始化连接数(initialSize)

    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"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.3.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    	<!--读取db.properties-->
    	<context:property-placeholder location="classpath:db.properties"/>
    	
    	<!--配置数据源 -->
    	<bean id="dataSource"
    		class="org.apache.commons.dbcp2.BasicDataSource">
    		<!--数据库驱动 -->
    		<property name="driverClassName" value="${jdbc.driver}" />
    		<!--连接数据库的ur1 -->
    		<property name="url" value="${jdbc.url}" />
    		<!--连接数据库的用户名 -->
    		<property name="username" value="${jdbc.username}" />
    		<!--连接数据库的密码-->
    		<property name="password" value="${jdbc.password}" />
    		<!--最大连接数-->
    		<property name="maxTotal" value="${jdbc.maxTotal}" />
    		<!--最大空闲连接-->
    		<property name="maxIdle" value="${jdbc.maxIdle}" />
    		<!--初始化连接数-->
    		<property name="initialSize" value="${jdbc.initialSize}" />
    	</bean>
    	
    	<!--事务管理器,依赖于数据源 -->
    	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource" ref="dataSource"/>
    	</bean>
    	
    	<!--注册事务管理器驱动,开启事务注解 -->
    	<tx:annotation-driven transaction-manager="transactionManager"/>
    	
    	<!--配置MyBatis工厂 -->
    	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<!--注入数据源 -->
    		<property name="dataSource" ref="dataSource" />
    		<!--指定核心配置文件位置 -->
    		<property name="configLocation" value="classpath:mybatis-config.xml" />
    	</bean>
    	
    	
    	<bean id="userDao" class="com.ssm.dao.impl.UserDaoImpl">
    		<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    	</bean>
    	<!-- Mapper代理开发(基于MapperFactoryBean) -->
    	<!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    		<property name="mapperInterface" value="com.ssm.mapper.UserMapper" />
    		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
    	</bean> -->
    	<!-- Mapper代理开发(基于MapperScannerConfigurer) -->
    	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<property name="basePackage" value="com.ssm.mapper" />
    	</bean>
    </beans>
    

      首先定义了读取properties文件的配置,然后配置了数据源,接下来配置了事务管理器并开启了事务注解,最后配置了MyBatis工厂来与 Spring整合。其中,MyBatis工厂的作用就是构建SqlSessionFactory,它是通过 MyBatis-spring包中提供的org. mybatis.
    Spring.SqlSessionFactoryBean类来配置的。通常,在配置时需要提供两个参数:一个是数据源,另一个是MyBatis的配置文件路径。这样Spring的loC容器就会在初始化id为 sqlSessionFactory的Bean时解析MyBatis的配置文件,并与数据源一同保存到 Spring的Bean中。

    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>
    	<!--配置别名 -->
    	<typeAliases>
    		<package name="com.ssm.po"/>
    	</typeAliases>
    	<!--配置Mapper的位置 -->
    	<mappers>
    		...
    	</mappers>
    </configuration>
    

    由于在 Spring中已经配置了数据源信息,所以在MyBatis的配置文件中就不再需要配置数源信息。这里只需要使用< typeAliases>和元素来配置文件别名以及指定Mapper文件位置即可

    整合

    传统DAO方式的开发整合

      采用传统DAO开发方式进行MyBatis与Spring框架的整合时,我们需要编写DAO接口以及接口的实现类,并且需要向DAO实现类中注入SqlSessionFactory,然后在方法体内通过 SqlSessionFactory创建SqlSession。为此,我们可以使用mybatis-spring包中所提供的 SqlSessionTemplate类或 SqlSessionDaoSupport类来实现此功能。这两个类的描述如下:
      SqlSessionTemplate:是mybatis-spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的 SqlSession和当前Spring的事务是相关的。它还管理 SqlSession的生命周期,包含必要的关闭、提交和回滚操作。
      SqlSessionDaoSupport:是一个抽象支持类,它继承了 DaoSupport类,主要是作为DAO的基类来使用。可以通过SqlSessionDaoSupport类的getSqlSession()方法来获取所需的SqISession。
    UserMapper.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">
    <mapper namespace="com.ssm.po.UserMapper">
    	<!--根据用户编号获取用户信息 -->
    	<select id="findUserById" parameterType="Integer" resultType="User">
    		select * from t_user where id=#{id}
    	</select>
    </mapper>
    

    UserDaolmp.java:

    package com.ssm.dao.impl;
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    import com.ssm.dao.UserDao;
    import com.ssm.po.User;
    public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    	public User findUserById(Integer id) {
    		return this.getSqlSession().selectOne("com.ssm.po.UserMapper.findUserById", id);
    	}
    }
    

      UserDaolmpl类继承了SqlSessionDaoSupport并实现了UserDao接口。其中, SqlSessionDaoSupport类在使用时需要一个 SqlSessionFactory或一个SqlSessionTemplate对象,所以需要通过Spring给SqlSessionDaoSupport类的子类对象注入一个 SqlSessionFactory或SqlSessionTemplate。这样,子类中就能通过调用SqlSessionDaoSupport类的getSqlSession()方法来获取SqISession对象,并使用SqISession对象中的方法了。

    DaoTest. java:

    package com.ssm.test;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import com.ssm.dao.UserDao;
    import com.ssm.po.User;
    public class UserDaoTest {
    	@Test
    	public void findUserByIdDaotest(){
    		//1.初始化Spring容器,加载配置文件
    		ApplicationContext applicationContext=
    new ClassPathXmlApplicationContext("applicationContext.xml");
    		//2.通过容器获取userDao实例
    		UserDao userDao=(UserDao)applicationContext.getBean("userDao");
    		User user=userDao.findUserById(1);
    		System.out.println(user);
    	}
    }
    

    Mapper接口方式的开发整合

    基于 MapperFactoryBean的整合

    UserMapper. java

    package com.ssm.mapper;
    import com.ssm.po.User;
    public interface UserMapper {
    	public User findUserById(Integer id);
    }
    

    UserMapper.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">
    <mapper namespace="com.ssm.mapper.UserMapper">
    	<!--根据用户编号获取用户信息 -->
    	<select id="findUserById" parameterType="Integer" resultType="User">
    		select * from t_user where id=#{id}
    	</select>
    </mapper>
    
    <!-- Mapper代理开发(基于MapperFactoryBean) -->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    	<property name="mapperInterface" value="com.ssm.mapper.UserMapper" />
    	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
    
    @Test
    public void findUserByldMapperTest(){
    	ApplicationContext applicationContext=
    new ClassPathXmlApplicationContext("applicationContext.xml");
    	UserMapper userMapper=(UserMapper)applicationContext.getBean("userMapper");
    	User user=userMapper.findUserById(1);
    	System.out.println(user);
    }
    

    基于 MapperScannerConfigurer的整合

    <!-- Mapper代理开发(基于MapperScannerConfigurer) -->
    	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<property name="basePackage" value="com.ssm.mapper" />
    	</bean>
    
    版权声明:本文为博主原创文章,转载请附上博文链接!
  • 相关阅读:
    python datetime unix时间戳以及字符串时间戳转换
    Linux下Shell的for循环语句
    分布式学习最佳实践:从分布式系统的特征开始(附思维导图)
    什么是分布式系统,如何学习分布式系统
    Spring Boot 之发送邮件
    v8是怎么实现更快的 await ?深入理解 await 的运行机制
    分布式=高并发=多线程
    半个月使用rust语言的体验
    Enter Query Mode Search Tricks Using Enter_Query Built-in in Oracle Forms
    How to Log Users Login and Logout Details Through Oracle Forms
  • 原文地址:https://www.cnblogs.com/zq98/p/13193262.html
Copyright © 2020-2023  润新知