MyBatis

老码农给新秀们的忠告

旧街凉风 提交于 2020-05-06 10:11:22
0. 把语言学学通 1. 谨记java框架四要素: 注解、反射、代理、设计模式,搞懂了这四项,spring、mybatis、hibernate、struts等就没什么秘密了,怎么“组装拆解”四要素就看个人造化了 2. 不要学技术框架,会过时成为历史,前车之鉴,不要单学某种编程语言(比如java,golang,python,nodejs等),你真正要学习的是: 操作系统(tcp/ip,io模型,网络编程,多线程,rpc),设计模式解决方案 3. 。。。。。。 附图两张: 来源: oschina 链接: https://my.oschina.net/u/154866/blog/4267848

原创 记录一次线上Mysql慢查询问题排查过程

空扰寡人 提交于 2020-05-06 09:51:37
背景 前段时间收到运维反馈,线上Mysql数据库凌晨时候出现慢查询的报警,并把原始sql发了过来: --去除了业务含义的sql update test_user set a=1 where id=1; 表数据量200W左右,不是很大,而且是根据主键更新。 问题排查 排查Mysql数据库 我看到sql后第一反应就是是不是数据库出问题了,每个小时都有业务,偏偏白天业务高峰时间段正常,凌晨业务量很少时候出问题,让运维先检查了数据库的状态,反馈是数据库正常。 排查业务代码(第一次) 这块业务代码比较复杂,而且是别人写的,第一次看都没看完,直接在代码里打印了各个模块执行的时间,然后上线。 排查业务代码(第二次) 第二天又出现慢查询了,我赶紧下载了线上日志,发现整个方法执行时间很长,然后发现执行时间长的代码有几行调用其他服务的代码,使用的是HttpClient,猜到了原因,应该是调用其他超时导致的。 说下系统整体流程,微信(A)回调我们的收银台服务(B),收银台更新订单信息并调用业务服务(C)。 出问题原因是: 第一次A调用B,B锁住记录行并调用C,这个时候C没有响应,导致A又发送了第二次请求。 第二次A调用B,B更新记录时候发生死锁,出现慢查询。 解决方案 收银台系统B接收回调的方法添加分布式锁,保证同一时刻同一订单只能更新一次。 收银台调用业务服务使用的是HttpClient4.4

spring + Mybatis + pageHelper + druid 整合源码分享

和自甴很熟 提交于 2020-05-06 09:49:02
springMvc + spring + Mybatis + pageHelper + druid 整合 spring 和druid整合,spring 整合druid spring 和Mybatis 整合,spring 整合Mybatis Mybatis 和pageHelper 整合,Mybatis 整合pageHelper Mybatis和 druid整合,Mybatis整合druid Mybatis和 通用Mapper整合,Mybatis 通用Mapper Mybatis 整合 通用Dao ================================ ©Copyright 蕃薯耀 2018年3月16日 http://www.cnblogs.com/fanshuyao/ 本框架整合使用Maven方式构建,Jdk版本为JDK7,各插件版本如下: Xml代码 < spring.version >4.3.13.RELEASE </ spring.version > < mybatis.version >3.4.6 </ mybatis.version > < mybatis.spring.version >1.3.1 </ mybatis.spring.version > < mybatis.generator.version >1.3.6 </ mybatis.generator

Spring+SpringMVC+MyBatis企业级应用

