例如,假设你有一个名为 User 的类,它具有属性 id、username 和 email:
在开发过程中单表查询往往不能满足需求分析的很多功能,对于比较复杂业务来说,关联的表有几个,甚至是几十个并且表与表之间的关联相当复杂。为了能够实现复杂的功能业务,就必须进行多表查询,Mybatis作为流行的Java持久化框架,提供了灵活而强大的多表查询映射功能,可以实现表之间的一对一、一对多、多对多关系的映射。
MyBatisPlus是一个基于MyBatis的增强框架,提供了一系列方便实用的查询方法,其中包括selectById、selectOne、selectBatchIds、selectByMap、selectPage等方法。本文将介绍这些查询方法的使用方式和注意事项。
作者也是今天才发现这个问题,比如这个,自己一开始都是查询,但是最后一次明显计时修改信息,控制台为报错,并且显示正确,但是数据库中什么都没改
MyBatis的一级缓存是SqlSession级别的缓存,也就是说,只要SqlSession对象未关闭,那么查询到的结果都会被缓存下来。但是,有些情况下,MyBatis会使一级缓存失效,下面我们来详细介绍这些情况。
一、MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehca
2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
2.一级缓存为 session 缓存,在一个 session中 ,一个查询的 select 语句只会执行一次,根据 <select></select>语句的id来判断。
在查阅测试环境业务日志中的ERROR级别的日志时,发现了有一个Mybatis相关的异常错误org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 13。
前后端分离是目前互联网开发中比较广泛使用的开发模式,主要是将前端和后端的项目业务进行分离,可以做到更好的解耦合,前后端之间的交互通过xml或json的方式,前端主要做用户界面的渲染,后端主要负责业务逻辑和数据的处理。
用vuex可以设置一个“全局变量”,使所有的界面都能取到这个变量。 教程如下:Vuex白话教程第一讲:Vuex到底是个什么鬼? Vuex,从入门到入门
上述代码在进行查询的时候如果没有查询到任何值,那么selectOne会返回null,并把null赋值给user对象。这样赋值的时候是不会报错的也不会有任何异常,但是当一个对象为null的时候,是不可以调用其get方法的,会出现空指针异常:
mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目。 mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足sql语句 mybatis可将向prparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射) SqlMapConfig.xml(是mybatis的全局配置文件,名称不固定) 配置了数据源/事务等mybatis运行环境 配置映射文件(配置sql语句) mapper.xml(映射文件)/mapper.xml/mapper.xml SqlSessionFactory(会话工厂) 作用:创建SqlSesion SqlSession(会话,是一个接口,面向用户程序员的接口) 作用:操作数据库(发出sql增删改查) Executor(执行器,是一个接口(基本执行器/缓存执行器)) 作用:SqlSes内部通过执行器操作数据库
在MyBatis中,查询结果通常是将数据库查询结果映射到Java对象中,可以使用resultMap元素来定义查询结果映射规则。例如:
到了本篇文章的重点了,下面我们就开始分析selectOne()方法里面怎么实现的。
在上面的代码中,select元素用于定义查询语句,其中id属性表示查询语句的唯一标识符,parameterType属性表示参数类型,resultType属性表示结果类型。查询语句的具体内容在select元素的文本节点中定义。
MyBatis-Plus与通用Mapper的优点类似。参考MyBatis & 通用Mapper
一级缓存的产生,并不是看mappper的xml文件的select方法,看下面的例子
小面的同事有一天来问小面,'小面啊,我最近看了springSecurity和shiro,感觉好难理解啊!'
在上一篇文章中两个联动菜单,简单的实现我写了一个插件,但是只支持两个链接,完好下支持二 、三级联动
技术点 开发语言:Java 框架:ssm框架 JDK版本:JDK1.8 服务器:tomcat8.5 数据库:mysql 5.7(请一定使用5.×版本数据库,尽量使用5.7) 数据库工具:Navicat16 开发软件:eclipse或者idea都可以 Maven包:Maven3.3.9 系统功能介绍 (1)用户管理功能。主要实现了仿知乎微信小程序的用户管理功能。 (2)标签管理功能。主要实现了仿知乎微信小程序的标签管理功能。 (3)今日热闻管理功能。主要实现了仿知乎微信小程序的今日热闻管理功能。 (4)问答
首先执行method.convertArgsToSqlCommandParam获取传参。
MyBatis中使用parameterType向SQL语句传参,parameterType支持的类型可以是基本类型int,String,HashMap和java自定义类型。
在实现简单网页上对数据内容进行增删改查,需要用到三个部分,分别是jsp网页部分+java后台部分+数据库表
首先引入一个实际的例子,我们常常会写一个dao类来操作数据库,比如查询记录,插入记录等。
4.1 从上面的结果,我们可以看到,第二次查询的时候,就直接没有查询数据库,并且返回的是同一个对象。证明第二次走的就是缓存。
如果尝试修改只读数据源则会抛出异常:java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
原因:oracle jdbc并不能向mysql那样直接配置,原因是Oracle授权问题,Maven不提供oracle JDBC driver,需要手动配置下,这里直接去官网下载,将jar包手动导入idea中
在详解MyBatis的SqlSession获取流程文章中已经知道,MyBatis中获取SqlSession时会创建执行器Executor并存放在SqlSession中,通过SqlSession可以获取映射接口的动态代理对象,动态代理对象的生成可以参考详解MyBatis加载映射文件和动态代理,可以用下图进行概括。
[Java]代码 package com.mytest.tesst; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.i
以上jar包依赖主要是mysql连接,支持mybatis操作以及简化get/set方法的lombok包。
在MyBatis执行过程中,如果希望看到SQL语句的执行过程,则可以为MyBatis配置日志输出信息。MyBatis支持不同的日志输出组件,其中,最常用的就是log4j日志组件了。以下演示为MyBatis配置log4j的过程。
MyBatis是一种基于Java的持久化框架,它可以帮助我们将数据从关系型数据库中读取到Java对象中,同时支持一些高级特性,如缓存。缓存是一种常见的提高应用程序性能的技术,它可以将常用的数据保存在内存中,减少数据库访问的次数,从而提高查询效率。在MyBatis中,缓存分为一级缓存和二级缓存两种类型。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
在MVC的项目中一般不会直接去访问JSP,都是通过.do来转发。 这样做的好处是: 1 所有请求全部通过action来转发,这样便于整体框架的处理。比如,可以加入登陆到某个页面的权限控制,只需要在配置文件中配置,而不用再每个JSP文件中加入相关的逻辑。 2 与数据库,文件等底层存储层连接,读取数据的代码可以在类(action)中执行。这样做,一方面可以将很多方法复用,另一方面使JSP页面的代码变得简单而容易维护。 3 其实.do也就是MVC当中的C,是控制器。在整个系统中起到中央枢纽的作用。先通过它的话就可以把逻辑代码隐藏在后台,使JSP文件作为单纯的VIEW分离出来,降低了系统的耦合性。
gomonkey 是 golang 的一款打桩框架,目标是让用户在单元测试中低成本的完成打桩,从而将精力聚焦于业务功能的开发。
leak-detection-threshold:用来设置连接被占用的超时时间,单位为毫秒,默认为0,表示禁用连接泄露检测。
列表的结果需要关联查询,数据字典的数据也需要展示对应的文本内容而不是值,除了定义VO的方式,我们也可以使用扩展实体类的方式
在MyBatis篇内容的最后我们来给大家详细介绍下Spring是如何整合MyBatis的。让大家彻底掌握MyBatis的底层设计原理及实现。
映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始,还支持接口映射器,这种映射器方式允许以Java代码的方式注解定义SQL语句,非常简洁。
很方便啊 通过函数自动拼接Sql 不需要去XML 再去使用标签 之前一分钟写好的Sql 现在一秒钟就能写好 简直不要太方便
紧接上篇文章:Mybatis深入源码分析之SqlSessionFactoryBuilder源码分析,这里再来分析下,Mapper与接口绑定原理。
已经分享了三篇Mybatis源码分析文章,从 Mybatis的配置文件解析 到 获取SqlSession,再到 获取UserMapper接口的代理对象。
业务Mapper接口PorscheMappr通过继承Mapper<T>接口从而获取了一系列的方法,这一系列的方法也不是Mapper<T>接口本身就有的,而是通过继承其他Mapper如BaseMapper<T>、ExampleMapper<T>等,而这些BaseMapper<T>又继承简介继承了SelectOneMapper<T>才获得selectOne方法,因此我们根据实际需要对Mapper<T>进行定制。
上面的代码是在接口实现类里面自己去执行id,查找并执行mapper文件里面的sql,那么我们想是不是可以减少一步呢?
在项目开发过程中,我们普遍用到的都是单数据源,即所有DB操作的都是同一个数据库。那么当我们想要同时操作多个数据库的时候,应该怎么做呢?
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://louluan.blog.csdn.net/article/details/26699735
MyBatis,曾经给我的感觉是一个很神奇的东西,我们只需要按照规范写好XXXMapper.xml以及XXXMapper.java接口。要知道我们并没有提供XXXMapper.java的实现类,MyBatis到底是怎么做到这一点的呢?有人会说是动态代理,现在我就来通过手写一个迷你版的MyBatis来彻底理解它的设计思想!
领取专属 10元无门槛券
手把手带您无忧上云