Mybatis-动态sql和分页

目录

一.什么是Mybatis动态分页

二.mybatis中的动态SQL

在BookMaaper.xml中写sql

BookMapper

BookBiz接口类

 BookBizImpl实现接口类

demo测试类

​编辑  测试结果

三.mybatis中的模糊查询

mybatis中的#与$有是什么区别

在BookMapper.xml里面建立三个模糊查询

​编辑 Bookmapper

BookBiz接口类

​编辑 

BookBizImpl实现接口类 

 demo测试类

测试结果

四.mybatis中结果映射

面试题:使用mybatis的各种场景,返回的结果是多样的,resultType/resultMap有什么区别

实例演示


一.什么是Mybatis动态分页

MyBatis是Java中一种持久层框架,它提供了许多数据库操作的便利性。在使用MyBatis进行数据查询时,动态分页是一种常见的需求。

动态分页是指根据用户的请求动态生成数据库查询语句,以满足不同的分页需求。具体来说,动态分页通过在查询语句中添加limit和offset来实现。limit表示每页查询的记录数,offset表示查询结果的偏移量。

在MyBatis中,可以使用动态SQL语句来实现动态分页。动态SQL语句是一种可以根据条件决定是否包含某一段SQL语句的技术。MyBatis提供了一些标签和函数来支持动态SQL语句的编写,比如if、choose、when、otherwise等。

使用MyBatis实现动态分页的步骤如下:

  1. 在SQL映射文件中定义查询语句,根据需要使用动态SQL语句。
  2. 在查询语句中使用limit和offset来实现分页。
  3. 在Java代码中调用MyBatis的分页方法,传入分页参数。
  4. MyBatis会根据传入的分页参数动态生成查询语句,返回分页结果。

总结来说,MyBatis的动态分页可以根据用户的需求动态生成查询语句,实现灵活的数据分页操作。

二.mybatis中的动态SQL

MyBatis的动态SQL在实际开发中具有一些优势和一些潜在的弊端。下面是它们的一些特点:

优势:

  1. 灵活性高:动态SQL允许根据不同的条件动态生成SQL语句,使得查询更加灵活,可以根据实际需求调整查询逻辑。
  2. 可读性好:使用动态SQL可以根据条件自动拼接SQL语句,并且不会引入过多的冗余代码,提高了SQL语句的可读性。
  3. 性能优化:动态SQL可以根据实际情况动态生成查询语句,避免不必要的查询,提高查询性能。

弊端:

  1. 学习成本较高:动态SQL需要了解和掌握MyBatis的动态SQL标签和语法,相对于普通的静态SQL语句,学习成本较高。
  2. 可维护性差:对于复杂的动态SQL语句,难以维护和调试,因为SQL语句的生成逻辑可能会有较多的条件判断和嵌套。
  3. 可能存在安全隐患:动态SQL中直接拼接参数可能存在SQL注入的风险。因此,应该始终使用参数绑定方式,而不是直接在SQL语句中拼接参数。

需要注意的是,虽然动态SQL在某些情况下能提高查询性能,但当动态SQL变得过于复杂时,可能会导致查询的性能下降。因此,在实际开发中应根据实际情况综合考虑,权衡优势和弊端,选择最适合的方案。 

在BookMaaper.xml中写sql

 

BookMapper
package com.zking.mapper;import com.zking.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookMapper {int deleteByPrimaryKey(Integer bid);int insert(Book record);int insertSelective(Book record);Book selectByPrimaryKey(Integer bid);int updateByPrimaryKeySelective(Book record);int updateByPrimaryKey(Book record);List<Book> selectByBids(@Param("bids")  List bids);
}
BookBiz接口类
package com.zking.biz;import com.zking.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookBiz {int deleteByPrimaryKey(Integer bid);int insert(Book record);int insertSelective(Book record);Book selectByPrimaryKey(Integer bid);int updateByPrimaryKeySelective(Book record);int updateByPrimaryKey(Book record);List<Book> selectByBids(List bids);
}
 BookBizImpl实现接口类
