MyBatis
文章平均质量分 67
Archie_java
求知若饥,虚心若愚(stay hungry,stay foolish)
好记性不如烂笔头
展开
-
详解mybatis的insert,update,delete返回值
为什么要提数据的事呢,是因为据说这个save返回的就是插入的数据的条数。但是遗憾的是,我们的这个user怎么能没有id呢,没有id有怎么查,怎么删,怎么改。进来的是没有id的user,出去的是有id的user,真是太厉害了,没想到不仅把返回值改变了,连参数都发生了改变,真是太神奇了。keyProperty=“id” 这是id就是绑定的id,那我就疑惑了,这绑定的哪个id啊。这样一搞,如果插入成功的话返回的是1,如果不成功的话返回的是-1。我让你删id是222222的,我还没创建呢,看你怎么删。原创 2024-03-06 21:02:57 · 2809 阅读 · 0 评论 -
Java项目防止SQL注入的四种方案
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。SQL案列此时,数据库的数据都会被清空掉,后果非常严重。原创 2023-09-17 21:52:07 · 284 阅读 · 0 评论 -
Spring学习笔记-Mybatis中Mapper和MapperScan注解&一些不是 mapper 的 interface 也会被处理成 mapper 而被创建成一个bean,启动报错
1.必需引用 mybatis-spring-boot-starter, 否则不能扫描生效。可以用 mybatis-plus 的 mybatis-plus-boot-starter 替代。2.从网上搜 MapperScan,大部分说是通过 basePackage 指定扫描多个包,本身没问题,但不是一个完美的方案。原因如下:(1)如果扫描的包名是一个较顶级的,那么,(2)只有缩小包的范围,。- 其一,会导致列表变得比较长。用通配符解决一部分问题,但需要包包满足一些统一的规则。原创 2023-09-02 16:00:29 · 3260 阅读 · 0 评论 -
MyBatis二级缓存
1、当为select语句时:flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。useCache默认为true,表示会将本条语句的结果进行二级缓存。2、当为insert、update、delete语句时:flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。useCache属性在该情况下没有。原创 2023-05-07 11:59:34 · 609 阅读 · 0 评论 -
浅谈一下mybatis中@CacheNamespace和@CacheNamespaceRef的区别以及使用
这里讲一下存在的一个问题:当使用该注解的时候,你去查询的时候,使用到的查询能被缓存起来,但是,加入你这个查询SQL调用的是xml文件里面的,此时,是不会被缓存的,因为我们有时候会使用很多注解或者tk.mapper,这个时候是不会走xml,所以这个缓存我们用不上,此时存在一个解决方案,在xml文件里面也用上缓存,如下就代表开启使用缓存了,这个方式进行的话存在同上面类似的问题。2、SQL走的是注解形式:@Options(useCache=false)如果你走的是xml,你在注解上使用这个注解,将不会起效。转载 2023-05-07 11:45:36 · 525 阅读 · 0 评论 -
@Select的使用说明
但是这种注解的方式,对于条件较复杂的情况,不太建议这种方式,在字符串中难免会有很多错误,可读性很差。当然,上面的例子中 jdbcType 类型可以省略,只需字段的类型对齐好数据库中的字段类型即可。简便、快速去操作 sql。原创 2023-05-07 11:38:44 · 2409 阅读 · 0 评论 -
Mybatis3源码分析:Sql解析执行-结果集映射(ResultSetHandler)
在PreparedStatementHandler中的query()方法中,是用ResultSetHandler来完成结果集的映射的。Mybatis中只提供了一个ResultSetHandler的实现,那就是DefaultResultSetHandler。下面来看看他的handleResultSets()方法在实际运行过程中,通常情况下一个Sql语句只返回一个结果集,对多个结果集的情况不做分析。实际很少用到。继续看handleResultSet方法。转载 2023-04-20 22:35:22 · 412 阅读 · 0 评论 -
Mybatis中Like 的三种使用方式
推荐使用第三种方式进行模糊查询。原创 2022-11-22 23:05:00 · 2619 阅读 · 0 评论 -
使用MyBatis获得包含内嵌对象或对象集合的结果——MyBatis结果集封装(复杂对象,连接查询结果集封装)
单个对象:javaType。对象集:ofType。原创 2022-10-07 23:21:58 · 154 阅读 · 0 评论 -
MyBatis之工作原理,简单实体的增加、修改、删除、查询_Mybatis-原理总结
一、MyBatis之工作原理MyBatis是一个半自动映射框架。所谓半自动,是相对Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系。我们知道,JDBC有四个核心对象:(1)DriverManager,用于注册数据库连接(2)Connection,与数据库连接对象(3)Statement/PrepareStatement,操作数据库SQL语句的对象(4)ResultSet,结果集或一张虚拟表而MyBatis也有四大核心对象:(1)SqlSession对原创 2022-05-14 21:25:05 · 1369 阅读 · 0 评论 -
Mybatis原理:结果集封装详解
经过sql参数解析、sql动态组装和执行sql,相对而言,结果集的封装,是mybatis数据处理的最后一环。这里只对查询结果而言,因为更新语句一般都是返回影响的行数。抛开mybatis,如果让我们组装结果,我们该如何进行呢?mybatis的查询结果统一表示为:List<E>即使是查询单个对象,它的查询结果还是封装成 List 对象,然后返回list集合的第一个元素。个人根据mybatis的源码,将mybatis对结果集的封装,分成两步:(1)通过反射,创建结果对象,其所有属性原创 2022-05-05 12:24:37 · 2774 阅读 · 1 评论 -
DataIntegrityViolationException: Error attempting to get column处理方案汇总
项目背景项目整体采用的是springboot+mybatis 方式。有一次做数据查询的时候。console突然报:DataIntegrityViolationException: Error attempting to get column ‘xx’…异常。起初没在意。以为是xml中的SQL写错了,排查了没问题。百度一下这个报错,说是实体类属性与数据库字段类型不一致引起的,记录一下防止后续在遇到相似问题。简单写一下出问题的xml及返回值类型:1 mapper:<select id="get原创 2022-05-03 23:36:42 · 10001 阅读 · 1 评论 -
mybatis group by 分组查询:将返回结果封装为map
文章目录1. 最简单但性能最差的做法2. 使用group by分组查询,将查询结果封装成类3.group by分组查询,将结果封装为map。直接封装为map?List1. 最简单但性能最差的做法在逻辑层分多次对数据库进行查询。伪代码如下。List<String> nameList ;List<Integer> countList;for(String name: nameList){countList.add(xxDao.countByName(name));}map原创 2022-05-03 22:56:24 · 11952 阅读 · 1 评论 -
Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现
文章目录一级缓存二级缓存总结对于一名程序员,缓存真的很重要,而且缓存真的是老生常谈的一个话题拉。因为它在我们的开发过程中真的是无处不在。今天LZ带大家来看一下。Mybatis是怎么实现一级缓存和二级缓存的。(自带的缓存机制)一级缓存存在BaseExecutor中,是全局的缓存,每次查询后将值存入BaseExecutor的localCache中。key是由ms,parameter,rowBounds和boundSql一起生成的一个值。value就是查询出来的结果。一旦有任何更新变动,就删除整个local原创 2022-01-11 21:32:43 · 141 阅读 · 0 评论 -
Mybatis源码分析之(六)mybatis拦截器(Interceptor)的实现原理
文章目录前言InterceptorChain保存所有的Interceptor创建四大对象都走ConfigurationInterceptorChain增强对象方法Plugin封装动态代理,让你使用Mybatis拦截器更简单Invocation,让我们能在拦截器中使用动态代理类中的invoke方法中的对象调用时序图小结前言mybatis拦截器是一个非常有用的功能,当你想实现自动分页,自动记录执行的sql等功能时,若在service层,每次调用时,都写代码的话,会非常麻烦,而使用mybatis拦截器,就可以原创 2022-01-11 21:19:51 · 1413 阅读 · 0 评论 -
Mybatis源码分析之(四)mapper访问数据库的底层原理(代理方法中具体访问数据库的细节)
从之前的文章,我们知道了其实mapper真正执行的方法就下面的最后两行。(以下所有的分析都基于一次mybatis的一次select查询。MapperProxy类中的invoke函数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if (Object.class.equals(method.getDeclaringClass())) {原创 2022-01-11 21:12:23 · 489 阅读 · 0 评论 -
Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)
mybatis是怎么拿sqlSession在 上一篇的时候,我们的SqlSessionFactoryBuilder已经从xml文件中解析出了Configuration并且返回了sessionFactory。然后我们要从session;中拿到sqlSessionpublic class DefaultSqlSessionFactory implements SqlSessionFactory { private final Configuration configuration; @Overr原创 2022-01-11 21:03:15 · 574 阅读 · 0 评论 -
Mybatis源码分析之(二)根据配置文件创建SqlSessionFactory(Configuration的创建过程)
SqlSessionFactoryBuilder.build创建SqlSessionFactory(粗略走一步流程)看完上篇文章后,你对mybatis应该有个大概的了解了,那么我们知道new SqlSessionFactoryBuilder().build是框架的入口,我们到SqlSessionFactoryBuilder类里看到里面其实都是build函数的。全都是build重载函数。上面几个重载其实最终都是调用了build(Reader reader, String environment, Prop原创 2022-01-10 23:54:53 · 767 阅读 · 0 评论 -
Mybatis源码分析之(一)搭建一个mybatis框架(写一个mybatis的Demo)
数据库工作:首先准备工作,安装mysql,并且新建一张t_demo表CREATE TABLE `t_demo` ( `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_原创 2022-01-10 23:51:43 · 197 阅读 · 0 评论 -
Mybatis源码分析开篇
Mybatis的由来iBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)mybatis究竟是什么其实Mybatis就是封装了J原创 2022-01-10 23:48:00 · 198 阅读 · 0 评论 -
Mybatis源码分析之(五)mapper如何将数据库数据转换成java对象的
本篇对mybatis从取到数据库数据开始到映射成对象并返回的过程进行了详细的分析。转换ResultSet成java对象下面的代码是PreparedStatementHandler中的 @Override public <E> Cursor<E> queryCursor(Statement statement) throws SQLException { PreparedStatement ps = (PreparedStatement) statement;原创 2022-01-10 23:38:01 · 1660 阅读 · 0 评论 -
mybatis里mapper.xml中SQL语句if语句嵌套if语句
为了实现一个sql可以根据条件不同实现sql语句的动态查询,所以在使用mybatis时,对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句,最开始在我的where子句中我的if语句是这么写的: <where> <if test="status==0 "> status=#{status} </if> <if test="status==1"> status=#{status}原创 2022-01-01 18:41:05 · 5770 阅读 · 0 评论 -
MyBatis中大于号以及小于号的表达方式
1.场景还原在实际项目中,有很多需求需要通过设定一个具体的时间段来搜索或过滤所需的数据,今天笔者就mybatis中时间比较涉及到的大于,小于号的应用方法作个详尽的讲解。2.实现方案以下介绍两种可行方法:①转义法大于:>小于:<大于等于:>=小于等于:<=笔者案例:<select id="view" parameterType="map" resultMap="BaseResultMap"> SELECT * FROM task t,staff原创 2022-01-01 17:07:42 · 35856 阅读 · 0 评论 -
巧妙mybatis避免Where 空条件的尴尬
我就废话不多说了,大家还是直接看代码吧~<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE <if test="state != null"> state = #{state} </if> </select>如果state参数为空时,最终生成SQL语句为SELECT * FROM BLOGWHERE执行会出错,当然,你可以在where原创 2021-12-05 13:33:13 · 5157 阅读 · 1 评论 -
MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况
保存或更新在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。另外,ON DUPLICATE KEY UPDATE不能写where条件。示例:create table kid_score(id tinyint unsigned not null,birth_day date not nul原创 2021-11-20 13:31:22 · 1971 阅读 · 0 评论 -
MySQL + MyBatis 批量插入时存在则忽略或更新记录
一、存在时则忽略为什么在发现重复时会忽略?这里面涉及到两个地方。1、重复则忽略。那么首先是需要判断是否重复,这里是通过唯一索引判断是否重复的。如果表中唯一索引的字段已经存在与将要插入的记录行中唯一索引的字段值相同,则标识为重复。MySQL 中建立唯一索引:ALTER TABLE ‘tableName’ ADD UNIQUE (‘column’);如下面的代码块中的 ght_replace 表的 oldnumber 字段建立唯一索引:ALTER TABLE ght_replace ADD UNIQU原创 2021-11-20 00:00:38 · 2191 阅读 · 0 评论 -
Mybatis 插入时获取主键的方式
mybatis 作为一个主流的 ORM 框架,深受广大开发者的喜爱。有人的地方就有江湖,有代码的地方自然有坑,下面来说说获取 mybatis 的插入后返回的主键。我们可以想一下自动增长的主键特性,在数据库里面肯定有某个地方管理 ID 的自增长,那个机制每次都会记录最近一次新增的主键,或者是取最大值,然后在下一次进行递增处理,因此我们有获取插入的主键要么在新增之前,要么在新增之后,按照习惯我们一般喜欢在新增之后获取主键,下面来说说获取主键的方式。继承 Mapper, MySqlMapper这种方式比较简原创 2021-11-19 23:28:32 · 1961 阅读 · 0 评论 -
MyBatis 解决模糊查询包含特殊字符
第一块:MyBatis 实现模糊查询方式1.1 sql中字符串拼接SELECT * FROM 表名 WHERE 字段名 LIKE CONCAT(CONCAT('%', #{参数}), '%');1 2. 使用 ${…} 代替 #{…} SELECT * FROM 表名 WHERE 字段名 LIKE '%${参数}%'; 注意:($不能防止sql注入, #{}—> 可以防止sql注入的问题)1.3 程序中拼接Java 代码String searchText = new StringB原创 2021-11-15 22:37:31 · 2772 阅读 · 0 评论 -
mybatis中的#{}和${}区别,和使用场景
mybatis中的#{}和${}区别1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”. 2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为or原创 2021-11-15 22:15:21 · 1953 阅读 · 0 评论 -
预处理prepareStatement是怎么防止sql注入漏洞的?
序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞。一、prepareStatement的预编译和防止SQL注入功能大家都知道,java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。 用法就是如下边所示:String sql="update cz_zj_di原创 2021-11-15 22:14:56 · 3765 阅读 · 0 评论 -
mybatis中LIKE模糊查询的几种写法以及注意点
mybatis中对于使用like来进行模糊查询的几种方式:(1)使用${…}注意:由于$是参数直接注入的,导致这种写法,大括号里面不能注明jdbcType,不然会报错org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘VARCHAR’ in ‘cla原创 2021-11-15 22:09:46 · 753 阅读 · 0 评论 -
MyBatis:模糊查询的4种实现方式
1、根据姓名模糊查询员工信息1.1、方式一步骤一:编写配置文件步骤二:测试步骤三:分析 此种方式需要在调用处手动的去添加“%”通配符。1.2、方式二说明: 使用方式一可以实现模糊查询,但是有一点不方便的地方就是:在测试类中,调用selectList()方法传参时需要调用者手动的添加%号通配符,显然是麻烦的,能否在映射配置文件中直接将%号写好呢? 有的朋友可能会这么想,好办,直接在配置文件中这么写:形如1:测试后发现,程序会报错,原因是:缺少单引号。这个时候,有朋友可能会这样想了,那.原创 2021-11-15 21:58:11 · 1322 阅读 · 0 评论 -
Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例
如何用一条sql语句实现批量更新?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。代码如下:UPDATE mytable SET myfield = CASE id WHEN 1 THEN 'value' WHEN 2 THEN 'value' WHEN 3 THEN 'value'END WHERE id IN (1,2,3);这里使用了case when 这个小技巧来实现批量更新。举个例子:代码如下:UPDAT原创 2021-11-13 20:25:51 · 5916 阅读 · 0 评论 -
mybatis 中 foreach collection的三种用法
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束。在使用foreach的时候最关键的也是最容易出错的就是collec原创 2021-11-06 10:00:06 · 327 阅读 · 0 评论 -
mybatis获取表名——mybatis动态调用表名和字段名#{},${}
一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能。今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到。这种情况下,就需要构建sql来动态传入表名、字段名了。现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助。动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。下面让我们先来熟悉下my原创 2021-11-04 22:25:48 · 4806 阅读 · 2 评论 -
mybatis if test判断 list不为空
<if test="list!=null and list.size()!=0"></if>注意 如果使用list.isNotEmpty()会报错,提示不是一个方法原创 2021-11-04 21:19:51 · 1463 阅读 · 0 评论 -
MyBatis JdbcType介绍
MyBatis JdbcType介绍JdbcType介绍数据库列字段都是有类型的,不同的数据库有不同的类型。为了表示这些数据类型,Java源码是采用枚举来定义的:public enum JDBCType implements SQLType { TINYINT(Types.TINYINT), SMALLINT(Types.SMALLINT), INTEGER(Types.INTEGER)}枚举变量也是有类型的,也是有值的,正如整数变量是整数类型,也有值大小一样,上述枚举变原创 2021-10-26 22:34:36 · 1310 阅读 · 0 评论 -
mybatis 一对多查询 按结果嵌套处理、按查询嵌套处理,以及两者之间的区别
mybatis 一对多查询 按结果嵌套处理、按查询嵌套处理最近用到一对多查询,记录一下实体类public class RegionEntity implements Serializable { private Long rid; private String regionName; private String addrImage; private String type; private List<FloorEntity> floorEntities;}原创 2021-10-24 14:38:02 · 470 阅读 · 0 评论 -
Java面试——MyBatis系列总结
文章目录:1.MyBatis是什么?2.JDBC编程有哪些缺陷?MyBatis又是如何改进的?3.MyBatis与Hibernate的区别在哪?4.MyBatis的优缺点5.请说说MyBatis的工作原理6.MyBatis的架构设计是怎样的?7.#{}和${}的区别8.模糊查询like语句该怎么写9.如何获取生成的主键?10.当实体类中的属性名和表中的字段名不一样怎么办?11.什么是MyBatis的接口绑定?有哪些实现方式?12.使用MyBatis的mapper接口调用时有哪些要求?原创 2021-10-03 22:03:46 · 270 阅读 · 0 评论