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

标签: mybatis
96人阅读 评论(0) 收藏 举报
分类:

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语句。

查看评论

mybatis注解及缓存调优

注 解: 好 处:1、减少维护数量,配置文件减少; 2、减少编码量,提升效率 做 法: 注释去实现普通的代码实现,当出现动态SQL的时候采用调用xml的方法; 保存对象 @In...
  • Munger6
  • Munger6
  • 2017-01-17 21:56:40
  • 1247

mybatis注解方式懒加载失效分析

希望大家支持原创,转载注明原创连接,谢谢
  • mingtian625
  • mingtian625
  • 2015-07-12 02:14:02
  • 2220

spring+mybatis+ehcahce实现注解缓存

Ehcache在很多项目中都出现过,用法也比较简单。一般的加些配置就可以了,而且Ehcache可以对页面、对象、数据进行缓存,同时支持集群/分布式缓存。如果整合Spring、Mybatis也非常的简单...
  • u014464568
  • u014464568
  • 2016-05-29 12:04:36
  • 2747

Redis+MyBatis自定义注解实现缓存

在数据库查询前我想查询是否存在缓存,不存在则查询,这样的重复性操作写在代码里很难看,通过AspectJ的AOP编程,可以很优雅地实现这个缓存过程。 但是在使用过程中,发现Spring自带的@Cach...
  • cx118118
  • cx118118
  • 2017-09-20 16:59:50
  • 533

MyBatis 灵活的ORM框架

MyBatis     灵活的ORM框架 理解ORM的概念 掌握MyBatis框架的构建 了解MyBatis的相关配置 掌握多表映射技术 掌握动态SQL语句处理 ...
  • Ares2016
  • Ares2016
  • 2016-12-18 18:23:45
  • 1255

JAVAWEB开发之mybatis详解(二)——高级映射、查询缓存、mybatis与Spring整合以及懒加载的配置和逆向工程

mybatis基础知识回顾 1. mybatis是什么? mybatis是一个持久层框架,是Apache下的开源项目,前身是ibatis,是一个不完全的ORM框架,mybatis提供输入和输出的映...
  • u013087513
  • u013087513
  • 2017-06-13 09:46:27
  • 3025

应用层缓存 VS ORM缓存

最近做一个比较大的电子商务项目,预计每天订单量将在5万多单,客服人员需要频繁的下单、查询订单、操作订单,客人预订完订单后,会立即进入处理流程,为了提高服务质量,要求流水化作业,平均要在40分钟-80分...
  • czp11210
  • czp11210
  • 2016-07-15 10:28:13
  • 1175

ORM之mybatis与hibernate个人理解

ORM之mybatis与hibernate个人理解
  • ketingli
  • ketingli
  • 2016-03-25 12:55:58
  • 5932

模仿与学习MyBatis - 实现自己的ORM层框架

目录陆续新增中,敬请期待 第一版 综述:MyBatis核心功能 DataSource与Session xml配置的解析 SessionFactory与Session Mapper与动态代理 注解与S...
  • tjgykhulj
  • tjgykhulj
  • 2016-12-05 17:21:28
  • 1637
    个人资料
    持之以恒
    等级:
    访问量: 1297
    积分: 738
    排名: 7万+
    文章存档
    最新评论