加入收藏 | 设为首页 | 会员中心 | 我要投稿 广西网 (https://www.guangxiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

什么是MyBatis缓存

发布时间:2022-01-18 13:22:45 所属栏目:编程 来源:互联网
导读:这篇文章主要介绍mysql数据库快速入门的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 如何启动MySQL服务? 对于如何启动MySQL服务?除了可以在安装的时候勾选随着开机自启动,还可以在运行 窗口(windows)为例子,输入
        这篇文章主要介绍mysql数据库快速入门的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
 
如何启动MySQL服务?
      对于如何启动MySQL服务?除了可以在安装的时候勾选随着开机自启动,还可以在运行
 
       窗口(windows)为例子,输入以下内容:
 
net start 命令名字:开启一个服务,如:net start MySQL
net stop  命令名字:关闭一个服务器,如:net stop MySQL
 
mysql数据库快速入门的示例分析
 
连接MySQL数据库有两种方式:
方式1:进入MySQL命令行, 在命令行中输入密码;  
方式2:在运行窗口中:
格式:mysql -u账户 -p密码 -h数据库服务器安装的主机的ip(如果是本机可以使用localhost) -P数据库端口
mysql -uroot -padmin -h227.0.0.1 -P3306
上面假设我的账号是root 密码是admin
若连接的数据库服务器在本机上,并且端口是3306。
则可以简写: mysql -uroot -padmin
 
Navicat for MySQL
Navicat for MySQL[1] 其实就是MySQL 的可视化工具,是一款强大的 MySQL 数据库管理和开发工具,它为专业开发者提供了一套强大的足够尖端的工具,但对于新用户仍然易于学习。Navicat for MySQL 基于Windows平台,为 MySQL 量身订作,提供类似于 MySQL 的用管理界面工具。此解决方案的出现,将解放 PHP、J2EE 等程序员以及数据库设计者、管理者的大脑,降低开发成本,为用户带来更高的开发效率。
 
数据库操作和存储引擎
数据库对象:存储,管理和使用数据的不同结构形式,如:表、视图、存储过程、函数、触发器、事件、索引等。
 
数据库:存储数据库对象的容器。
数据库分两种:
  1):系统数据库(系统自带的数据库):不能修改
information_schema:存储数据库对象信息,如:用户表信息,列信息,权限,字符,分区等信息。
performance_schema:存储数据库服务器性能参数信息。
mysql:存储数据库用户权限信息。
test:任何用户都可以使用的测试数据库。
 
2):用户数据库(用户自定义的数据库):一般的,一个项目一个用户数据库。
 
常用的操作命令:
查看数据库服务器存在哪些数据库:
SHOW  DATABASES;
使用指定的数据库:
USE database_name;
查看指定的数据库中有哪些数据表:  
SHOW TABLES;
创建指定名称的数据库:
CREATE DATABASE database_name;
删除数据库:
DROP DATABASE database_name;
 
注意:;是必须的,不然不会正确显示
 
MySQL的存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供不同的功能和能力。
通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
 
MyISAM:拥有较高的插入,查询速度,但不支持事务,不支持外键。
InnoDB:支持事务,支持外键,支持行级锁定,性能较低。
 
InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但对比MyISAM,处理效率差,且会占用更多的磁盘空间以保留数据和索引。
 
MySQL常用列类型
最常用的整数类型:
MySQL列类型                  Java数据类型
INT/INTEGER:                         int/Integer
BIGINT:                                    long/Long
 
MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。
例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。
需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。一般不用指定位宽。
age  int(2),并不是代表age最多存储99,而是指查询age值得时候使用两个0来占位.这篇文章主要介绍“什么是MyBatis缓存”,在日常操作中,相信很多人在什么是MyBatis缓存问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是MyBatis缓存”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
 
  什么是Mybatis缓存?
 
  使用缓存可以减少Java Application与数据库的交互次数,从而提升程序的运行效率。比如,查询id=1的user对象,第一次查询出来之后,会自动将该对象保存到缓存中。下一次查询该对象时,就可以直接从缓存中获取,不需要发送SQL查询数据库了。
 
  Mybatis缓存分类
 
  一级缓存:SqlSession级别,默认开启,且不能关闭。
 
  mybatis的一级缓存是SqlSession级别的缓存,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据,不同的SqlSession之间缓存数据区域(HashMap)是互相不影响的。
 
  一级缓存的作用域是SqlSession范围的,当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存)中,第二次查询时会从缓存中获取数据,不再去底层进行数据库查询,从而提高了查询效率。需要注意的是:如果SqlSession执行了DML操作(insert、update、delete),并执行commit()操作,mybatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存数据中存储的是最新的信息,避免出现脏读现象。
 
  当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了,Mybatis默认开启一级缓存,不需要进行任何配置。
 
  二级缓存:Mapper级别,默认关闭,可以开启。
 
  二级缓存是Mapper级别的缓存,使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储,相比一级缓存SqlSession,二级缓存的范围更大,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
 
  二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的SqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。
 
  Mybatis默认关闭二级缓存,可以在setting全局参数中配置开启二级缓存。
 
  下面我们通过代码来学习如何使用MyBatis缓存。
 
  首先来演示一级缓存,以查询Student对象为例。
 
  /**
 
  * @ClassName Student
 
  * @Description
 
  * @Author lzq
 
  * @Date 2019/7/26 13:53
 
  * @Version 1.0
 
  **/
 
  public class Student {
 
  private int SID;
 
  private String Sname;
 
  private String Ssex;
 
  private int Age;
 
  public int getSID() {
 
  return SID;
 
  }
 
  public void setSID(int SID) {
 
  this.SID = SID;
 
  }
 
  public String getSname() {
 
  return Sname;
 
  }
 
  public void setSname(String sname) {
 
  Sname = sname;
 
  }
 
  public String getSsex() {
 
  return Ssex;
 
  }
 
  public void setSsex(String ssex) {
 
  Ssex = ssex;
 
  }
 
  public int getAge() {
 
  return Age;
 
  }
 
  public void setAge(int age) {
 
  Age = age;
 
  }
 
  @Override
 
  public String toString() {
 
  return "[id"+SID+" 名字"+Sname+" 性别"+Ssex+" 年龄"+Age+"]";
 
  }
 
  }
 
  StudentMapper接口:
 
  import org.apache.ibatis.annotations.*;
 
  public interface StudentMapper {
 
  public Student getStudentById(int id);
 
  }
 
  mybatis-config.xml:
 
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
  StudentMapper.xml:
 
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
  select * from student where SID = #{id}
 
  测试代码:
 
  **
 
  * @ClassName Test
 
  * @Description
 
  * @Author lzq
 
  * @Date 2019/7/26 13:53
 
  * @Version 1.0
 
  **/
 
  public class Test {
 
  public static void main(String[] args) throws IOException {
 
  String resource = "mybatis-config.xml";
 
  //读取配置文件
 
  InputStream asStream = Resources.getResourceAsStream(resource);
 
  //创建sqlSessionFactory
 
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
 
  //创建sqlSession
 
  SqlSession sqlSession = sqlSessionFactory.openSession();
 
  //通过动态代理产生StudentMapper对象
 
  StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
 
  //查询id为1的元组
 
  Student student = mapper.getStudentById(1);
 
  System.out.println(student);
 
  Student student1 = mapper.getStudentById(1);
 
  System.out.println(student1);
 
  }
 
  }
 
  可以看到结果,执行了一次SQL语句,查询出两个对象,第一个对象是通过SQL查询的,并保存到缓存中,第二个对象是直接从缓存中获取的。
 
  我们说过一级缓存是SqlSession级别的,所以SqlSession一旦关闭,缓存也就不复存在了,修改代码,再次测试。
 
  测试代码:无锡妇科医院 http://www.bhnnk120.com/
 
  **
 
  * @ClassName Test
 
  * @Description
 
  * @Author lzq
 
  * @Date 2019/7/26 13:53
 
  * @Version 1.0
 
  **/
 
  public class Test {
 
  public static void main(String[] args) throws IOException {
 
  String resource = "mybatis-config.xml";
 
  //读取配置文件
 
  InputStream asStream = Resources.getResourceAsStream(resource);
 
  //创建sqlSessionFactory
 
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
 
  //创建sqlSession
 
  SqlSession sqlSession = sqlSessionFactory.openSession();
 
  //通过动态代理产生StudentMapper对象
 
  StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
 
  //查询id为2的元组
 
  Student student = mapper.getStudentById(1);
 
  System.out.println(student);
 
  sqlSession.close(); //关闭原有的sqlSession
 
  sqlSession = sqlSessionFactory.openSession(); //创建一个新的
 
  mapper = sqlSession.getMapper(StudentMapper.class);
 
  Student student1 = mapper.getStudentById(1);
 
  System.out.println(student1);
 
  }
 
  }
 
  可以看到,执行了两次SQL。
 
  在关闭SqlSession,一级缓存失效的情况下,可以启用二级缓存,实现提升效率的要求。
 
  MyBatis可以使用自带的二级缓存,也可以使用第三方的ehcache二级缓存。
 
  自带二级缓存
 
  mybatis-config.xml配置开启二级缓存
 
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
  在StudentMapper.xml配置中开启二级缓存:
 
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
  select * from student where SID = #{id}
 
  Student类实现Serializable接口:
 
  import java.io.Serializable;
 
  /**
 
  * @ClassName Student
 
  * @Description
 
  * @Author lzq
 
  * @Date 2019/7/26 13:53
 
  * @Version 1.0
 
  **/
 
  public class Student implements Serializable{
 
  private int SID;
 
  private String Sname;
 
  private String Ssex;
 
  private int Age;
 
  public int getSID() {
 
  return SID;
 
  }
 
  public void setSID(int SID) {
 
  this.SID = SID;
 
  }
 
  public String getSname() {
 
  return Sname;
 
  }
 
  public void setSname(String sname) {
 
  Sname = sname;
 
  }
 
  public String getSsex() {
 
  return Ssex;
 
  }
 
  public void setSsex(String ssex) {
 
  Ssex = ssex;
 
  }
 
  public int getAge() {
 
  return Age;
 
  }
 
  public void setAge(int age) {
 
  Age = age;
 
  }
 
  @Override
 
  public String toString() {
 
  return "[id"+SID+" 名字"+Sname+" 性别"+Ssex+" 年龄"+Age+"]";
 
  }
 
  }
 
  测试代码依旧是上一次用的那个:
 
  可以看到,执行了一次SQL,查询出两个对象,cache命中率为0.5;
 
到此,关于“什么是MyBatis缓存”的学习就结束了,希望能够解决大家的疑惑。

(编辑:广西网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!