MyBatis

SpringBoot系列-整合Mybatis(XML配置方式)

一笑奈何 提交于 2021-02-10 11:44:52
本文介绍下SpringBoot整合Mybatis(XML配置方式)的过程。 [TOC] 一、什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 二、整合方式 SpringBoot整合Mybatis也有两种方式,分别为XML配置方式和注解方式,主要优势点如下: 注解方式:代码更加精简,方便。 XML配置方式:隔离sql和业务代码,清晰表达sql,尤其对于较长的sql。 XML映射文件也很简单,只有很少的几个顶级元素: cache – 对给定命名空间的缓存配置。 cache-ref – 对其他命名空间缓存配置的引用。 resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。 sql – 可被其他语句引用的可重用语句块。 insert – 映射插入语句。 update – 映射更新语句。 delete – 映射删除语句。 select – 映射查询语句。 本文介绍XML配置方式,后续文章再介绍注解方式。 三、实战

系统设计的几点思考

帅比萌擦擦* 提交于 2021-02-10 09:33:16
首发于个人公众号《andyqian》,期待你的关注! 前言 又有好一阵子没有更新文章了,今天聊聊系统设计的几点思考。对于我们来说,始终会独自设计,研发,迭代系统。为系统的演进,整个生命周期负责。而负责的系统到底处于什么状态?是否健康?是否出现问题?这些都是需要考虑的问题。 开关 对关键流程,进行开关设置。例如:交易开关,资金池开关。对于金融系统而言,特别是出金端,要做好严格的把控。其目的主要是:兜底,及时止损。例如系统出现漏洞,安全事件时,能够及时将其关闭,停止交易。 对于 TO B 应用而言,则可以定制化开关。如关闭某个企业的出金,交易等。避免系统雪崩,其目的是将系统的影响降到最低。总之可以根据系统的特征,识别系统的关键点,对其进行开关的设置。 监控 业务监控 (在一定时间內,业务处理数是否达标。) 低于阀值时进行业务报警。 数据监控,对主流程的关键数据进行监控。例如:每日的交易数,交易额,成功笔数,失败笔数,以及进行 Top 10 的失败原因进行分析。 报警方式 : 微信报警 邮件报警 短信报警 运营数据可视化 对于系统中的关键数据,进行可视化展示,并与上一周期进行比较。从而可以通过数据的差异发现问题,从而及时解决问题。例如: 每日的交易数,交易额,成功率,失败率,与前一日进行比较,前三日,前一周等等进行比较。 通过图表的形式,展示每日的注册数,活跃数 等关键数据

Mybatis源码解析-Mybatis初始化过程

