使用註解實現聲明式事務(實現數據庫操作、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
總結:多揣摩代碼,寫多了就熟悉了,誰都不是天才,加油