zoukankan      html  css  js  c++  java
  • Spring(十四)之编程性事务(续)

    Spring 编程式事务管理

    编程式事务管理方法允许你在对你的源代码编程的帮助下管理事务。这给了你极大地灵活性,但是它很难维护。

    在我们开始之前,至少要有两个数据库表,在事务的帮助下我们可以执行多种 CRUD 操作。

    一、准备两张表

    CREATE TABLE Student(
       ID   INT NOT NULL AUTO_INCREMENT,
       NAME VARCHAR(20) NOT NULL,
       AGE  INT NOT NULL,
       PRIMARY KEY (ID)
    );
    
    CREATE TABLE Marks(
       SID INT NOT NULL,
       MARKS  INT NOT NULL,
       YEAR   INT NOT NULL
    );

    二、编写StudentMarks

    package com.tutorialspoint;
    public class StudentMarks {
       private Integer age;
       private String name;
       private Integer id;
       private Integer marks;
       private Integer year;
       private Integer sid;
       public void setAge(Integer age) {
          this.age = age;
       }
       public Integer getAge() {
          return age;
       }
       public void setName(String name) {
          this.name = name;
       }
       public String getName() {
          return name;
       }
       public void setId(Integer id) {
          this.id = id;
       }
       public Integer getId() {
          return id;
       }
       public void setMarks(Integer marks) {
          this.marks = marks;
       }
       public Integer getMarks() {
          return marks;
       }
       public void setYear(Integer year) {
          this.year = year;
       }
       public Integer getYear() {
          return year;
       }
       public void setSid(Integer sid) {
          this.sid = sid;
       }
       public Integer getSid() {
          return sid;
       }
    }

    三、编写StudentDAO

    package com.tutorialspoint;
    import java.util.List;
    import javax.sql.DataSource;
    public interface StudentDAO {
       /** 
        * This is the method to be used to initialize
        * database resources ie. connection.
        */
       public void setDataSource(DataSource ds);
       /** 
        * This is the method to be used to create
        * a record in the Student and Marks tables.
        */
       public void create(String name, Integer age, Integer marks, Integer year);
       /** 
        * This is the method to be used to list down
        * all the records from the Student and Marks tables.
        */
       public List<StudentMarks> listStudents();
    }

    四、编写StudentMapper.java

    package com.tutorialspoint;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import org.springframework.jdbc.core.RowMapper;
    public class StudentMapper implements RowMapper<Student> {
       public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
          Student student = new Student();
          student.setId(rs.getInt("id"));
          student.setName(rs.getString("name"));
          student.setAge(rs.getInt("age"));
          return student;
       }
    }

    五、编写StudentJDBCTemplate.java

    package com.tutorialspoint;
    import java.util.List;
    import javax.sql.DataSource;
    import org.springframework.dao.DataAccessException;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.TransactionDefinition;
    import org.springframework.transaction.TransactionStatus;
    import org.springframework.transaction.support.DefaultTransactionDefinition;
    public class StudentJDBCTemplate implements StudentDAO {
       private DataSource dataSource;
       private JdbcTemplate jdbcTemplateObject;
       private PlatformTransactionManager transactionManager;
       public void setDataSource(DataSource dataSource) {
          this.dataSource = dataSource;
          this.jdbcTemplateObject = new JdbcTemplate(dataSource);
       }
       public void setTransactionManager(
          PlatformTransactionManager transactionManager) {
          this.transactionManager = transactionManager;
       }
       public void create(String name, Integer age, Integer marks, Integer year){
          TransactionDefinition def = new DefaultTransactionDefinition();
          TransactionStatus status = transactionManager.getTransaction(def);
          try {
             String SQL1 = "insert into Student (name, age) values (?, ?)";
             jdbcTemplateObject.update( SQL1, name, age);
             // Get the latest student id to be used in Marks table
             String SQL2 = "select max(id) from Student";
             int sid = jdbcTemplateObject.queryForInt( SQL2 );
             String SQL3 = "insert into Marks(sid, marks, year) " + 
                           "values (?, ?, ?)";
             jdbcTemplateObject.update( SQL3, sid, marks, year);
             System.out.println("Created Name = " + name + ", Age = " + age);
             transactionManager.commit(status);
          } catch (DataAccessException e) {
             System.out.println("Error in creating record, rolling back");
             transactionManager.rollback(status);
             throw e;
          }
          return;
       }
       public List<StudentMarks> listStudents() {
          String SQL = "select * from Student, Marks where Student.id=Marks.sid";
          List <StudentMarks> studentMarks = jdbcTemplateObject.query(SQL, 
                                             new StudentMarksMapper());
          return studentMarks;
       }
    }

    六、编写MainApp.java

    package com.tutorialspoint;
    import java.util.List;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import com.tutorialspoint.StudentJDBCTemplate;
    public class MainApp {
       public static void main(String[] args) {
          ApplicationContext context = 
                 new ClassPathXmlApplicationContext("Beans.xml");
          StudentJDBCTemplate studentJDBCTemplate = 
          (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");     
          System.out.println("------Records creation--------" );
          studentJDBCTemplate.create("Zara", 11, 99, 2010);
          studentJDBCTemplate.create("Nuha", 20, 97, 2010);
          studentJDBCTemplate.create("Ayan", 25, 100, 2011);
          System.out.println("------Listing all the records--------" );
          List<StudentMarks> studentMarks = studentJDBCTemplate.listStudents();
          for (StudentMarks record : studentMarks) {
             System.out.print("ID : " + record.getId() );
             System.out.print(", Name : " + record.getName() );
             System.out.print(", Marks : " + record.getMarks());
             System.out.print(", Year : " + record.getYear());
             System.out.println(", Age : " + record.getAge());
          }
       }
    }

    七、编写Beans.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-3.0.xsd ">
    
       <!-- Initialization for data source -->
       <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/test"/>
          <property name="username" value="root"/>
          <property name="password" value="1234"/>
       </bean>
    
       <!-- Initialization for TransactionManager -->
       <bean id="transactionManager" 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource"  ref="dataSource" />    
       </bean>
    
       <!-- Definition for studentJDBCTemplate bean -->
       <bean id="studentJDBCTemplate"
          class="com.tutorialspoint.StudentJDBCTemplate">
          <property name="dataSource"  ref="dataSource" />
          <property name="transactionManager"  ref="transactionManager" />    
       </bean>
    
    </beans>

    八、运行MainApp.java

    结果如图:

    通常情况不报错,就表示没有问题。

  • 相关阅读:
    修改nuget包默认存放路径,避免增加C盘的负担
    .Net Core 3.0 (一):安装Vs2019
    .NET Core 学习资料
    SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
    MySql 时间查询
    如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?
    SqlServer 获取工作日(周六、周日休息,周六日不休息,周六不休息)
    SQL Server 删除数据库中表数据
    SQL Server 删除数据库所有表和所有存储过程
    摘要
  • 原文地址:https://www.cnblogs.com/youcong/p/9460920.html
Copyright © 2011-2022 走看看