package com.zking.biz.impl;import com.zking.biz.BookBiz;
import com.zking.mapper.BookMapper;
import com.zking.model.Book;import java.util.List;/*** @author bing人* @site* @company xy集团* @create 2023-08-21 10:16*/
public class BookBizimpl implements BookBiz {private BookMapper bookMapper;public BookMapper getBookMapper() {return bookMapper;}public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic int deleteByPrimaryKey(Integer bid) {return bookMapper.deleteByPrimaryKey(bid);}@Overridepublic int insert(Book record) {return bookMapper.insert(record);}@Overridepublic int insertSelective(Book record) {return bookMapper.insertSelective(record);}@Overridepublic Book selectByPrimaryKey(Integer bid) {return bookMapper.selectByPrimaryKey(bid);}@Overridepublic int updateByPrimaryKeySelective(Book record) {return bookMapper.updateByPrimaryKeySelective(record);}@Overridepublic int updateByPrimaryKey(Book record) {return bookMapper.updateByPrimaryKeySelective(record);}@Overridepublic List<Book> selectByBids(List bids) {return bookMapper.selectByBids(bids);}
}
demo测试类
  测试结果

 

三.mybatis中的模糊查询

这是一个面试题:

mybatis中的#与$有是什么区别

resulrType:对应的返回类型

resultMap:对应的是返回映射关系,值得是实体类与数据表字段的关系

通常而言,单表查询,以及返回单例,返回多表查询结果,使用resulrType

如果查询的结果,需要有关联属性的体现,那么用resultMap

1.$是占位符传参,#是预处理SQL

2.外在形式,$传参不带引号,#传参自带引号

3.$传参存在sql注入,#不存在

4.$可以用来做动态列,完成动态sql开发

预处理SQL

 

$只是传参是占位符的形式

在BookMapper.xml里面建立三个模糊查询
 Bookmapper

BookBiz接口类
 
BookBizImpl实现接口类 

 

package com.zking.biz.impl;import com.zking.biz.BookBiz;
import com.zking.mapper.BookMapper;
import com.zking.model.Book;import java.util.List;/*** @author bing人* @site* @company xy集团* @create 2023-08-21 10:16*/
public class BookBizimpl implements BookBiz {private BookMapper bookMapper;public BookMapper getBookMapper() {return bookMapper;}public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic int deleteByPrimaryKey(Integer bid) {return bookMapper.deleteByPrimaryKey(bid);}@Overridepublic int insert(Book record) {return bookMapper.insert(record);}@Overridepublic int insertSelective(Book record) {return bookMapper.insertSelective(record);}@Overridepublic Book selectByPrimaryKey(Integer bid) {return bookMapper.selectByPrimaryKey(bid);}@Overridepublic int updateByPrimaryKeySelective(Book record) {return bookMapper.updateByPrimaryKeySelective(record);}@Overridepublic int updateByPrimaryKey(Book record) {return bookMapper.updateByPrimaryKeySelective(record);}@Overridepublic List<Book> selectByBids(List bids) {return bookMapper.selectByBids(bids);}@Overridepublic List<Book> like1(String bname) {return bookMapper.like1(bname);}@Overridepublic List<Book> like2(String bname) {return bookMapper.like2(bname);}@Overridepublic List<Book> like3(String bname) {return bookMapper.like3(bname);}
}
 demo测试类
