ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring-基础学习04

2021-01-26 13:58:53  阅读:76  来源: 互联网

标签:事务 return 04 Spring request param 学习 student response


【第一章】事务管理【重点】

1 Spring事务管理核心对象

1.1 PlatformTransactionManager对象(需要配置)

PlatformTransactionManager是平台事务管理对象,是一个接口,它里面提供了常用的操作事务的方法。

在这里插入图片描述

注意:PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类,例如:Dao 层技术是jdbc 或 mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager
Dao 层技术是hibernate时:org.springframework.orm.hibernate5.HibernateTransactionManager

1.2 TransactionDefinition对象(需要配置)

1.2.1 TransactionDefinition 是事务的定义信息对象,里面有如下方法:

在这里插入图片描述

1.2.2 事务隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读,加粗为默认且常用

ISOLATION_DEFAULT(默认值,常用)
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE

1.2.3 事务传播行为

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值,常用)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER:以非事务方式运行,如果当前存在事务,抛出异常
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作
超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置
是否只读:建议查询时设置为只读,增、删、改不能是只读。

1.3 TransactionStatus对象(了解)

TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下:
在这里插入图片描述

2 声明式事务管理(xml)【重点】

前提:导入相关关依赖,在applicationContext.xml中引入aop和tx名称空间

spring-context、aspectjweaver、spring-jdbc(内部包含了spring-tx)

【第一步】:配置事务管理器DataSourceTransactionManager对象

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

【第二步】:配置事务的属性,也就是事务定义信息

在这里插入图片描述

<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <!--
    表示transfer方法都需要事务管理
    read-only="false" 是否只读,只读事务不会回滚,只能提交,对于增删改操作都应该是非只读事务,也是默认的。
    -->
    <tx:method name="transfer" read-only="false"/>
    <!--表示以trans开头的方法都需要事务管理-->
    <!--<tx:method name="trans*"/>-->
  </tx:attributes>
</tx:advice>

注意:只读事务中只能做查询操作,如果做增删改操作会出异常,异常信息如下:

在这里插入图片描述

【第三步】:AOP配置

<aop:config>
  <!--定义切入点表达式-->
  <aop:pointcut id="pt" expression="execution(* com.itheima.service.*.*(..))"/>
  <!--配置通知-->
  <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>

3 声明式事务管理(半xml半注解)【重点】

【第一步】:配置事务管理器DataSourceTransactionManager对象

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

【第二步】:开启spring的声明式事务管理的注解驱动

<!--开启声明式事务管理的注解支持-->
<tx:annotation-driven transaction-manager="transactionManager"/>

【第三步】在类/接口/方法上使用@Transactional注解表示使用事务管理

@Transactional  //用在类或者接口上,表示该类/接口中的所有方法都会进行事务管理
public interface AccountService {

  void transfer(Integer outId, Integer inId, Double money);
	
  void transfer2(Integer outId, Integer inId, Double money);

  @Transactional(readOnly = true)  //覆盖接口上声明的事务
  void findAll();
}

4 声明式事务管理纯注解【了解】

4.1 主配置类

@Configuration
@ComponentScan("com.itheima")//<context:component-scan base-package="com.itheima"/>
@PropertySource("classpath:jdbc.properties")//<context:property-placeholder location="classpath:jdbc.properties"/>
@EnableTransactionManagement//<tx:annotation-driven transaction-manager="transactionManager"/>
@Import({JdbcConfig.class,MybatisConfig.class,TransactionConfig.class})
public class SpringConfiguration {

}

4.2 JdbcConfig分配置类

public class JdbcConfig {

  @Value("${jdbc.driver}")
  private String driverClassName;
  @Value("${jdbc.url}")
  private String url;
  @Value("${jdbc.username}")
  private String username;
  @Value("${jdbc.password}")
  private String password;

  @Bean
  public DataSource getDruidDataSource(){
    DruidDataSource ds=new DruidDataSource();
    ds.setDriverClassName(driverClassName);
    ds.setUrl(url);
    ds.setUsername(username);
    ds.setPassword(password);
    return ds;
  }
}

4.3 MybatisConfig分配置类

public class MybatisConfig {

  @Bean
  public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
    SqlSessionFactoryBean sfb=new SqlSessionFactoryBean();
    sfb.setDataSource(dataSource);
    sfb.setTypeAliasesPackage("com.itheima.domain");
    return sfb;
  }

  @Bean
  public MapperScannerConfigurer getMapperScannerConfigurer(){
    MapperScannerConfigurer msc=new MapperScannerConfigurer();
    msc.setBasePackage("com.itheima.dao");
    return msc;
  }
}

4.4 TransactionConfig分配置类

public class TransactionConfig {

  @Bean
  public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
    DataSourceTransactionManager dtm=new DataSourceTransactionManager();
    dtm.setDataSource(dataSource);
    return dtm;
  }
}

