MyBatis

图解分布式系统架构演进之路

假如想象 提交于 2020-08-19 19:51:33
0、 介绍 本篇文章是在我看完《从零开始学架构》之后,以架构演变为主线,梳理了一下演变过程中出现的问题以及解决方案,文章中引用了这本书的一些内容和图片 分布式和集群的概念经常被搞混,现在一句话让你明白两者的区别。 分布式 :一个业务拆分成多个子业务,部署在不同的服务器上 集群 :同一个业务,部署在多个服务器上 例如:电商系统可以拆分成商品,订单,用户等子系统。这就是分布式,而为了应对并发,同时部署好几个用户系统,这就是集群 1、 单应用架构 2、 应用服务器和数据服务器分离 单机负载越来越来,所以要将应用服务器和数据库服务器分离 3、 应用服务器做集群 每个系统的处理能力是有限的,为了提高并发访问量,需要对应用服务器做集群 这时会涉及到两个问题: 负载均衡 session共享 负载均衡就是将请求均衡地分配到多个系统上,常见的技术有如下几种 DNS DNS是最简单也是最常见的负载均衡方式,一般用来实现地理级别的均衡。例如,北方的用户访问北京的机房,南方的用户访问广州的机房。一般不会使用DNS来做机器级别的负载均衡,因为太耗费IP资源了。例如,百度搜索可能要10000台以上的机器,不可能将这么多机器全部配置公网IP,然后用DNS来做负载均衡。 Nginx&LVS&F5 DNS是用于实现地理级别的负载均衡,而Nginx&LVS&F5用于同一地点内机器级别的负载均衡

Mybatis mapper动态代理的原理详解

