码迷,mamicode.com
首页 > 编程语言 > 详细

第85天学习打卡(Spring 使用Spring实现AOP 整合mybatis 声明式事务)

时间:2021-04-06 14:07:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:nes   Requires   after   Delve   log   代码   mes   property   存储器   

11.3 使用Spring实现AOP

方式三:使用注解实现!

 <?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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/aop
          https://www.springframework.org/schema/aop/spring-aop.xsd">
 <bean id="userService" class="com.kuang.service.UserServiceImpl"/>
     <bean id="log" class="com.kuang.log.Log"/>
     <bean id="afterLog" class="com.kuang.log.AfterLog"/>
 ?
     <bean id="annotationPointcut" class="com.kuang.diy.AnnotationPointCut"/>
     <!--开启注解支持! JDK(默认proxy-target-class="false") cglib(proxy-target-class="true")-->
     <aop:aspectj-autoproxy proxy-target-class="false"/>
 ?
 ?
 ?
 </beans>

 

12.整合Mybatis

步骤:

1.导入相关jar包

    • junit

    • mybatis

    • mysql数据库

    • aop织入

    • mybatis-spring【new】

2.编写配置文件

 <?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>spring-study</artifactId>
         <groupId>com.kuang</groupId>
         <version>1.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 ?
     <artifactId>spring-11-mybatis</artifactId>
 ?
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
 ?
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
 ?
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.5</version>
        </dependency>
 ?
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
 ?
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
 ?
    </dependencies>
  <build>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
                 <includes>
                     <include>**/*.properties</include>
                     <include>**/*.xml</include>
                 </includes>
                 <filtering>true</filtering>
             </resource>
             <resource>
                 <directory>src/main/java</directory>
                 <includes>
                     <include>**/*.properties</include>
                     <include>**/*.xml</include>
                 </includes>
                 <filtering>true</filtering>
             </resource>
         </resources>
     </build>
 </project>
     

 

3.测试

12.1 回忆mybatis

1.编写实体类

 package com.kuang.pojo;
 ?
 import lombok.Data;
 ?
 @Data
 public class User {
     private int id;
     private String name;
     private String pwd;
 ?
 }
 ?

 

2.编写核心配置文件

 <?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.kuang.pojo"/>
     </typeAliases>
 ?
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                 <property name="username" value="root"/>
                 <property name="password" value="123456"/>
             </dataSource>
         </environment>
     </environments>
     <mappers>
         <mapper class="com.kuang.mapper.UserMapper"/>
 ?
     </mappers>
 ?
 </configuration>

 

3.编写接口

 package com.kuang.mapper;
 ?
 import com.kuang.pojo.User;
 ?
 import java.util.List;
 ?
 public interface UserMapper {
     public List<User> selectUser();
 }
 ?

 

4.编写mapper.xml

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.kuang.mapper.UserMapper">
 ?
     <select id="selectUser" resultType="user">
 select * from mybatis.user;
     </select>
 ?
 ?
 </mapper>

 

5.测试

 import com.kuang.mapper.UserMapper;
 import com.kuang.pojo.User;
 import org.apache.ibatis.io.Resources;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 import org.junit.Test;
 ?
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 ?
 ?
 public class MyTest {
     @Test
     public void test() throws IOException {
         String resources = "mybatis-config.xml";
         InputStream in = Resources.getResourceAsStream(resources);
         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
         SqlSession sqlSession = sqlSessionFactory.openSession(true);
 ?
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
         List<User> userList = mapper.selectUser();
         for (User user : userList) {
             System.out.println(user);
        }
 ?
    }
 }
 ?

 

连接数据库时url要写:jdbc:mysql://localhost:3306/?serverTimezone=GMT

技术图片

 

遇到的问题:URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)

解决办法:

技术图片

遇到的问题:IDEA中的xml文件没有提示怎么配置

解决办法:

技术图片

 

12.2 Mybatis-spring

1.编写数据源配置

2.sqlSessionFactory

3.sqlSessionTemplate

4.需要给接口加实现类【】

5.将自己写的实现类,注入到Spring中

spring-dao.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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/aop
          https://www.springframework.org/schema/aop/spring-aop.xsd">
     <!--dataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
 我们这里使用Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource-->
     <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=utf8"/>
         <property name="username" value="root"/>
         <property name="password" value="123456"/>
     </bean>
     <!--sqlSessionFactory-->
     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         <property name="dataSource" ref="dataSource" />
         <!--绑定Mabatis配置文件-->
         <property name="configLocation" value="classpath:mybatis-config.xml"/>
         <property name="mapperLocations" value="classpath:com/kuang/mapper/*.xml"/>
 ?
     </bean>
     <!--SqlSessionTemplate:就是我们使用的sqlSession-->
     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
         <!--只能使用构造器注入sqlSessionFactory.因为它没有set方法-->
         <constructor-arg index="0" ref="sqlSessionFactory"/>
     </bean>
    <bean id="userMapper" class="com.kuang.mapper.UserMapperImpl">
         <property name="sqlSession" ref="sqlSession"/>
     </bean>
 ?
 ?
 </beans>

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.kuang.pojo"/>
     </typeAliases>
 </configuration>

 

