Spring基礎之使用註解實現聲明式事務(數據庫操作、servlet實現)

使用註解實現聲明式事務(實現數據庫操作、servlet實現)
1、事務:我們看下數據庫的事務是怎麼定義的
在這裏插入圖片描述
也就是說,一個事務中,如果調用很多方法,這些方法要麼全部都成功執行完,要麼全部執行失敗。
2、如何將一個方法定義成事務
1)導入jar包,在之前的工程的6個jar包基礎上,添加這幾個jar包:
在這裏插入圖片描述
2)編寫Student實例類

//Student.java
package njpji.model;
public class Student {
	private String stuNo;
	private String stuName;
	private String stuSex;
	public Student() {
		super();
	}
	
	public Student(String stuNo, String stuName, String stuSex) {
		super();
		this.stuNo = stuNo;
		this.stuName = stuName;
		this.stuSex = stuSex;
	}

	public String getStuNo() {
		return stuNo;
	}
	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public String getStuSex() {
		return stuSex;
	}
	public void setStuSex(String stuSex) {
		this.stuSex = stuSex;
	}
	@Override
	public String toString() {
		return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", stuSex=" + stuSex + "]";
	}
}

3)編寫Dao層,實現數據庫的持久操作。

StudentDao.java 接口

//StudentDao.java
package njpji.dao;
import java.util.List;
import njpji.model.Student;
public interface StudentDao {
	//添加學生
	public void addStudent(Student student) throws Exception;
	//查詢學生
	public Student queryStudent(String stuNo) throws Exception ;
	//刪除學生
	public void deleteStudent(String stuNo) throws Exception ;
	//批量查詢
	public List<Student> findStudents() throws Exception;
}

StudentDaoImpl.java 實現類

//StudentDaoImpl.java  實現了兩個操作數據庫的方法,作爲測試和講解之用
package njpji.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import org.apache.tomcat.jdbc.pool.DataSource;
import njpji.model.Student;
public class StudentDaoImpl implements StudentDao{
	private PreparedStatement sta = null;
	private Connection conn = null ;
	private ResultSet res = null;
	private DataSource dataSource;
	private Student student ;
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	
	public DataSource getDataSource() {
		return dataSource;
	}
	public Student getStudent() {
		return student;
	}
	@Override
	public void addStudent(Student student) throws Exception {
		
	}
	@Override
	public Student queryStudent(String stuNo) throws Exception {
		String sql = "select * from user where name=?";
		conn = dataSource.getConnection();
		sta = conn.prepareStatement(sql);
		sta.setString(1, stuNo);
		res = sta.executeQuery();
		while(res.next()) {
			student.setStuName(res.getString(1));
			student.setStuNo(res.getString(2));
			student.setStuSex(res.getString(3));
		}
		res.close();
		sta.close();
		conn.close();
		return student;
	}

	@Override
	public void deleteStudent(String stuNo) throws Exception {
		String sql = "delete from user where name=?";
		conn = dataSource.getConnection();
		sta = conn.prepareStatement(sql);
		sta.setString(1, stuNo);
		sta.executeUpdate();
		System.out.println("刪除學生成功");
		sta.close();
		conn.close();
	}
	@Override
	public List<Student> findStudents() throws Exception {
		return null;
	}
}

4)編寫service層,針對某一個功能模塊。

IDeleteStduent.java 接口

//IDeleteStduent.java
package njpji.service;
public interface IDeleteStudent {
	//刪除學生
	public void deleteStudent(String stuNo) throws Exception ;
}

DeleteStudentImpl.java 實現類:刪除學生
實現聲明式註解(@Transactional(readOnly = false ) //使用註解聲明事務

package njpji.service;
import org.springframework.transaction.annotation.Transactional;

import njpji.dao.StudentDaoImpl;
import njpji.model.Student;
public class DeleteStudentImpl implements IDeleteStudent{
	private StudentDaoImpl studentDaoImpl;
	
	public void setStudentDaoImpl(StudentDaoImpl studentDaoImpl) {
		this.studentDaoImpl = studentDaoImpl;
	}

	//刪除學生:先判斷該學生是否存在,不存在,不執行刪除操作,返回false;
	//學生存在,執行刪除操作,返回true
	@Transactional(readOnly = false)  //使用註解聲明事務
	@Override
	public void deleteStudent(String stuNo) throws Exception {
		//調用查詢
		Student student = studentDaoImpl.queryStudent(stuNo);
		if(student!=null) {
			//調用刪除
			studentDaoImpl.deleteStudent(stuNo);
		}else {
			System.out.println("該學生不存在");
		}
	}
	
}

5)編寫Servlet實現類,實現刪除學生

DeleteStudentServlet.java

package njpji.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import njpji.service.IDeleteStudent;
@WebServlet("/DeleteStudentServlet")
public class DeleteStudentServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ApplicationContext context;
    public DeleteStudentServlet() {
        super();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String stuNo = request.getParameter("stuNo");
		//加載applicationContext.xml初始化時生成的Servlet全局對象
		context = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
		IDeleteStudent  deleteStu = (IDeleteStudent) context.getBean("deleteStudentImpl");
		try {
			//調用刪除學生的方法
			deleteStu.deleteStudent(stuNo);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

6)編寫spring上下文配置文件以及web配置文件

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"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

	<!-- Student.java -->
	<bean id="student" class="njpji.model.Student" ></bean>
	
	<!-- StudentDaoImpl.java -->
	<bean id="stuDaoImpl" class="njpji.dao.StudentDaoImpl" p:dataSource-ref="dataSource" p:student-ref="student"></bean>
	
	<!-- DeleteStudentImpl.java -->
	<bean id="deleteStudentImpl" class="njpji.service.DeleteStudentImpl" p:studentDaoImpl-ref="stuDaoImpl"></bean>
	
	<!-- 添加事務支持 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	<!-- 配置事務管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" ></bean>
	
	<!-- 配置數據庫相關 -->
	<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
		<property name="url" value="jdbc:mysql://localhost:3306/test" />
		<property name="username" value="root"/>
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="password" value="caixibei" />
		<property name="maxActive" value="15"/>
		<property name="initialSize" value="5" />
	</bean>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>spring_web_project</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 指定spring ioc容器的位置 -->
  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<!-- 配置監聽器,用於加載spring ioc容器 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 配置servlet -->
	<servlet>
		<servlet-name>deleteStudentServlet</servlet-name>
		<servlet-class>njpji.servlet.DeleteStudentServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>deleteStudentServlet</servlet-name>
		<url-pattern>/deleteStudentServlet</url-pattern>
	</servlet-mapping>
</web-app>

7)編寫測試頁面

delete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>測試頁面</title>
</head>
<body><form action="/spring_web_project/deleteStudentServlet">
請輸入你要刪除的學生學號:<input type="text" name="stuNo" /><input type="submit" value="確認刪除" />
</form> 
</body>
</html>

8)數據庫
在這裏插入圖片描述
9)截圖
1、刪除學生,其實我寫錯了,是根據名字刪除,不要在意這些細節,哈哈哈
在這裏插入圖片描述
2、數據庫變化
在這裏插入圖片描述
代碼鏈接:day0818
總結:多揣摩代碼,寫多了就熟悉了,誰都不是天才,加油

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章