什么是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缓存”的学习就结束了,希望能够解决大家的疑惑。 (编辑:广西网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