♀尐吖头ヾ 提交于 2020-08-19 19:48:29
在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以更加直观的展现出mybatis动态代理替我们所做的工作,有利于我们理解动态代理的过程,讲解完以后我们再进行动态代理的原理解析,此讲解基于mybatis的环境已经搭建完成,并且已经实现了基本的用户类编写以及用户类的Dao接口的声明,下面是Dao层的接口代码 1 public interface UserDao { 2 /* 3 查询所有用户信息 4 */ 5 List<User> findAll(); 6 7 /** 8 * 保存用户 9 * @param user 10 */ 11 void save(User user); 12 13 /** 14 * 更新用户 15 * @return 16 */ 17 void update(User user); 18 /** 19 * 删除用户 20 */ 21 void delete(Integer userId); 22 23 /** 24 * 查找一个用户 25 * @param userId 26 * @return 27 */ 28 User findOne(Integer userId); 29 30 /** 31 * 根据名字模糊查询 32 *

搭建SpringCloud微服务框架:六、数据库持久层-SpringDataJPA

不羁的心 提交于 2020-08-19 16:25:00
搭建微服务框架(数据库持久层-SpringDataJPA) 用惯了Mybatis,这次来换换口味,在SQuid中集成SpringDataJPA。 本文源地址: 搭建微服务框架(数据库持久层-SpringDataJPA) Github地址: SQuid 介绍 以前都是听说过的是 HibernateJPA ,却从来没有使用过,一直在项目中使用的是 Mybatis 。 SpringDataJPA是基于Hibernate的底层封装的一套ORM框架,使用起来的第一感觉是代码量真的很少,相较传统的Mybatis来说,感觉最起码少了60%,当然大部分都是体现在xml文件上。 介绍真的没有太多词汇可以展示出来,下面来进行使用。👇 使用 在squid项目中,我们新建一个 squid-example-jpa 的项目(由于之前的example目录被删除,可以根据下面的层级目录来进行新建) 引入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot

MyBatis系列之浅谈SQL执行流程分析

二次信任 提交于 2020-08-19 13:43:27
目录 独立使用Mybatis Mybatis执行流程 SqlSessionFactory\SqlSession MapperProxy Excutor 独立使用Mybatis 这篇文章主要以分析Mybatis框架执行SQL的流程。 回忆曾经独立使用Mybatis半自动化框架时,我们需要执行以下步骤: 读取配置文件(mybatis-config.xml),初始化配置类即configuration; 创建SQLSessionFactory; 创建SqlSession; 执行SQL,处理结果集 对应如下代码: public class MyBatisUtils { private final static SqlSessionFactory SQL_SESSION_FACTORY; static { String resource = "mybatis-config.xml"; Reader reader = null; try { reader = Resources.getResourceAsReader(resource); } catch (IOException e) { e.printStackTrace(); } SQL_SESSION_FACTORY = new SqlSessionFactoryBuilder().build(reader); } public

支付回调异常如何捕获? 借鉴Mybatis中的ErrorContext

北城余情 提交于 2020-08-19 02:54:59
前言 第三方支付接过不?支付回调的代码写过不? 1.接受支付平台的回调信息,验签判断是否是合法回调 2.调用支付平台查询接口查询订单 3.获取支付状态,成功还是失败 4.支付状态为成功,处理业务 5.返回服务器报文 哪些步骤可能会出错? 第一步可能出错,验签失败 第二步可能查询不到订单,订单是伪造的 第三步支付状态为失败 第四步业务重复处理,报异常 因为本公司的项目都是输出在一个日志文件上,排查问题,就很不方便。 a业务的日志1 b业务的日志1 c业务的日志1 a业务的日志2 单个业务的日志不在一起显示 有一天,有个线上项目是一个商城类的,客户充值到钱包里面,支付了5笔,但实际只成功了3笔。一开始我以为是第三方支付的锅,直接@那边的技术人员,说你们是不是没有回调我们接口。他们查看日志说已经回调了,我看了下我这边的日志,确实是回调了。 那问题在哪呢?由于一开始我这边只打印了回调的信息,并没有针对每个步骤进行打印。改进之后 ···代码 log.info(回调信息) ···代码 log.info(验签结果) ···代码 log.info(订单查询结果) ···代码 log.info(支付状态) ···代码 log.info(处理业务的结果) 最后发现打印日志,是东一块,西一块,很乱,排查问题还是很不方便,而且如果回调都正常,还是会打印日志,就有点浪费。 大家应该都用过Mybatis

Mybatis使用注解开发(7)

我怕爱的太早我们不能终老 提交于 2020-08-19 00:33:25
注解开发 1、面向接口编程 选择面向接口编程的根本原因是为了 解耦 , 关于接口的理解: 定义与实现的分离 接口可以反应设计人员对于系统的抽象理解 2、注解开发 2.1、注解在接口上实现 @Select("select * from user") List<User> getUsers(); 2.2、需要在配置文件中绑定接口 <!--绑定接口--> <mappers> <mapper class="com.malajava.dao.UserMapper"/> </mappers> 2.3、测试 @Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //底层主要使用反射 UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUsers(); for (User user:userList) { System.out.println(user); } } 本质 :反射机制 底层 :动态代理! 3、注解的CRUD 在工具类中可以设置为自动提交事务 public static SqlSession getSqlSession(){ SqlSession

mybatis之foreach用法

核能气质少年 提交于 2020-08-18 21:27:05
在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了 foreach元素的属性主要有item,index,collection,open,separator,close。 item: 集合中元素迭代时的别名,该参数为必选。 index :在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选 open :foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选 separator :元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。 close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。 collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外

springboot application.yml的常用配置

孤人 提交于 2020-08-18 20:39:24
原文地址: https://blog.csdn.net/lxh18682851338/article/details/78661607 1. application.yml # mysql 的数据库配置 spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 username: root password: driver-class-name: com.mysql.jdbc.Driver server: port: 8081 context-path: /spring-boot-demo # 访问地址:http://localhost:8081/spring-boot-demo/hi # tomcat: # uri-encoding: UTF-8 # session: # timeout: # jsp # mvc: # view: # prefix: /WEB-INF/ # 页面默认前缀目录 # suffix: .jsp # 响应页面默认后缀 #热部署 devtools: restart: enabled: true #热部署生效 #设置重启的目录 additional-paths: src

使用MyBatis实现条件查询总结

痴心易碎 提交于 2020-08-18 16:51:54
使用MyBatis实现条件查询 SQL映射文件 使用SELECT完成单条件查询 使用SELECT完成多条查询 使用resultMap完成查询结果的展现 事务开启回滚 使用INSERT完成增加操作 使用update完成修改操作 @Param注解实现多参数入参 使用delete完成删除操作 association collection resultMap自动映射级别 总结 SQL映射文件 Mybatis真正强大的是在于它的SQL映射语句,也是它的流弊之处。 它的功能强大,SQL映射文件的配置却比较简单。 使用SQL映射文件可以减少50%以上的代码量。 Mybatis专注于SQL,对于开发人员来说可极大限度地进行SQL调优,以保证性能, 下面是SQL映射文件的几个顶级元素配置 mapper 它是映射文件的根节点,只有一个属性就是 namespace(命名空间)它的作用是区分不同的mapper,里面的参数是全局唯一的,绑定DAO层接口,即面向接口编程 namespace绑定某个接口之后,就可以不写该接口的实现类,因为mybatis会根据接口的完整名称来找到对应的mapper配置来执行SQL语句。因此namespace的命名必须跟你设置的接口同名比如 2.cache:配置给命名空间的缓存 <!-- cache配置 --> < cache eviction = " FIFO "

Java面试总结

情到浓时终转凉″ 提交于 2020-08-18 16:02:30
面试总结 一、SpringBoot Spring boot是一个脚手架(而非框架),构建于spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可以零配置或者少量配置即可运行我们的项目),其核心主要有如下几个方面: 起步依赖(Starter Dependency) 自动配置(Auto Configuration) 健康检查(Actator)-监控 1. 项目启动过程分析 Spring Boot项目在启动时,首先基于启动入口类上的注解描述,进行自动配置并扫描指定包以及子包中的类进行加载,然后检测类上是否有spring框架中指定的注解描述(例如@Component,@Controller,@Service等)。假如有,则将类交给Spring框架中的Bean Factory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例,假如此Bean指定了生命周期方法,还会调用生命周期方法。当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用 2. 注解描述 @Lazy注解用于描述类,其目的是告诉spring框架此类支持延迟加载,通常会配合单例作用域使用。 @PostConstruct注解用于描述bean对象生命周期方法中的初始化方法