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

时间:2021-04-06 14:07:51   收藏:0   阅读:0

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包

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中的事务管理

思考:为什么需要事务?

在声明式的事务处理中,要配置一个切面,其中就用到了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);
    }
 }
 ?

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!