JavaWeb学习日结

在实现分页操作的过程中,可以在SQL语句中不写两条SQL来统计总查询数、不限制分页条件,将这些功能在service层用PageHelper实现。

引入依赖


    com.github.pagehelper
    pagehelper-spring-boot-starter
    1.4.7

 在service层实现类中重写方法

@Override
    public PageResult page(Integer page, Integer pageSize) {
        PageHelper.startPage(page, pageSize);
        Page p = (Page)empMapper.list();
        return new PageResult<>(p.getTotal(), p.getResult());
    }

Page继承ArrayList,此处强转后调用Page类中的getTotal()和getResult()方法,得到总结果数和查询结果列表。

 JavaWeb学习日结_第1张图片JavaWeb学习日结_第2张图片

---------------------------------------------------------------------------------------------------------------------------------

在controller层接收前端传来的请求参数时,若没有参数,可使用@RequestParam注解在方法中为参数设置默认值。

例如没有参数时默认请求第一页,每页十条数据

@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize

请求参数过多时,方法内形参过多导致代码冗长且可读性差,此时编写一个实体类用一个实体对象来封装。

请求参数为日期,使用@DateTimeFormat注解规定格式。

---------------------------------------------------------------------------------------------------------------------------------

在条件分页查询中,需对姓名模糊查询:name like '%查询的内容%',而为了防止SQL注入,应使用预编译,即name like '%#{name}%'。而在引号中的#{name}无法被识别。

解决方案:

name like concat('%', #{name}, '%')

---------------------------------------------------------------------------------------------------------------------------------

MyBatis中的动态SQL

当条件查询时某个参数没有填写,值为null,普通的SQL语句依然将null作为查询的条件。

解决方案:动态SQL,在Mapper映射文件中使用标签,当标签中的条件符合时,才会拼接标签包裹的SQL语句。

此时还有另外一个问题,如果where后的第一个条件语句没有拼接上,后边的语句拼接到where后会出现where and....的情况造成语法错误。

解决方案:使用标签,MyBatis 的 标签会智能地处理 AND 和 OR,确保生成的 SQL 语句语法正确。




    

要一次插入多条数据,却又不知道具体要插入多少条。

解决方案:使用标签遍历插入




    
        insert into emp_expr(emp_id, begin, end, company, job) values
        
            (#{expr.empId}, #{expr.begin}, #{expr.end}, #{expr.company}, #{expr.job})
        
    

---------------------------------------------------------------------------------------------------------------------------------

事务中的所有操作必须全部正确运行,才会被提交,否则回滚。

Spring中的事务管理:在需要创建事务的类、方法或者接口上使用@Transactional注解。@Transactional默认遇到RuntimeException(运行时异常)才会回滚,因此要设置注解中的一个属性值:rollbackFor = {Exception.class},这样才会遇到所有异常都回滚。

@Transactional中还有一个属性propagation,默认值为Propagation.REQUIRES,此时这个事务方法被另一个事务方法调用时,会自动加入调用方法的事务中,此时出现问题,当我们想在一个finally中用一个方法来将日志写入数据库中时,如果调用的方法中出现异常,日志方法中向数据库表中插入数据的语句也被回滚,无法记录所有的提交记录。

设置属性propagation = Propagation.REQUIRES_NEW,此时这个事务方法被另一个事务方法调用时,依然会创建新事务,不受调用方法中事务回滚的影响。

---------------------------------------------------------------------------------------------------------------------------------

复习事物的四大特性-ACID

原子性、一致性、隔离性、持久性

---------------------------------------------------------------------------------------------------------------------------------

今日在自己完成条件分页查询的接口功能时,因为不熟练漏掉许多细节,导致出现很多bug,修bug花费了大量时间。但能够通过使用debug断点、阅读控制台中的异常信息日志并利用ai工具找到bug点并修复,我觉得收获很大。

你可能感兴趣的:(java,mybatis,spring,boot)