最后:单元测试类中@ContextConfiguration注解参数要换成加载配置类而不是配置文件

【第二章】模版对象【了解】

【第三章】案例

1 案例效果

在这里插入图片描述

2 技术点

前台技术架构:

Vue+axios+ElementUI

后台技术架构:

spring整合mybatis、CRUD操作、Druid连接池、声明式事务管理、redis缓存分页数据

3 实施步骤

3.1 导入需要的依赖

<dependencies>
  <!--表现层-->
  <!--Servlet-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
  </dependency>
  <!--jackson-->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
  </dependency>
  <!--beanutils-->
  <dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
  </dependency>

  <!--业务层-->
  <!--持久层-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.41</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.12</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
  </dependency>

  <!--spring的核心依赖-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.5.RELEASE</version>
  </dependency>
  <!--spring整合mybatis-->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.1</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.1.5.RELEASE</version>
  </dependency>
  <!--aspectjweaver-->
  <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
  </dependency>

  <!--分页插件-->
  <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
  </dependency>
</dependencies>

3.2 spring整合mybatis、声明式事务管理【重要】

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx.xsd
                           ">
  <!--开启spring注解扫描-->
  <context:component-scan base-package="com.itheima"/>

  <!--引入属性文件-->
  <context:property-placeholder location="classpath:jdbc.properties"/>

  <!--配置druid连接池-->
  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
  </bean>

  <!--spring整合mybatis-->
  <bean class="org.mybatis.spring.SqlSessionFactoryBean">

    <property name="dataSource" ref="dataSource"/>

    <!--取别名-->
    <property name="typeAliasesPackage" value="com.itheima.bean"/>

    <!--加载myabtis的核心配置文件-->
    <property name="configLocation" value="classpath:MybatisConfig.xml"/>

  </bean>
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.itheima.mapper"/>
  </bean>


  <!--配置事务管理器对象-->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
  </bean>
  <!--开始声明式事务管理驱动-->
  <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

3.3 完成dao层的功能

public interface StudentMapper {
  /**
     * 查询所有学生信息
     * @return
     */
  @Select("select * from student")
  List<Student> findAll();

  /**
     * 添加学生信息
     * @param student
     * @return
     */
  @Insert("insert into student values(#{number},#{name},#{birthday},#{address})")
  int addStudent(Student student);

  /**
     * 修改学生的方法
     * @param student
     * @return
     */
  @Update("update student set name=#{name},birthday=#{birthday},address=#{address} where number=#{number}")
  int updateStudent(Student student);
  /**
     * 删除学生的方法
     * @param number
     * @return
     */
  @Delete("delete from student where number=#{number}")
  int deleteStudent(String number);
}

3.4 完成service层功能

  • StudentService接口
@Transactional
public interface StudentService {
    /**
     * 分页查询方法
     * @param currentPage 当前页数
     * @param pageSize 每页展示条数
     * @return
     */
    @Transactional(readOnly = true)
    PageInfo<Student> selectByPage(int currentPage, int pageSize);
    /**
     * 添加学生信息
     * @param student
     * @return
     */
    int addStudent(Student student);

    /**
     * 修改学生的方法
     * @param student
     * @return
     */
    int updateStudent(Student student);

    /**
     * 删除学生的方法
     * @param number
     * @return
     */
    int deleteStudent(String number);
}

  • StudentServiceImpl实现类
@Service("studentService")
public class StudentServiceImpl implements StudentService {
  @Autowired
  private StudentMapper studentMapper;
  /**
     * 分页查询方法
     * @param currentPage 当前页数
     * @param pageSize 每页展示条数
     * @return
     */
  @Override
  public PageInfo<Student> selectByPage(int currentPage, int pageSize) {
    //设置分页参数:第几页以及每页展示多少条
    PageHelper.startPage(currentPage,pageSize);
    //查询所有
    List<Student> list = studentMapper.findAll();
    //封装分页信息
    return new PageInfo<>(list);
  }
  /**
     * 添加学生信息
     * @param student
     * @return
     */
  @Override
  public int addStudent(Student student) {
    return studentMapper.addStudent(student);
  }
  /**
     * 修改学生的方法
     * @param student
     * @return
     */
  @Override
  public int updateStudent(Student student) {
    return studentMapper.updateStudent(student);
  }
  /**
     * 删除学生的方法
     * @param number
     * @return
     */
  @Override
  public int deleteStudent(String number) {
    return studentMapper.deleteStudent(number);
  }
}

3.5 完成controller层功能

@WebServlet("/studentServlet")
public class StudentServlet extends HttpServlet {

  private StudentService studentService;

