java框架学习——Spring AOP声明式事务控制简单示例

一.创建使用的数据表在Mysql数据库中spring中创建student表

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `major` varchar(255) DEFAULT NULL,
  `bookNum` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('2', 'update', 'Ph', '10');
INSERT INTO `student` VALUES ('4', 'd', 'computer', '20');
INSERT INTO `student` VALUES ('5', 'test', 'Science', '30');

二.搭建开发环境
1.新建maven环境命名为studenttx_xml下一步直到完成
在这里插入图片描述
首先在pom.xmlzhong导入必要依赖如下:

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lut</groupId>
    <artifactId>studenttx_xml</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
    </dependencies>

</project>

2.创建学生实体类
在这里插入图片描述
Student.java中代码如下:

package com.lut.domain;

public class Student {
    private int id;
    private String name;
    private String major;
    private  int bookNum;
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", major='" + major + '\'' +
                ", bookNum=" + bookNum +
                '}';
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
   public String getMajor() {
        return major;
    }
    public void setMajor(String major) {
        this.major = major;
    }
    public int getBookNum() {
        return bookNum;
    }
    public void setBookNum(int bookNum) {
        this.bookNum = bookNum;
    }
}

3.创建持久层dao及实现
①IStudentDao.java
在这里插入图片描述
IStudentDao.java代码如下:

package com.lut.dao;

import com.lut.domain.Student;

public interface IStudentDao {
    //通过name查询学生信息
    Student findStudentByName(String studentName);
    //通过id查询学生信息
    Student findStudentById(Integer studentId);
    //更新学生信息
    void updateStudent(Student student);
}

②impl.StudentDaoImpl.java如下:
在这里插入图片描述
StudentDaoImpl.java实现代码如下:

package com.lut.dao.impl;

import com.lut.dao.IAccountDao;
import com.lut.domain.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import java.util.List;
/**
 * @author Roy
 * @date 2020/7/27 15:00
 * 账户的持久层实现类
 */
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
    public Account findAccountById(Integer accountId) {
        List<Account>accounts= super.getJdbcTemplate().query("select * from account where id=?",new BeanPropertyRowMapper<Account>(Account.class),accountId);
        return accounts.isEmpty()?null:accounts.get(0);
    }

    public Account findAccountByName(String accountName) {
        List<Account>accounts= super.getJdbcTemplate().query("select * from account where name=?",new BeanPropertyRowMapper<Account>(Account.class),accountName);
        if(accounts.isEmpty()){
            return null;
        }
        if(accounts.size()>1){
            throw new RuntimeException("结果集不唯一");
        }
        return accounts.get(0);
    }
    public void updateAccount(Account account) {
        super.getJdbcTemplate().update("update account set name=?,money=? where id=?",
        account.getName(),account.getMoney(),account.getId());
    }
}

4.创建业务层service以及实现
①IStudentService如下
在这里插入图片描述
IStudentService.java中代码如下:

package com.lut.service;

import com.lut.domain.Student;

public interface IStudentService {
    //通过name查询学生信息
    Student findStudentByName(String studentName);
    //通过id查询学生信息
    Student findStudentById(Integer studentId);
    //更新学生信息
    void updateStudent(Student student);
}

②StudentServiceImpl.java如下:
在这里插入图片描述
StudentServiceImpl.java中代码如下:

package com.lut.service.impl;

import com.lut.dao.IStudentDao;
import com.lut.domain.Student;
import com.lut.service.IStudentService;

public class StudentServiceImpl implements IStudentService {
    private IStudentDao studentDao;

    public void setStudentDao(IStudentDao studentDao) {
        this.studentDao = studentDao;
    }

    public Student findStudentByName(String studentName) {
        return studentDao.findStudentByName(studentName);
    }

    public Student findStudentById(Integer studentId) {
        return studentDao.findStudentById(studentId);
    }

    public void updateStudent(Student student) {
        studentDao.updateStudent(student);
    }

    public void borrowBook(String targetName, String sourceName, int bookNum) {
        //根据姓名查询被借书学生
        Student source=studentDao.findStudentByName(sourceName);
        //根据姓名查询借书学生
        Student target=studentDao.findStudentByName(targetName);
        //被借书学生bookNum减书
        source.setBookNum(source.getBookNum()-bookNum);
        //借书学生bookNum加书
        target.setBookNum((target.getBookNum()+bookNum));
        //更新被借书学生信息
        studentDao.updateStudent(source);
        //更新借书学生信息
        studentDao.updateStudent(target);
    }
}

5.在resources下面创建配置文件bean.xml
在这里插入图片描述
bean.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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        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="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>
    <!--配置持久层-->
    <bean id="studentDao" class="com.lut.dao.impl.StudentDaoImpl">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置业务层-->
    <bean id="studentService" class="com.lut.service.impl.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"></property>
    </bean>
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置事务的通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!--配置事务的属性-->
        <tx:attributes>
            <tx:method name="transfer" propagation="REQUIRED" read-only="false"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!--配置AOP-->
    <aop:config>
        <!--配置切入点表达式-->
        <aop:pointcut id="pt1" expression="execution(* com.lut.service.impl.*.*(..))"></aop:pointcut>
        <!--建立切入点表达式和事务通知的对应关系-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
    </aop:config>
</beans>

6.创建测试类StudentTest测试控制
在这里插入图片描述
StudentTest.java中代码如下:

package com.lut.test;

import com.lut.service.IStudentService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentTest {
    @Test
    public void testBorrow(){
        //获取容器
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //得到业务层对象
        IStudentService studentService=(IStudentService)ac.getBean("studentService",IStudentService.class);
        //执行方法
        studentService.borrowBook("d","test",3);
    }
}

测试成功示例成功完成
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值