package com.zking.demo;import com.zking.biz.BookBiz;
import com.zking.biz.impl.BookBizimpl;
import com.zking.mapper.BookMapper;
import com.zking.model.Book;
import com.zking.utils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.Arrays;
import java.util.List;/*** @author bing人* @site* @company xy集团* @create 2023-08-21 10:28*/
public class Demo1 {private BookBiz bookBiz;private SqlSession sqlSession;@Beforepublic void a(){System.out.println("执行测试方法之前会执行的初始化代码块方法");this.sqlSession = SessionUtil.openSession();BookBizimpl book = new BookBizimpl();BookMapper mapper = this.sqlSession.getMapper(BookMapper.class);book.setBookMapper(mapper);this.bookBiz = book;}@Afterpublic void b(){System.out.println("执行测试方法之后的后执行的方法");//提交事务this.sqlSession.commit();}@Testpublic void text1(){System.out.println("测试查询方法方法..");Book book = bookBiz.selectByPrimaryKey(33);System.out.println(book);}@Testpublic void text2(){System.out.println("删除的方法");int insert = bookBiz.deleteByPrimaryKey(1);}@Testpublic void testById(){List<Integer> bids = Arrays.asList(new Integer[]{ 45, 46, 47,48,49});//jdk1.8的新特性bookBiz.selectByBids(bids).forEach(System.out::println);//上面一行代码抵三行代码
//        for (Book selectByBid : bookBiz.selectByBids(bids)){
//            System.out.println(selectByBid);
//        }}@Testpublic void testlike1(){bookBiz.like1("%圣墟%").forEach(System.out::println);}@Testpublic void testlike2(){bookBiz.like2("%圣墟%").forEach(System.out::println);}
}
测试结果

 

 

四.mybatis中结果映射

面试题:使用mybatis的各种场景,返回的结果是多样的,resultType/resultMap有什么区别

1.返回单表的对应的实体类,仅有一个查询结果,可以使用resultType/resultMap

实例演示

使用resultType:

测试结果: 

 

 

使用resultMap:

输出结果:

 

2.返回单表的对应的实体类,有多个查询结果,可以使用resultType/resultMap

 测试结果:

resultType:

 resultMap:

3.返回多表对应的结果,仅有一个查询结果,通常用resultType,也可以用resultMap

 

测试结果:

 

4.返回多表对应的结果,有多个查询结果,通常用resultType,也可以用resultMap

 

5.返回单个列段,仅有一个查询结果,就用resultType

