MyBatis

怒肝一页,搞定这篇MyBatis 缓存结构(下)

有些话、适合烂在心里 提交于 2020-12-19 21:58:21
二级缓存 主要内容: 二级缓存构建在一级缓存之上,在收到查询请求时,MyBatis 首先会查询二级缓存。若二级缓存未命中,再去查询一级缓存。与一级缓存不同,二级缓存和具体的命名空间绑定,一级缓存则是和 SqlSession 绑定。 在按照 MyBatis 规范使用 SqlSession 的情况下,一级缓存不存在并发问题。二级缓存则不然,二级缓存可在多个命名空间间共享。这种情况下,会存在并发问题,因此需要针对性去处理。除了并发问题,二级缓存还存在事务问题。 二级缓存如何开启? 配置项 <configuration> <settings> <setting name="cacheEnabled" value="true|false" /> </settings> </configuration> cacheEnabled=true表示二级缓存可用,但是要开启话,需要在Mapper.xml内配置。 <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> 或者 简单方式 <cache/> 对配置项属性说明: flushInterval="60000",间隔60秒清空缓存,这个间隔60秒,是被动触发的,而不是定时器轮询的。 size=512,表示队列最大512个长度,大于则移除队列最前面的元素

怒肝一页,搞定这篇MyBatis 缓存结构(中)

时间秒杀一切 提交于 2020-12-19 21:56:22
一级缓存 主要内容: 一级缓存也叫本地缓存(LocalCache),Mybatis的一级缓存是会话级别(SqlSession)层面进行缓存的。Mybatis的一级缓存是默认开启的。我们开发项目中不需要做任何配置,但是如果想关闭一级缓存,可以使用localCacheScopde=statement来关闭。 如何关闭一级缓存呢? 在BaseExecutor的中,请看下面代码: 为什么说是SqlSession层面缓存? 就是一级缓存的生命周期和一个SqlSession对象的生命周期一样。 下面这段中,就会使用到一级缓存。 SqlSession sqlSession1 = sqlSessionFactory.openSession(); User user1 = sqlSession1.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById", 1); User user2 = sqlSession1.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById", 1); 结果输出: 用两张图来总结: 第一次:查数据库,放入到缓存中。 第二次:直接从缓存中获取。 下面这段代码中就使用不到缓存 SqlSessionFactory sqlSessionFactory

【Mybatis】%%使用和多条件模糊查询

送分小仙女□ 提交于 2020-12-19 18:05:00
使用concat做多条件模糊查询 1. 字符串拼接 // java代码 searchText = "%" + searchText + "%"; // sql <!--查询订单--> <select id="queryOrder" parameterType="Map" resultType="com.alibaba.fastjson.JSONObject"> SELECT order_code, send_linkman, settled_amount FROM order_info WHERE account_code = #{accountCode} AND state = 1 <if test="searchText != null and searchText != '' "> AND CONCAT(order_code,received_linkman) LIKE #{searchText } </if> ORDER BY pay_time DESC </select> 2. 使用concat // sql <!--查询订单--> <select id="queryOrder" parameterType="Map" resultType="com.alibaba.fastjson.JSONObject"> SELECT order_code, send_linkman

深入浅出Mybatis系列五-TypeHandler简介及配置(mybatis源码篇)

谁说我不能喝 提交于 2020-12-19 09:03:59
注 :本文转载自 南轲梦 注:博主 Chloneda : 个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章《深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)》为大家介绍了mybatis中别名的使用,以及其源码。本篇将为大家介绍TypeHandler, 并简单分析其源码。 Mybatis中的TypeHandler是什么? 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。 那么,Mybatis为我们实现了哪些TypeHandler呢? 我们怎么自定义实现一个TypeHandler ? 这些都会在接下来的mybatis的源码中看到。 在看源码之前,还是像之前一样,先看看怎么配置吧? 配置TypeHandler <configuration> <typeHandlers> <!-- 当配置package的时候,mybatis会去配置的package扫描TypeHandler <package

spring Boot+spring Cloud实现微服务详细教程第一篇

妖精的绣舞 提交于 2020-12-19 08:01:50
前些天项目组的大佬跟我聊,说项目组想从之前的架构上剥离出来公用的模块做微服务的开发,恰好去年的5/6月份在上家公司学习了国内开源的dubbo+zookeeper实现的微服务的架构。自己平时对微服务的设计比较上心,第一:是自我感觉做多了垂直应用的项目就觉得味同嚼蜡,所有的模块,技术都冗余的堆积在一个项目里面。耦合度极高。项目的迭代,部署。后期的运营维护都是比较头疼,繁琐的事情。第二:适逢当下应用软件框架层出不穷,在java-web或者后台服务器的框架设计上,国内国外,都是如火如荼。新技术的迭代更是日新月异。今天就借此机会跟大家聊一聊spring Boot + spring Cloud实现分布式微服务框架的搭建流程。 第一章节: 搭建垂直应用的spring boot + mybatis 的web项目 首先打开Eclipse 1:File------> new-------->other (注意:如果有些小伙伴找不到像我这样的目录 就是有Spring Starter Project 的工程目录,那么是因为你的Eclipse没有安装下载 Eclipse中安装STS插件) 下载安装教程如下:http://blog.csdn.net/clementad/article/details/51334064 第二步: 填写项目信息 第三步: 创建完成后的对应目录结构,在此目录下的Controller

