MyBatis的注解使用、ORM层优化方式(懒加载和缓存)

目录
  • Mybatis注解
  • Mybatis对ORM层的优化
    • 缓存
    • 懒加载
    • MyBatis缓存机制
    • 二级缓存

Mybatis注解

  • 查找
@Select( "SELECT * FROM tt_user WHERE username Like #{id};")
User findUserByName(String name);

<!--以map为输入参数查找-->
@Select("select * from tt_user where username= #{name} and  password=#{pass}")
User findUserByUsernameAndPassword(HashMap map);
  • 插入
@Insert("insert into tt_user values (#{id},#{username},#{password},#{email},#{age})")
int AddUser(User user) throws IOException;
  • 更改
@Update("update tt_user set username = #{username} where id = #{id}")
void updateUserById(User user);
  • 删除
@Delete("delete from tt_user where id =#{id}")
void deleteUserById(String id);

动态SQL语句

@SelectProvider(type = UserDaoSqlProvider.class,method = "findUserByName")
List<User> findUserByName(String username) throws IOException;
    public String findUserByName(String username){
        //return  "select * from tt_user where username like '" +username+"'";
        String sql = new SQL() {{
            SELECT("*");
            FROM("tt_user");
            if (username!=null&&!username.isEmpty()){
                WHERE("username like "+username );
            }
        }}.toString();
        System.out.println("sql="+sql);
        return sql;
}

Mybatis提供了一个匿名内部类

另一种写法:

    public String getxxx(){

       return new SQL().UPDATE("PERSON")
                 .SET("FULL_NAME = #{fullName}", "DATE_OF_BIRTH = #{dateOfBirth}")
                 .WHERE("ID = #{id}")
                 .toString();
    }
}

Mybatis对ORM层的优化

缓存

查了一次,结果保存在本地,下次查相同内容的时候就不用再去访问数据库了。

懒加载

Lazyloading:先加载主信息,在需要的时候再去加载关联数据

Mybatis中ResultMap中的association和Collection标签具有懒加载的功能

  • 默认情况没有懒加载
  • 如何开启懒加载呢?

在主配置文件中的configuration标签下配置

    <!--全局懒加载-->
    <settings>
        <!--开关-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
  • 局部懒加载配置

在从配置文件中的association或者collection里边添加fetchType字段(fetch翻译是拿、取)

    <resultMap id="studentAndCourses" type="com.bamzhy.bean.Student">
        <id column="id" property="id"></id>
        <collection property="courses"
                    javaType="list"
                    select="com.bamzhy.dao.UserDao.findcourseBySid"
                    column="id"
                    fetchType="eager">
            <id column="cid" property="cid"></id>
        </collection>
    </resultMap>
  • 全局懒加载和局部懒加载同时出现时,以局部懒加载优先

MyBatis缓存机制

  • 一级缓存指的就是sqlsession,在sqlsession中有一个数据区域,是map结构,这个区域就是一级缓存区域。
  • 查询同一个对象(使用同一个session)时,第二次查询并不会调用sql语句,而是从sqlsession中取数据。
  • 开启一级缓存:默认开启
  • 验证一级缓存存在

我查了两次,但是只执行了一次sql语句

现在在第一次查询结束后关闭sqlSession,再重新new一个session出来,

执行查询

果然,sql语句被执行了两次,可以证明一级缓存的确存在

二级缓存

二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是二级缓存区域。

  • 开启二级缓存

主配置文件里边:

从配置文件:

注意点 cache对象需要实现序列化接口,否则会报Error serializing object

  • 测试二级缓存

虽然我关闭了sqlsession,但仍然没有执行两次sql。

说明二级缓存的确存在

  • 如果不关闭一级缓存,那么二级缓存就不生效。

