• 复习日记-事务(JDBC)/分页


    事务:一件完整的事情,包含多个操作,要么全部成功,要么全部失败

      MySQL中的事务控制:

        MySQL的事务默认自动提交,一条SQL语句就是一个事务

        开启手动事务方式:

          方式一:关闭自动事务

          方式二:手动开启一个事务

            start transaction--开启一个事务

            commit;事务提交

        扩展:Oracle中事务默认是手动提交

      Java中的事务控制:

        在Connection接口的API:

          setAutoCommit(false):手动开启事务

          commit():事务提交

          rollback():事务回滚

        扩展:了解Savepoint还原点

          void  rollback(Savepoint  savepoint)

    ////////////////////////////////////////////////////////////////////////////////////

    在service层我们获取了connection连接,开启了事务,怎么在dao层获取同一个连接呢?

      方法一:

        向下传递参数connection,但是连接应该在service层释放

      方法二:

        可以将connection对象绑定到当前线程上

        jdk中有一个ThreadLocal帮我们做到了实现

       注意:ThreadLocal实例通常是类中的private static字段,它们希望与某一个线程相关联

          private static ThreadLocal<Connection>  tl =  new ThreadLocal<>();

      ThreadLocal的常用方法:

        构造:new ThreadLocal()

        set (T value):将内容与当前线程绑定

        Object  get():获取和当前线程绑定的内容

        remove():将当前线程和内容解绑

      源码:内部维护了一个map集合

        map.put(当前线程,内容)

        map.get(当前线程)

        map.remove()

    事务总结:

      事物的特性:ACID

      原子性;

      一致性:事务执行前后,业务状态和其他业务状态保持一致

      隔离性:一个事物执行的时候最好不要受到其他事务的影响

      持久性:一旦事务提交或者回滚,状态都要持久化到数据库中

    不考虑隔离性会出现读问题:

      脏读:在一个事务中读取到了另一个事务中没有提交的数据

      不可重复读:在一个事务中,两次查询的结果不一致(针对update操作)

      幻读:在一个事务中,两次查询的结果不一致(针对insert操作)

      通过设置数据库的隔离级别来避免上面的问题

      MySQL默认隔离级别是repeatable  read可重复读,可以避免前两类问题

      开发中绝不允许脏读出现

    请求转发与请求重定向使用时机:

      request域没有数据用哪个都可以

    有表单使用的时候,如果使用请求转发会出现重复提交:

      解决方案1:使用重定向

      解决方案2:使用令牌机制实现解决重复提交问题

    多条件SQL拼接查询:select  ... where  1=1 这是前提格式

    分页原理:

      技术分析:

        将数据按照页码划分,提高用户体验度

      分类:

        物理分页:一次只去数据库中查询当前页数据(实际开发中经常使用)

        逻辑分页:一次性将所有的数据查询出来,放入内存中,按照用户点击的页码,从内存截取显示(效率高),维护起来比较麻烦

    MySQL中的分頁使用关键字limit

    Oracle是通过rownum关键字使用两条SQL嵌套出来的,SQL server是通过top关键字实现

      理论:

      从m条开始向后查询n条数据

      格式1:select ... limit  m,n    (m+1~m+n的数据)

      格式2:select ...limit n;(等价于select ... limit 0,n)  

      每页显示3条数据:

        第一页:0,3

        第二页:3,3

        第三页:6,3

        第n页:(n-1)*3,3

    分頁需要使用的数据:

     当前页内容:limit

     当前页码:从前台传递

     每页显示数据条数:固定

     总条数 ;count(*)

     总页数:总条数/每页显示的条数向上取整   Math.ceil(double)   因为是double,所以总条数x1.0

    以后开发中会将这五个参数封装为Javabeen(PageBean)

        这个JavaBeen的字段:显然只需要传递一个当前页码给后台即可

          private List<T>  list;      查询

          private int currentPage;    前台传递

          private int pageSize;      固定

          private int totalCount;     查询

          private int totalPage;        计算

          注:前台传递一个页码,返回值是一个PageBean实体对象

  • 相关阅读:
    cat
    cal
    API、ABI区别
    html 实体转换为字符:转换 UEditor 编辑器 ( 在 ThinkPHP 3.2.2 中 ) 保存的数据
    IDEA突然无法运行
    Java实现 蓝桥杯 算法提高 成绩排名
    Java实现 蓝桥杯 算法提高 成绩排名
    Java实现 蓝桥杯 算法提高 成绩排名
    Java实现 蓝桥杯 算法提高 Monday-Saturday质因子
    Java实现 蓝桥杯 算法提高 Monday-Saturday质因子
  • 原文地址:https://www.cnblogs.com/tfboy/p/10383132.html
Copyright © 2020-2023  润新知