Spring——Spring整合Mybatis及事务

1、Mybatis-Spring整合

官网:http://mybatis.org/spring/zh/index.html

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。

创建映射器 mapper 和 SqlSession 并注入到 bean 中。

需要的版本对应:

  1. 首先看一下包的结构

  2. pom.xml文件中导入相应的依赖

    <?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">
        <parent>
            <artifactId>spring02</artifactId>
            <groupId>com.jiang</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>spring04</artifactId>
    
        <dependencies>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.8</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.2</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--Spring-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.1.10.RELEASE</version>
            </dependency>
            <!--Spring jdbc(new)-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.1.10.RELEASE</version>
            </dependency>
            <!--aop aspectjweaver-->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.4</version>
            </dependency>
            <!--mybatis-spring-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.2</version>
            </dependency>
    
        </dependencies>
    
        <!-- 如果xml在java文件下,就要设置资源过滤-->
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </project>
    
  3. 编写UserMapper接口

    package com.jiang.mapper;
    
    import com.jiang.pojo.User;
    
    import java.util.List;
    
    public interface UserMapper {
        List<User> getUserList();
    }
    
    
  4. 编写User实体类

    package com.jiang.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
        private int id;
        private String name;
        private String pwd;
    }
    
    
    
  5. 编写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">
    <!--namespace=绑定一个对应的Dao/Mapper接口-->
    <mapper namespace="com.jiang.mapper.UserMapper">
    
        <!--select查询语句-->
        <select id="getUserList" resultType="com.jiang.pojo.User">
           select * from mybatis.user
       </select>
    
    </mapper>
    
  6. 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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--整合mybatis-->
    
        <!--1.数据源配置-->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </bean>
    
                <!--2.注入sqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
             <!--别名-->
            <property name="typeAliases" value="com.jiang.pojo.User"/>
            <!--扫描包-->
            <property name="mapperLocations" value="classpath:com/jiang/xml/*.xml"/>
        </bean>
    
             <!--3.创建sqlSession-->
        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactory"/>
        </bean>
    
              <!--4.放入bean-->
        <bean id="userMapperImpl" class="com.jiang.mapper.impl.UserMapperImpl">
            <property name="sqlSession" ref="sqlSession"/>
        </bean>
    
    </beans>
    
  7. applicationContext.xml编写第3步完成后,去编写UserMapper接口的实现类UserMapperImpl,最后在去做第4步

    package com.jiang.mapper.impl;
    
    import com.jiang.pojo.User;
    import com.jiang.mapper.UserMapper;
    import org.mybatis.spring.SqlSessionTemplate;
    
    import java.util.List;
    //实现类
    public class UserMapperImpl implements UserMapper {
        //注入sqlSession:   Spring管理了
        private SqlSessionTemplate sqlSession;
    
    
        public void setSqlSession(SqlSessionTemplate sqlSession) {
            this.sqlSession = sqlSession;
        }
    
        @Override
        public List<User> getUserList() {
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            return mapper.getUserList();
        }
    }
    
    

2、事务的控制

下面的所有操作基于上面操作都成功的前提下!

  1. UserMapper里增加添加用户和删除用户的方法

    package com.jiang.mapper;
    
    import com.jiang.pojo.User;
    
    import java.util.List;
    
    public interface UserMapper {
        List<User> getUserList();
    
        //添加用户
        int addUser(User user);
    
    
        //删除用户
        int deleteUser(int id);
    }
    
    
  2. UserMapperImpl重写方法

    package com.jiang.mapper.impl;
    
    import com.jiang.pojo.User;
    import com.jiang.mapper.UserMapper;
    import org.mybatis.spring.SqlSessionTemplate;
    
    import java.util.List;
    //实现类
    public class UserMapperImpl implements UserMapper {
        //注入sqlSession:   Spring管理了
        private SqlSessionTemplate sqlSession;
    
    
        public void setSqlSession(SqlSessionTemplate sqlSession) {
            this.sqlSession = sqlSession;
        }
    //查询用户
        @Override
        public List<User> getUserList() {
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            return mapper.getUserList();
        }
    //添加用户
        @Override
        public int addUser(User user) {
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            return mapper.addUser(user);
        }
    //删除用户
        @Override
        public int deleteUser(int id) {
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            return mapper.deleteUser(id);
        }
    }
    
    
  3. UserMapper.xml里编写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=绑定一个对应的Dao/Mapper接口-->
    <mapper namespace="com.jiang.mapper.UserMapper">
    
    <!--select查询语句-->
    <select id="getUserList" resultType="com.jiang.pojo.User">
           select * from mybatis.user
       </select>
    
    <!--insert添加语句-->
    <insert id="addUser" parameterType="User">
            insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
        </insert>
        
        
    <!--delete删除语句-->
    <delete id="deleteUser" parameterType="int">
            delete from user where id=#{id}
        </delete>
    </mapper>
    
  4. applicationContext.xml头文件中添加事务和AOP支持,并整合事务!

     <!--添加事务和AOP支持 我这边是在上面那些支持存在的情况下加这些 这里只是为了更简洁突出事务和AOP支持-->
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:aop="http://www.springframework.org/schema/aop"  
            http://www.springframework.org/schema/tx
            https://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/aop
            https://www.springframework.org/schema/aop/spring-aop.xsd">
                                                                      
                                                                      
                                                                      
           <!--整合事务-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <constructor-arg ref="dataSource" />
        </bean>
    
        <!--事务配置增强,一定要检查pom.xml文件中有没有aop aspectjweaver 织入包-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!--propagation 事务的传播特性 默认REQUIRED-->
                <!-- * 控制所有方法-->
                <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
        </tx:advice>
    
        <aop:config>
            <!--切入点-->
            <aop:pointcut id="txPointCut" expression="execution(* com.jiang.mapper.*.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
        </aop:config>
    
    </beans>
    
  5. 测试

    @Test
        public void test3(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserMapper userMapperImpl = (UserMapper) context.getBean("userMapperImpl");
            userMapperImpl.addUser(new User(4,"嘻嘻","898798"));
    
        }
    

    测试成功!

    注意事项:

    如果把测试类中的:

    UserMapper userMapperImpl = (UserMapper) context.getBean("userMapperImpl");
    

    改为:

    UserMapperImpl userMapperImpl = (UserMapperImpl) context.getBean("userMapperImpl");
    

    会报类型转换异常:java.lang.ClassCastException: com.sun.proxy.$Proxy8 cannot be cast to com.jiang.mapper.impl.UserMapperImpl

    原因解释参考博客:https://blog.csdn.net/yinzn2011/article/details/46455973

posted @ 2020-02-26 20:46  Godlesss  阅读(373)  评论(0编辑  收藏  举报