MyBatis的注解使用、ORM层优化方式(懒加载和缓存)
作者:bamzhy13 发布时间:2023-04-24 09:16:13
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语句。
来源:https://blog.csdn.net/qq_37366958/article/details/79946193


猜你喜欢
- 本文实例为大家分享了人脸认证源码faceIdentify的具体代码,供大家参考,具体内容如下人脸认证:using AForge.Video.
- android 实现拨打电话的app,代码非常简单,功能也很实用,分享给大家。MainActivity.javapackage com.bb
- 本文实现了一个有趣的小东西:使用自定义View绘图,一边画线,画出的线条渐渐变淡,直到消失。效果如下图所示:用属性动画或者渐变填充(Shad
- 本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下package com.gj5u.publics.util;
- 目录如何实现简化呢?当然,一些常见的方法已经封装在了 Norns.Urd.Extensions.Polly如何启用 Norns.Urd +
- 项目配置依赖首先搭建一个标准的SpringBoot项目工程,相关版本以及依赖如下本项目借助SpringBoot 2.2.1.RELEASE
- 本教程基于 JetBrains IntelliJ IDEA 2018.3.6 编写,高版本未经测试,或有不兼容,请见谅!JetBrains
- logback filter过滤某个类 屏蔽某个类使用logback配置日志文件,有的时候需要我们过滤或者屏蔽掉某个类的日志,便可以通过以下
- 一种方法是可以在窗体的属性面板将窗体的 ControlBox属性设置为false,或者在窗体的构造函数中这样写:public Form1()
- 目录一、值类型和引用类型的区别1、赋值时的区别2、内存分配的区别3、来自继承结构的区别二、总结一、值类型和引用类型的区别.NET的类型可以分
- 最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个CountDownTimer,因为好久没用过了,自己就写了一个,代码如下 n
- 一、前置说明本节大纲使用lombok插件的好处如何安装lombok插件使用lombok提高开发效率二、使用lombok插件的好处我们在jav
- 本文实例讲述了Android编程实现自定义系统菜单背景的方法。分享给大家供大家参考,具体如下:不多说,上图,见代码。package lab.
- java 判断两个对象是否为同一个对象用“==”比较的是引用的地址,用equals比较的就是值。那我们new两个相同的对象什么属性都一样,为
- 好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了。这次就跟着之前的问题,继续总结下Spring MVC中的小知识。u
- Spring Cloud Gateway介绍前段时间刚刚发布了Spring Boot 2正式版,Spring Cloud Gateway基于
- Rmb.javapublic class Rmb { /** *人民币的基本信息和操作 *@auth
- IFormattable接口提供了ToString()方法的定义,使用该方法可以将对象的值按照指定的格式转化成字符串的功能。下面是ToStr
- 一、文件的编码package com.study.io;/*** 测试文件编码*/public class EncodeDemo {/***
- 之前写过一篇获取properties文件里面的值:Springboot 指定获取自己写的配置properties文件的值www.jb51.n