时光怂恿深爱的人放手 提交于 2020-05-06 09:48:44
[TOC] 古老的SSM企业级应用 Author:SimpleWu 目前Spring+SpringMVC+Mybatis也算是一套非常流行的配套开发框架。 spring核心ioc、aop技术,ioc解耦,使得代码复用,可维护性大幅度提升,aop提供切面编程,同样的增强了生产力。提供了对其他优秀开源框架的集成支持 spring mvc是对比struts2等mvc框架来说的,不说struts2爆出的那么多安全漏洞,而且是类拦截,所有Action变量共享,同时是filter入口的,而spring mvc是方法拦截,controller独享request response数据,采用的serlvet入口,与spring无缝对接。开发而言,spring mvc更加轻量和低入门。 mybatis轻量级半自动化框架,sql由开发者编写可对语句进行调优,并且mybatis使用XML方式JAVA代码与SQL可以解耦并且支持动态SQL语句,学习成本低。 框架搭建步骤 导包 导入Spring+SpringMVC(如果不会选全倒进去就行了) 导入mybatis包(如果需要用到日志可将mybatis依赖包导入) 导入mybatis-spring-1.3.1.jar(整合必须又这个包) 导入c3p0(当然你也可以使用其他连接池) 导入数据库驱动 配置log4j.properties

Mybatis工具类--在执行(批量)sql前 先判断参数是否为空

