zoukankan      html  css  js  c++  java
  • Spring整合Mybatis

    Spring 整合 Mybatis

    在开始使用 MyBatis-Spring 之前,需要先熟悉 Spring 和 MyBatis 这两个框架和有关它们的术语。

    MyBatis-Spring 需要以下版本:

    MyBatis-Spring MyBatis Spring 框架 Spring Batch Java
    2.0 3.5+ 5.0+ 4.0+ Java 8+
    1.3 3.4+ 3.2.2+ 2.1+ Java 6+

    导入对应的 Maven 依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.4</version>
        </dependency>
    </dependencies>
    

    测试代码如下,dao:

    public interface UserMapper {
        List<User> queryUsers();
    }
    

    对应的 xml 还是和 Mybatis一样

    <select id="queryUsers" resultType="user">
        select * from user
    </select>
    

    pojo:

    public class User {
        private int id;
        private String name;
        private String pwd;
        ...
    

    下面创建一个 xml 使用 spring 的方式来创建 Mybatis所需要的对象

    SqlSessionFactory 需要一个 DataSource(数据源)。 这可以是任意的 DataSource,只需要和配置其它 Spring 数据库连接一样配置它就可以了。上面导入了 spring-jdbc 这个依赖,所以这个地方就使用 spring 的 DriverManagerDataSource 来创建数据源

    <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/mybatis_db?serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    

    创建SqlSessionFactory ,并指定对应的 Mybatis 配置文件及 Mapper.xml

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="mybatis-config.xml"/>
        <property name="mapperLocations" value="com/youzi/dao/*.xml"/>
    </bean>
    

    mybatis-config.xml 在这个地方没有完全舍弃,可以用来配置 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>
        <typeAliases>
            <package name="com.youzi.pojo"/>
        </typeAliases>
    </configuration>
    

    整合之后使用 SqlSessionTemplate 的方式创建 sqlSession

    SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSessionSqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    

    添加一个 Dao 实现类

    public class UserMapperImpl implements UserMapper {
    
        private SqlSessionTemplate sqlSession;
    
        public void setSqlSession(SqlSessionTemplate sqlSession) {
            this.sqlSession = sqlSession;
        }
    
        @Override
        public List<User> queryUsers() {
            return sqlSession.getMapper(UserMapper.class).queryUsers();
        }
    }
    

    sqlSession 注入 UserMapperImpl

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

    到此就可以直接使用 spring 获取 userMapper ,完整的 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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://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/mybatis_db?serverTimezone=UTC"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </bean>
    
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="configLocation" value="mybatis-config.xml"/>
            <property name="mapperLocations" value="com/youzi/dao/*.xml"/>
        </bean>
    
        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactory"/>
        </bean>
        
        <bean id="userMapper" class="com.youzi.dao.UserMapperImpl">
        	<property name="sqlSession" ref="sqlSession"/>
    	</bean>
    
    </beans>
    

    另一种方式:

    使用 SqlSessionDaoSupport 创建 SqlSessionSqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法

    public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
        @Override
        public List<User> getUsers() {
            return getSqlSession().getMapper(UserMapper.class).getUsers();
        }
    }
    
    <bean id="userMapper" class="com.youzi.dao.UserMapperImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
    

    事务

    声明式事务配置--使用 aop 的方式 Spring-tx 模块实现事务管理

    添加tx名字空间

    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* com.youzi.dao.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>
    
    事务传播行为类型 说明
    REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
    MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
    REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
    NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
    NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。
  • 相关阅读:
    作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心
    面向切面编程(AOP)的理解
    cakephp 的query方法,直接写在controller中是否 有点不合适
    《请不要辜负这个时代》
    我也谈——时间管理,让生活有序
    我也谈 AngularJS 怎么使用Directive, Service, Controller
    javascript 用call来继承实例属性
    好的资源
    angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习
    javascript 按位或(|),无符号右移(>>>)运算,组合技巧来实现————密码强度提示,四种情况??
  • 原文地址:https://www.cnblogs.com/wangjr1994/p/12541834.html
Copyright © 2011-2022 走看看