丶灬走出姿态 提交于 2021-02-10 06:34:29
测试方法 public class UserMapperTest { private UserMapper userMapper; SqlSession sqlSession = null; SqlSessionFactory sqlSessionFactory = null; @Before public void setUp() throws Exception { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //openSession(boolean autoCommit) 设置事务是否自动提交 sqlSession = sqlSessionFactory.openSession(true); // 获取动态代理实现类 this.userMapper = sqlSession.getMapper(UserMapper.class); } @Test public void testQueryUserById() { User user = userMapper

SpringBoot系列-整合Mybatis(注解方式)

*爱你&永不变心* 提交于 2021-02-10 05:31:47
上一篇文章 《SpringBoot系列-整合Mybatis(XML配置方式)》 介绍了XML配置方式整合的过程,本文介绍下SpringBoot通过注解方式整合Mybatis的过程。 [TOC] 一、常用注解说明 @Mapper 可以给接口自动生成一个实现类,让spring对mapper接口的bean进行管理,并且可以省略去写复杂的xml文件。 @Options 配置映射语句的属性。例如:@Options(useGeneratedKeys = true, keyColumn = "id"):指定表的自增主键并自动绑定到实体类对象。 @Result 修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。 @Param 如果你的映射方法的形参有多个,这个注解使用在映射方法的参数上就能为它们取自定义名字。若不给出自定义名字,多参数(不包括 RowBounds 参数)则先以 "param" 作前缀,再加上它们的参数位置作为参数别名。例如 #{param1}, #{param2}。 @Select、@Delete、@Insert、@Update 这四个注解分别代表将会被执行的 SQL 语句。它们用字符串数组(或单个字符串)作为参数。如果传递的是字符串数组,字符串之间先会被填充一个空格再连接成单个完整的字符串。 二、实战

10w行级别数据的Excel导入优化记录

为君一笑 提交于 2021-02-09 20:06:34
作者:后青春期的Keats www.cnblogs.com/keatsCoder/p/13217561.html 需求说明 项目中有一个 Excel 导入的需求:缴费记录导入 由实施 / 用户 将别的系统的数据填入我们系统中的 Excel 模板,应用将文件内容读取、校对、转换之后产生欠费数据、票据、票据详情并存储到数据库中。 在我接手之前可能由于之前导入的数据量并不多没有对效率有过高的追求。但是到了 4.0 版本,我预估导入时Excel 行数会是 10w+ 级别,而往数据库插入的数据量是大于 3n 的,也就是说 10w 行的 Excel,则至少向数据库插入 30w 行数据。 因此优化原来的导入代码是势在必行的。我逐步分析和优化了导入的代码,使之在百秒内完成(最终性能瓶颈在数据库的处理速度上,测试服务器 4g 内存不仅放了数据库,还放了很多微服务应用。处理能力不太行)。具体的过程如下,每一步都有列出影响性能的问题和解决的办法。 导入 Excel 的需求在系统中还是很常见的,我的优化办法可能不是最优的,欢迎读者在评论区留言交流提供更优的思路 一些细节 数据导入: 导入使用的模板由系统提供,格式是 xlsx (支持 65535+行数据) ,用户按照表头在对应列写入相应的数据 数据校验: 数据校验有两种: 字段长度、字段正则表达式校验等,内存内校验不存在外部数据交互。对性能影响较小

Spring Boot进阶系列四

試著忘記壹切 提交于 2021-02-09 15:34:12
这边文章主要实战如何使用Mybatis以及整合Redis缓存,数据第一次读取从数据库,后续的访问则从缓存中读取数据。 1.0 Mybatis MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 MyBatis并不是一套完整的ORM数据库连接框架,目前大多数互联网公司首选的数据库连接方式,不会对应用程序或者数据库的现有设计强加任何影响。 SQL写在xml里,便于统一管理和优化。解除SQL与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。SQL和代码的分离,提高了可维护性。 它的优点也正是缺点,编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。 SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。 1.1使用 MyBatis 官方提供的 Spring Boot 整合包实现。 1.1.1. pom.xml里面添加mybatis jar包。 <!-- springboot,mybatis 整合包 --> <

(转)美团面试题整理

心已入冬 提交于 2021-02-09 12:01:03
背景:最近美团在招聘,打算好好准备准备简历,然后投递一波。 美团点评 社招 一面(3.6中午)结果通过 美女面试官 1 HashMap的put怎么实现,如何解决hash冲突。 调用putval,计算相应hash码,然后初始化(默认64的capacity)或调用resize函数调整大小,判断bucket是否有值,若没有在数组初始化改值。若有则以拉链法(链表的形式)解决hash冲突,这里和ThreadLocalMap不一样,ThreadLocalMap使用的是线性探测法,接着将相应节点加入链表头部。如果超过8个元素会进化为RBtree,防止hash攻击。 RBtree是怎样的数据结构,有什么性质? 二叉树,有序的,四种性质。从而推得路径最长2n,最短n。复杂度为log2N.(此处省略n多话,感兴趣的同学请自行Google) RBtree什么时候会变色? 旋转时,共有四种旋转方式。一般是为了保持平衡,如左边太长,右边太短这样。(打哈哈过去,具体记不清了) hashmap什么时候会调整大小? 根据负载因子来搞事,默认为0.75。 什么是负载因子? 根据capacity来,举个例子,当capacity为100时,如果HashMap的ele的数量到了75就会resize,resize后的大小为原来的2倍,这样可以直接使用位运算得到原来的元素新的hash值。 扩容存在什么问题? (楞了一会

MyBatis实体类属性与表字段不一致的4种解决方案

耗尽温柔 提交于 2021-02-09 09:57:30
pom的依赖配置: 1 < dependencies > 2 < dependency > 3 < groupId > org.mybatis </ groupId > 4 < artifactId > mybatis </ artifactId > 5 < version > 3.4.5 </ version > 6 </ dependency > 7 < dependency > 8 < groupId > junit </ groupId > 9 < artifactId > junit </ artifactId > 10 < version > 4.12 </ version > 11 </ dependency > 12 < dependency > 13 < groupId > mysql </ groupId > 14 < artifactId > mysql-connector-java </ artifactId > 15 < version > 8.0.17 </ version > 16 </ dependency > 17 </ dependencies > MySQL数据库的建表语句: 1 CREATE TABLE `tb_user` ( 2 `id` int ( 11 ) NOT NULL AUTO_INCREMENT, 3 `username`

实体类属性名和数据库表字段名不对应的几种情况以及解决方式

允我心安 提交于 2021-02-09 09:44:37
今天撸码的时候,遇到了一个问题,以下是数据库表字段和我的POJO实体类. 数据库字段名称: 对应的实体类: package com.mybatisplus.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * @author Adil * @date 2020-03-16 15:04:08 */ @Data public class User implements Serializable { private static final long serialVersionUID = -6391149300294480283L ; @TableId(type = IdType.AUTO) private Integer id; private String username; private Date birthday; private Character sex; private String homeAddress; } mapper.xml文件如下: <? xml

面试:如何从大量的 URL 中找出相同的 URL?

♀尐吖头ヾ 提交于 2021-02-08 07:54:52
来源 | http://8rr.co/FR7V 题目描述 给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。 解答思路 每个 URL 占 64B,那么 50 亿个 URL占用的空间大小约为 320GB。 5, 000, 000, 000 * 64B ≈ 5GB * 64 = 320GB 由于内存大小只有 4G,因此,我们不可能一次性把所有 URL 加载到内存中处理。对于这种类型的题目,一般采用 分治策略 ,即:把一个文件中的 URL 按照某个特征划分为多个小文件,使得每个小文件大小不超过 4G,这样就可以把这个小文件读到内存中进行处理了。 思路如下 : 首先遍历文件 a,对遍历到的 URL 求 hash(URL) % 1000 ,根据计算结果把遍历到的 URL 存储到 a0, a1, a2, ..., a999,这样每个大小约为 300MB。使用同样的方法遍历文件 b,把文件 b 中的 URL 分别存储到文件 b0, b1, b2, ..., b999 中。这样处理过后,所有可能相同的 URL 都在对应的小文件中,即 a0 对应 b0, ..., a999 对应 b999,不对应的小文件不可能有相同的 URL。那么接下来,我们只需要求出这 1000 对小文件中相同的 URL 就好了。 接着遍历