倾然丶 夕夏残阳落幕 提交于 2020-05-06 03:07:35
如有这样的dao方法: List<User> getUsersByIds(List<Long> idList) ; void deleteUsersByIds(List<Long> idList) ; void batchAddUsers(List<User> userList); 若参数为空的话,执行相关sql时,会报错,因是不完整的sql,如下所示: select * from user where id in delete from user where id in insert into user(name,idcard,...) values 若想避免此一情况,可以在调用dao方法前进行判断。 if(idList!=null && !idList.isEmpty()){ //call dao here } 能否省去这种判断呢?若参数为空,不去执行sql不就行了吗。 刚开始想到用spring aop, 但是发觉不易实现,想拦截dao方法,但报错: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy27]: Common causes of this problem include using a final class or a non-visible class; 因dao均是接口

Spring总结--> 第二结 SpringAOP日志

怎甘沉沦 提交于 2020-05-06 03:03:58
SpringAOP日志记录一下,代码就贴完整代码,一劳永逸。 SpringAOP面向切面编程,拦截指定代码,对该代码进行增强。 SpringAOP实现日志很简单 第一种方式配置XML文件 在Spring的XML文件中配置拦截 定义增强代码就OK了 运行结果 第二种方式注解 配置Spring.xml文件 1 <!-- 声明自动为spring容器中那些配置@aspectJ切面的bean创建代理 --> 2 < aop:aspectj-autoproxy proxy-target-class ="true" /> 定义增强代码 1 package com.xxw.util; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.annotation.After; 5 import org.aspectj.lang.annotation.Aspect; 6 import org.aspectj.lang.annotation.Before; 7 import org.slf4j.Logger; 8 import org.slf4j.LoggerFactory; 9 import org.springframework.stereotype.Component; 10 11 import java.text

Bean 装配:从 Spring 到 Spring Boot

那年仲夏 提交于 2020-05-06 02:35:27
[TOC] 本文首发于我的个人博客, Bean装配,从Spring到Spring Boot ,欢迎访问! 本文旨在厘清从Spring 到Spring Boot过程中,Bean装配的过程。 自从用上Spring Boot,真的是一直用一直爽,已经完全无法直视之前Spring的代码了。 约定大于配置 的设计理念,使得其不需要太多的配置就能开箱即用。但是由于其便捷性,也就意味着掩盖了许多细节的部分,使得直接学习Spring Boot的开发者只会用,而不清楚内部的实现流程。最近刚好有空,重新回顾了一下Spring的相关内容,并且梳理了有关于Bean装配的一些用法,描述从过去的Spring开发,到现在的Spring开发 Boot在Bean装配上的变化和进步。 ## 从SSM的集成谈到Bean的装配 在学习初期,我想每个人都会去看一些博客,例如“Spring Spring MVC Mybatis整合”。一步一步整合出一个ssm项目。那个时候的我是没有什么概念的,完全就是,跟着步骤走,新建配置文件,把内容贴进来,然后run,一个基本的脚手架项目就出来了。回顾一下,基本是以下几步: 1. 建立maven web项目,并在pom.xml中添加依赖。 2. 配置web.xml,引入spring- .xml配置文件。 3. 配置若干个spring- .xml文件,例如自动扫包、静态资源映射

Spring-事务管理【重点】

两盒软妹~` 提交于 2020-05-06 00:57:53
Spring-事务管理 事务的提交和回滚 交给spring 一. 简述 JavaEE 开发中, 事务位于 Service 层 , 由程序判断:出现异常事务回滚,未出异常事务提交。 Spring 使用 AOP 技术进行事务控制,自行帮开发人员适时提交或者回滚事务 S pring: service层未出异常,事务自动提交 S ervice层出现异常,事务自动回滚 二.S pring事务的操作 环境搭建,详见下篇spring和MyBatis的整合噢 测试类: /** * 查询所有用户信息 */ @Test public void run1(){ List<User> ulist = userService .selectAll(); for (User user : ulist) { System. err .println(user); } } S ervice类: /** * 查询所有用户信息 * @return */ @Override public List<User> selectAll() { return userDao .selectAll(); } 添加用户: 测试类: /** * 添加一条用户信息 */ @Test public void run2(){ int row = userService .saveUser( new User( "009" , "小张" ,

SpringBoot+Vue+ElementUI实现含国际化的前后端不分离的传统简易管理系统搭建(一)

谁都会走 提交于 2020-05-05 19:17:11
本项目在GitHub上可以下载源代码,欢迎大家指点。谢谢 GitHub地址: 点击进入 开发IED使用IntelliJ IDEA 目前仅仅在架构运用层解析框架如何使用,后续在此项目完结后会剖析所用到的所有架构的底层原理技术,额,比较倾向于,先学会简单使用,再剖析其底层原理的学习模式。 文章目录 1 项目构建 2 SpringBoot整合SpringSecurity 3.SpringBoot整合Mybatis 4 Resolver整合 1 项目构建 新建一个maven项目,这里就不多说了,给大家看下我这边项目的结构: config:主要存放配置文件资源,我这里目前比较简单,就一个application.properties,当然也可以是推荐的springboot推荐的application.yml i18n:主要存放国际化语言文件,这里需要在application.properties中指定其文件路径和位置 即: # i18n spring.messages.encoding = utf-8 spring.messages.basename = i18n/index META-INF:目前可不需要,我这里是想要以后可能会写一些jsp文件,所以在这里也支持下,配置的jsp文件就会在这里文件夹中 views主要是前端代码了,比如html、js等等 我们先来看后端 首先是pom

HashMap 的 7 种遍历方式与性能分析,高薪必学

别等时光非礼了梦想. 提交于 2020-05-05 14:39:25
随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题。 本文先从 HashMap 的遍历方法讲起,然后再从性能、原理以及安全性等方面,来分析 HashMap 各种遍历方式的优势与不足,本文主要内容如下图所示: 这里也要注意:不管你是为了JAVA高薪还是爱好,记住:项目开发经验永远是核心,如果你没有最新JAVA架构实战视频教程及大厂面试宝典,可以去小编的Java架构学习.裙 :七吧伞吧零而衣零伞 (数字的谐音)转换下可以找到了,里面很多新JAVA架构项目教程,还可以跟老司机交流讨教! HashMap 遍历 HashMap 遍历从大的方向来说,可分为以下 4 类: 迭代器(Iterator)方式遍历; For Each 方式遍历; Lambda 表达式遍历(JDK 1.8+); Streams API 遍历(JDK 1.8+)。 但每种类型下又有不同的实现方式,因此具体的遍历方式又可以分为以下 7 种: 使用迭代器(Iterator)EntrySet 的方式进行遍历; 使用迭代器(Iterator)KeySet 的方式进行遍历; 使用 For Each EntrySet 的方式进行遍历; 使用 For Each KeySet 的方式进行遍历; 使用 Lambda 表达式的方式进行遍历; 使用