比如我创建了一个sqlsession,不关闭,再创建一个sqlsession,那么二级缓存看见第一个sqlsession没有关闭(一级缓存生效了),二级缓存他就不生效了。事实上这俩session不是同一个session,二级缓存也没生效,这样要执行两次sql语句。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis如何使用注解优化代码

    entity层代码不变,因为是优化,所以在dao层新增了一个通过id查询用户的功能,现在来演示一下优化前后的代码对比,希望你们喜欢 entity层代码不变,dao层中的UserMapper中添加一个方法 /** * 根据id查询用户 */ User findUserById(int id); 在UserMapper.xml映射文件中添加 <select id="findUserById" parameterType="int" resultType="

  • MyBatis使用注解开发实现过程详解

    使用注解开发 1.面向接口编程 面向接口编程的根本原因:解耦,可扩展,提高复用,分层开发中.上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性好 2.使用注解开发 注解在接口上实现 @Select(value = "select * from user") List<User> getUsers(); 需要在核心配置文件中绑定接口 <!--绑定接口--> <mappers> <mapper class="rui.da

  • 详解Java的MyBatis框架中的缓存与缓存的使用改进

    一级缓存与二级缓存 MyBatis将数据缓存设计成两级结构,分为一级缓存.二级缓存: 一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存.一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改): 二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个App

  • MyBatis 延迟加载、一级缓存、二级缓存(详解)

    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能. 一.延迟加载 延迟加载已经是老生常谈的问题,什么最大化利用数据库性能之类之类的,也懒的列举了,总是我一提到延迟加载脑子里就会想起来了Hibernate get和load的区别.OK,废话少说,直接看代码. 先来修改配置项xml. 注意,编写mybatis.xm

  • MyBatis的注解使用、ORM层优化方式(懒加载和缓存)

    目录 Mybatis注解 Mybatis对ORM层的优化 缓存 懒加载 MyBatis缓存机制 二级缓存 Mybatis注解 查找 @Select( "SELECT * FROM tt_user WHERE username Like #{id};") User findUserByName(String name); <!--以map为输入参数查找--> @Select("select * from tt_user where username= #{name}

  • Vue多页面配置打包性能优化方式(解决加载包太大加载慢问题)

    目录 一.问题描述及解决方案 1. 多入口存在的问题 2. 我的预期效果 3. 可行方案 二.方案一:打公共 chunks,单独分离各自的ui库 三.方案二:删除默认splitChunk配置,抽离公共资源 四.方案对比 总结 通常我们使用vue-cli开发多页面的时候,不知道您是否注意一个问题没有? 默认情况:webpack 会将多入口通用的组件库等,打包一个 vendor 的 chunk js 中 现在假设有两个页面: 入口 admin 使用到了element-ui组件库和echarts图表库

  • Mybatis如何实现关联属性懒加载

    Mybatis 关联属性懒加载 延迟加载配置 mybatis默认没有开启延迟加载,需要在config.xml中setting配置. lazyLoadingEnabled:true使用延迟加载,false禁用延迟加载,默认为false. aggressiveLazyLoading:true启用时,当延迟加载开启时访问对象中一个懒对象属性时,将完全加载这个对象的所有懒对象属性.false,当延迟加载时,按需加载对象属性(即访问对象中一个对象属性时,不会加载对象中的引用属性).默认为true. 修改延

  • js前端实现图片懒加载(lazyload)的两种方式

    在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽.这也就是们通常所说的首屏加载,技术上现实其中要用的技术就是图片懒加载--到可视区域再加载. 思路: 将页面里所有img属性src属性用data-xx代替,当页面滚动直至此图片出现在可视区域时,用js取到该图片的data-xx的值赋给src. 关于各种宽高: 页可见区域宽: document.body.clien

  • webpack学习笔记之优化缓存、合并、懒加载

    除了的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度.下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要一些dev-tools,dev-server和jshint校验等,将与开发相关的东西删掉.下面的介绍均以此代码配置作参考. /*生成环境配置文件:不需要一些dev-tools,dev-server和jshint校验等.和开发有关的东西删掉*/ var webpack = require('webpack

  • JavaScript性能优化总结之加载与执行

    前言 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载和执行脚本时出现阻塞的原因在于,脚本可能会改变页面或 JavaScript 的命名空间,它们对后面页面内容造成影响.一个典型的例子就是在页面中使用document.write(),例如清单 1 清单 1 JavaScript 代码内嵌示例 <html> <head> <title

  • 浅谈解决Hibernate懒加载的4种方式

    本文总结了我在学习hibernate的过程中,解决hibernate懒加载问题的四种方式. 所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载. 例如,有一个对象是Employee,还有一个对象是Department.显然,对于Employee相对Depa

  • 原生JS实现图片懒加载之页面性能优化

    在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

  • Angular性能优化之第三方组件和懒加载技术

    概述 应该有很多人都抱怨过 Angular 应用的性能问题.其实,在搭建Angular项目时,通过使用打包.懒加载.变化检测策略和缓存技术,再辅助第三方组件,便可有效提升项目性能. 为了帮助开发者深入理解和使用Angular,本文将以在线表格编辑为例,演示如何借助懒加载技术,在基于 Angular的框架中实现在线导入导出Excel以及数据在线填报的功能. 环境准备 1.全局安装Angular CLI:npm install -g @angular/cli 2.使用Angular CLI创建一个新

  • 如何解决hibernate一对多注解懒加载失效问题

    目录 hibernate一对多注解懒加载失效 经排查,问题出在controller这边 解决方法 Hibernate懒加载异常说明及其解决 懒加载异常出现的原因 解决方案1 解决方案2 解决方案3 hibernate一对多注解懒加载失效 在House类里有关联HouseInfo,设置了懒加载 但是页面ajax返回还是有HouseInfos的数据. 经排查,问题出在controller这边 @response注解启用jackson框架对House进行解析 然后调用了每个属性的get方法,自然hou

随机推荐