applicationComtext.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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/aop
          https://www.springframework.org/schema/aop/spring-aop.xsd">
   <import resource="spring-dao.xml"/>
 ?
     <bean id="userMapper" class="com.kuang.mapper.UserMapperImpl">
         <property name="sqlSession" ref="sqlSession"/>
     </bean>
     <bean id="userMapper2" class="com.kuang.mapper.UserMapperImpl2">
         <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
     </bean>
 ?
 ?
 </beans>

 

6.测试使用即可

 

13 声明式事务

1 回顾事务

  • 把一组业务当成一个业务来做;要么都成功,要么都失败!

  • 事务在项目开发中,十分的重要,涉及到数据一致性问题,不能马虎!

  • 确保完整性和一致性。

事务的ACID原则:

  • 原子性

  • 一致性

  • 隔离性

    • 多个业务可能操作同一个资源,防止数据损坏

  • 持久性

    • 事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中!

2.spring中的事务管理

  • 声明式事务:AOP

  • 编程式事务:需要在代码中,进行事务的管理

思考:为什么需要事务?

  • 如果不配置事务,可能存在数据提交不一致的情况

  • 如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务

  • 事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题,不容马虎!

在声明式的事务处理中,要配置一个切面,其中就用到了propagation,表示打算对这些方法怎么使用事务,是用还是不用,其中propagation有七种配置,REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。默认是REQUIRED。

Spring中7种Propagation类的事务属性详解:

REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

UserMapper:

 package com.kuang.mapper;
 ?
 import com.kuang.pojo.User;
 ?
 import java.util.List;
 ?
 public interface UserMapper {
     public List<User> selectUser();
 ?
     //添加一个用户
     public int addUser(User user);
 ?
     //删除一个用户
     public int deleteUser(int id);
 }
 ?

 

 <?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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
          https://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/aop
          https://www.springframework.org/schema/aop/spring-aop.xsd
          http://www.springframework.org/schema/tx
          https://www.springframework.org/schema/tx/spring-tx.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?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
         <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="classpath:mybatis-config.xml"/>
         <property name="mapperLocations" value="classpath:com/kuang/mapper/*.xml"/>
 ?
     </bean>
     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
         <constructor-arg index="0" ref="sqlSessionFactory"/>
     </bean>
 ?
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
     </bean>
     <tx:advice id="txAdvice" transaction-manager="transactionManager">
 <!--       给哪些方法配置事务-->
 <!--       配置事务的传播特性:new propagation-->
         <tx:attributes>
             <tx:method name="add" propagation="REQUIRED"/>
             <tx:method name="delete" propagation="REQUIRED"/>
             <tx:method name="update" propagation="REQUIRED"/>
             <tx:method name="query" read-only="true"/>
             <tx:method name="*" propagation="REQUIRED"/>
         </tx:attributes>
     </tx:advice>
 ?
 <!--   配置事务切入-->
     <aop:config>
         <aop:pointcut id="txPointCut" expression="execution(* com.kuang.mapper.*.*(..))"/>
         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
     </aop:config>
 ?
 ?
 </beans>

UserMapper.xml:

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.kuang.mapper.UserMapper">
 ?
     <select id="selectUser" resultType="user">
 select * from mybatis.user;
     </select>
     
     <insert id="addUser" parameterType="user">
        insert into mybatis.user(id,name,pwd) value (#{id},#{name},#{pwd});
     </insert>
 <delete id="deleteUser" parameterType="int">
 delete from mybatis.user where id=#{id}
 ?
 </delete>
 ?
 </mapper>

UserMapperImpl:

 package com.kuang.mapper;
 ?
 import com.kuang.pojo.User;
 import org.mybatis.spring.SqlSessionTemplate;
 import org.mybatis.spring.support.SqlSessionDaoSupport;
 ?
 import java.util.List;
 ?
 public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
 ?
     public List<User> selectUser() {
 ?
         User user = new User(5, "小王", "213321");
 ?
         UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
         mapper.addUser(user);
         mapper.deleteUser(4);
         return mapper.selectUser();
    }
 ?
     public int addUser(User user) {
         return getSqlSession().getMapper(UserMapper.class).addUser(user);
    }
 ?
     public int deleteUser(int id) {
         return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
    }
 }
 ?

 

第85天学习打卡(Spring 使用Spring实现AOP 整合mybatis 声明式事务)

标签:nes   Requires   after   Delve   log   代码   mes   property   存储器   

原文地址:https://www.cnblogs.com/doudoutj/p/14615104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!