MyBatis Generator 自定义生成注释

孤人 提交于 2020-12-19 06:52:51
注释生成器 为了生成db里面的注释,必须自定义注释生成器 EmptyCommentGenerator: import org.mybatis.generator.api.CommentGenerator; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.*; import org.mybatis.generator.api.dom.xml.XmlElement; import java.util.Properties; import java.util.Set; public class EmptyCommentGenerator implements CommentGenerator { @Override public void addConfigurationProperties(Properties properties) { } @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable,

Mybatis的关联映射

社会主义新天地 提交于 2020-12-19 04:34:09
##Mybatis的关联映射 实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提供了关联映射, 通过关联映射就可以很好的处理对象与对象之间的关联关系。 ###1.1 关联关系概述 在关系型数据库中,多表之间存在着三种关联关系,分别为一对一、一对多和多对多,如下图所示: 三种关系如下: 一对一:在任意一方引入对方主键作为外键。 一对多:在“多”的一方,添加“一”的一方的主键作为外键。 多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。 在Java中,通过对象也可以进行关联关系描述,如图下图所示: 一对一的关系:就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a。 一对多的关系:就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a。 多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合。 ###1.2 一对一 在现实生活中,一对一关联关系是十分常见的。例如,一个人只能有一个身份证,同时一个身份证也只会对应一个人 <resultMap>元素中,包含了一个<association>子元素,MyBatis就是通过该元素来处理一对一关联关系的。 在

超详细,理解这6个核心概念,轻松入门Java多线程!

走远了吗. 提交于 2020-12-19 00:00:25
前言 小编这里整理了一份JAVA多线程并发编程的详细思维导图,想了解的小伙伴可以点开看看呢。 多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。 小编接下来会从基础概念开始到最后的并发模型由浅入深,讲解下线程方面的知识。 一、并发与并行 并行,表示两个线程同时做事情。 并发,表示一会做这个事情,一会做另一个事情,存在着调度。单核 CPU 不可能存在并行(微观上)。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 阻塞与非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。 此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程在操作系统层面被挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。 非阻塞则允许多个线程同时进入临界区。 二、锁 死锁 死锁是进程死锁的简称,是指多个进程循环等待他方占有的资源而无限的僵持下去的局面。

扩招1W人,字节跳动内部公开12月份Java岗71道面试题

拜拜、爱过 提交于 2020-12-18 17:31:54
前言 近日,字节跳动官宣扩招信息,在年底前再招满 10000 人!这其中技术岗的需求占比非常高。 不少人对字节跳动技术岗的 体系结构 和 技术要求 设置不太清楚,想去面试心里没底,下面简单介绍一下字节跳动技术岗要求体系,并给大家分享一份最新入职字节跳动的同事总结出的 完整面试题! 字节跳动的 职级 研发序列一共 10 级: 不同序列间月薪base差异较大,技术base整体偏高。比如2-1月薪会在20k+,2-2的package会在60w-100w左右(算上期权,大概会占30%左右)。T2-2级别的薪资约40k,500股票/每年。 字节技术岗平均薪资情况: 字节跳动对技术岗的要求 1、3年以上开发经验; 2、精通Java,理解io、泛型、多线程、集合等Java基础使用和实现原理; 3、熟悉Spring、SpringBoot等框架,理解JVM的实现机制及性能调优; 4、掌握MySQL使用,熟悉数据库性能优化; 5、熟悉主流Key-Value存储系统,能够进行系统性能调优; 6、掌握Linux 操作系统;熟练使用一种脚本语言,Shell或Python; 7、拥有高并发、分布式系统经验优先; 8、有业务系统中台化经验者优先。 有以下经验者优先: ① 熟练掌握Golang/Python并能灵活运用; ② 具有大规模分布式系统的调优经验,如JVM调优、SQL调优、缓存优化、RPC优化等; ③

mybatis在控制台打印sql语句

青春壹個敷衍的年華 提交于 2020-12-18 06:54:30
1:mybatis-config.xml中配置: <?xml version="1.0" encoding="UTF-8"?> <! DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> </configuration> 2:spring-mvc中配置: <property name="configLocation" value="classpath:mybatis-config.xml"></property> 来源: oschina 链接: https://my.oschina.net/u/4396372/blog/3913128