 测试结果:

 

6.返回单个列段,有多个查询结果,就用resultType

 

测试结果:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part II

用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法 Part II 用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法&#xff08;环境VS2022openCV4.8.0&#xff09; Part I_松下J27的博客-CSDN博客 在上一篇文章中&#xff0c;我用cmake成功的生成了ope…

无涯教程-分类算法 - 逻辑回归

逻辑回归是一种监督学习分类算法&#xff0c;用于预测目标变量的概率&#xff0c;目标或因变量的性质是二分法&#xff0c;这意味着将只有两种可能的类。 简而言之&#xff0c;因变量本质上是二进制的&#xff0c;其数据编码为1(代表成功/是)或0(代表失败/否)。 在数学上&…

【网络】IP网络层和数据链路层

IP协议详解 1.概念 1.1 四层模型 应用层&#xff1a;解决如何传输数据&#xff08;依照什么格式/协议处理数据&#xff09;的问题传输层&#xff1a;解决可靠性问题网络层&#xff1a;数据往哪里传&#xff0c;怎么找到目标主机数据链路层&#xff08;物理层&#xff09;&…

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件&#xff0c;也可以直接在一个launch文件中启动多个&#xff0c;这里为了确保启动顺利&#xff0c;添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…

java八股文面试[数据结构]——ConcurrentHashMap原理

HashMap不是线程安全&#xff1a; 在并发环境下&#xff0c;可能会形成环状链表&#xff08;扩容时可能造成&#xff0c;具体原因自行百度google或查看源码分析&#xff09;&#xff0c;导致get操作时&#xff0c;cpu空转&#xff0c;所以&#xff0c;在并发环境中使用HashMap是…

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…

【C++杂货铺】探索vector的底层实现

文章目录 一、STL1.1 什么是STL?1.2 STL的版本1.3 STL的六大组件 二、vector的介绍及使用2.1 vector的介绍2.2 vector的使用2.2.1 vector的定义2.2.2 vector iterator2.2.3 vector空间增长问题2.2.4 vector增删查改 2.3 vector\<char\> 可以替代 string 嘛&#xff1f; …

MyBatis与Spring的集成整合加优化分页功能

目录 一.为什么要将MyBatis和Spring整合&#xff1f;&#xff1f;&#xff1f; 二.配置环境 2.1 pom文件 2.2 xml文件 三.演示举例 四.Aop整合pageHelper 分页插件 今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.为什么要将MyBatis和Spring整合&#xff1f…

arm: day8

1.中断实验&#xff1a;按键控制led灯 流程&#xff1a; key.h /*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒***************************************…

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

图神经网络与分子表征:番外——基组选择

学过高斯软件的人都知道&#xff0c;我们在撰写输入文件 gjf 时需要准备输入【泛函】和【基组】这两个关键词。 【泛函】敲定计算方法&#xff0c;【基组】则类似格点积分中的密度&#xff0c;与计算精度密切相关。 部分研究人员借用高斯中的一系列基组去包装输入几何信息&am…

图论(基础)

知识&#xff1a; 顶点&#xff0c;边 | 权&#xff0c;度数 1.图的种类&#xff1a; 有向图 | 无向图 有环 | 无环 联通性 基础1&#xff1a;图的存储&#xff08;主要是邻接矩阵和邻接表&#xff09; 例一&#xff1a;B3643 图的存储 - 洛谷 | 计算机科学教育新生态 (…

如何实现24/7客户服务自动化?建设智能客服知识库

客户自助服务是指用户通过企业或者第三方建立的网络平台或者终端&#xff0c;实现相关的自定义处理。实现客户服务自动化&#xff0c;对提高客户满意度、维持客户关系至关重要。客户服务自动化可以帮助企业以更快的速度和更高的效率来满足客户的售后服务要求&#xff0c;以进一…

常见的移动端布局

流式布局&#xff08;百分比布局&#xff09; 使用百分比、相对单位&#xff08;如 em、rem&#xff09;等来设置元素的宽度&#xff0c;使页面元素根据视口大小的变化进行调整。这种方法可以实现基本的自适应效果&#xff0c;但可能在不同设备上显示不一致。 <!DOCTYPE ht…

Enable Secure boot on software

User Guide&#xff1a; Secure Boot V1Secure Boot V2espsecure.py Please follow these steps: 1、Query the chip version esptool.py chip_idThe V1.0 version chip only supports Secure boot V1 The V3.0 or later version chip support Secure boot V2 2、You need…

成集云 | 畅捷通T+cloud连接器自动同步财务费用单至畅捷通 | 解决方案

源系统成集云目标系统 方案介绍 财务管理作为企业管理中重要的组成部分&#xff0c;在企业的发展和成长中扮演着重要角色&#xff0c;成集云以钉钉费用单OA审批与畅捷通TCloud系统为例&#xff0c;与钉钉连接器深度融合&#xff0c;通过数据处理和字段匹配实现了费用…

【C51 GPIO的原理和内部结构】

51单片机项目基础篇 中篇&#xff1a;介绍GPIO1、认识GPIO2、GPIO 结构框图与工作原理2.1、P0端口结构框图与工作原理2.1.1、剖析组成 P0 口的每个单元的作用2.1.2、 P0 口做为 I/O 口及地址/数据总线使用时的具体工作过程 2.2、P1 端口结构框图与工作原理2.3、P2 端口结构框图…

73 # 发布自己的 http-server 到 npm

1、添加 .npmignore 文件&#xff0c;忽略不需要的文件 public2、去官网https://www.npmjs.com/检查自己的包名是否被占用 3、切换到官方源&#xff0c;然后检查确认 nrm use npm nrm ls4、登录 npm 账号 npm login5、发布 npm publish6、查看发布情况&#xff0c;发布成功…

波奇学C++:stl的list模拟实现

list是双向带头链表。所以迭代器end()相当于哨兵卫的头。 list不支持和[]重载&#xff0c;原因在于list空间不是连续的&#xff0c;和[]的代价比较大。 访问第n个节点&#xff0c;只能用for循环&#xff0c;来实现 list<int> l; l.push_back(0); l.push_back(1); l.pu…

Matlab图像处理-加法运算

加法运算 图像加法运算的一个应用是将一幅图像的内容叠加到另一幅图像上&#xff0c;生成叠加图像效果&#xff0c;或给图像中每个像素叠加常数改变图像的亮度。 在MATLAB图像处理工具箱中提供的函数imadd()可实现两幅图像的相加或者一幅图像和常量的相加。 程序代码 I1 i…