  @Override
  public void init(ServletConfig config) throws ServletException {
    super.init(config);
    //初始化spring的核心容器
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
    //获取Service
    studentService = ac.getBean("studentService", StudentService.class);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //解决请求和响应乱码问题
    request.setCharacterEncoding("utf-8");
    response.setContentType("application/json;charset=utf-8");
    //获取标记并判断
    String operation = request.getParameter("operation");
    //调用对应的方法处理请求
    if("list".equals(operation)){
      list(request,response);
    }else if("addStudent".equals(operation)){
      addStudent(request,response);
    }else if("updateStudent".equals(operation)){
      updateStudent(request,response);
    }else if("deleteStudent".equals(operation)){
      deleteStudent(request,response);
    }
  }

  /**
     * 处理删除学生信息
     * @param request
     * @param response
     */
  private void deleteStudent(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //1 获取请求参数number
    String number = request.getParameter("number");
    //2 调用service删除学生信息
    int count = studentService.deleteStudent(number);
    //3 响应结果
    response.getWriter().write(String.valueOf(count));
  }

  /**
     * 处理修改学生信息
     * @param request
     * @param response
     */
  private void updateStudent(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //1 获取请求参数并封装
    Student student=new Student();
    try {
      BeanUtils.populate(student,request.getParameterMap());
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
    //2 调用service层修改学生,结果是影响的行数
    int count = studentService.updateStudent(student);
    //3 响应客户端
    response.getWriter().write(String.valueOf(count));
  }

  /**
     * 处理添加学生的请求
     * @param request
     * @param response
     */
  private void addStudent(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //1 获取请求参数并封装
    Student student=new Student();
    try {
      BeanUtils.populate(student,request.getParameterMap());
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
    //2 调用service层添加学生,结果是影响的行数
    int count = studentService.addStudent(student);
    //3 响应客户端
    response.getWriter().write(String.valueOf(count));
  }

  /**
     * 处理分页查询的请求
     * @param request
     * @param response
     */
  private void list(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //1 定义初始化的当前页以及每页展示的条数
    int currPage=1,pageSize=5;
    //2 获取客户端发送过来的当前页以及每页展示的条数,判断非空并赋值
    String currentPage = request.getParameter("currentPage");
    String pageSizeStr = request.getParameter("pageSize");
    if(currentPage!=null && currentPage.trim().length()>0){
      currPage=Integer.parseInt(currentPage);
    }
    if(pageSizeStr!=null && pageSizeStr.trim().length()>0){
      pageSize=Integer.parseInt(pageSizeStr);
    }

    //3 调用service层方法,获取结果
    PageInfo<Student> info = studentService.selectByPage(currPage, pageSize);

    //4 处理结果并响应
    ObjectMapper mapper=new ObjectMapper();
    mapper.writeValue(response.getWriter(),info);
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
  }
}

3.5 完成前端发送请求以及数据展示【重点】

methods:{
            //声明修改学生的方法
            updateStu(){
                //需要给formData添加一个标记属性
                this.editFormData.operation="updateStudent";
                //发送异步请求
                axios.get("studentServlet",{params:this.editFormData}).then(resp=>{
                    //隐藏弹出框
                    this.dialogTableVisible4edit = false;
                    //判断是否修改成功,如果修改成功,重新查询所有
                    if(resp.data>0){
                        this.selectByPage();
                    }
                });
            },
            //声明删除学生的方法
            deleteStu(row){  //参数row其实就是改行数据对应的student对象
               //弹出确定提示框
                if(confirm("您确定要删除吗?一旦删除将无法恢复!")){
                    //发送异步请求
                    axios.get("studentServlet?operation=deleteStudent&number="+row.number).then(resp=>{
                        //判断是否删除成功,如果删除成功,重新查询所有
                        if(resp.data>0){
                            this.selectByPage();
                        }
                    });
                }
            },
            //声明添加学生的方法
            addStu(){
                //需要给formData添加一个标记属性
                this.formData.operation="addStudent";
                //发送异步请求
                axios.get("studentServlet",{params:this.formData}).then(resp=>{
                    //隐藏弹出框
                    this.dialogTableVisible4add = false;
                    //判断是否添加成功,如果添加成功,重新查询所有
                    if(resp.data>0){
                        this.selectByPage();
                    }
                });
            },
            //分页查询的方法,方法名必须叫这个
            selectByPage(){
                //使用axios发送异步请求,参数:标记+当前页+每页条数
                this.pagination.operation="list";
                //发送异步请求
                axios.get("studentServlet",{params:this.pagination}).then(resp=>{
                    // console.log(resp.data);
                    //在表格中展示数据,给tableData赋值
                    this.tableData=resp.data.list;
                    //给分页条赋值
                    this.pagination.total=resp.data.total;
                });
            },
        }

标签:事务,return,04,Spring,request,param,学习,student,response
来源: https://blog.csdn.net/bigbug1992/article/details/113178544

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有