Mybatis-动态sql和分页

news2024/11/23 22:33:16

目录

一.什么是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;
    }

    @Override
    public int deleteByPrimaryKey(Integer bid) {
        return bookMapper.deleteByPrimaryKey(bid);
    }

    @Override
    public int insert(Book record) {
        return bookMapper.insert(record);
    }

    @Override
    public int insertSelective(Book record) {
        return bookMapper.insertSelective(record);
    }

    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bookMapper.selectByPrimaryKey(bid);
    }

    @Override
    public int updateByPrimaryKeySelective(Book record) {
        return bookMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Book record) {
        return bookMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public 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;
    }

    @Override
    public int deleteByPrimaryKey(Integer bid) {
        return bookMapper.deleteByPrimaryKey(bid);
    }

    @Override
    public int insert(Book record) {
        return bookMapper.insert(record);
    }

    @Override
    public int insertSelective(Book record) {
        return bookMapper.insertSelective(record);
    }

    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bookMapper.selectByPrimaryKey(bid);
    }

    @Override
    public int updateByPrimaryKeySelective(Book record) {
        return bookMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Book record) {
        return bookMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public List<Book> selectByBids(List bids) {
        return bookMapper.selectByBids(bids);
    }

    @Override
    public List<Book> like1(String bname) {
        return bookMapper.like1(bname);
    }

    @Override
    public List<Book> like2(String bname) {
        return bookMapper.like2(bname);
    }

    @Override
    public 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;

    @Before
    public 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;
    }
    @After
    public void b(){
        System.out.println("执行测试方法之后的后执行的方法");
        //提交事务
        this.sqlSession.commit();
    }

    @Test
    public void text1(){
        System.out.println("测试查询方法方法..");
        Book book = bookBiz.selectByPrimaryKey(33);
        System.out.println(book);
    }
    @Test
    public void text2(){
        System.out.println("删除的方法");
        int insert = bookBiz.deleteByPrimaryKey(1);
    }

    @Test
    public 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);
//        }
    }

    @Test
    public void testlike1(){
        bookBiz.like1("%圣墟%").forEach(System.out::println);

    }

    @Test
    public 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.coloradmin.cn/o/913537.html

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

相关文章

校园人员进出入登记系统 微信小程序

利用eclipse编译器和微信开发者工具进行运行高校人员进出管理系统&#xff0c;用户需要登录完成之后才可以进行申请进出学校。管理员在登录系统之后具有的功能包括个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;申请出校管理&#xff0c;出校批准管理&#xff…

idea http request无法识别环境变量

问题描述 创建了环境变量文件 http-client.env.json&#xff0c;然后在*.http 文件中引用环境变量&#xff0c;运行 HTTP 请求无法读取环境变量文件中定义的变量。 事故现场 IDEA 版本&#xff1a;2020.2 2021.2 解决步骤 2020.2 版本环境变量无法读取 2021.2 版本从 2020.…

实景无人直播平台是这么开发出来的

标题&#xff1a;实景无人直播平台开发&#xff1a;探索专业性、思考深度与逻辑性的全新体验 随着科技的不断进步&#xff0c;实景无人直播平台成为了当今数字娱乐领域的热门话题。这种新型娱乐方式将虚拟与现实相结合&#xff0c;为用户带来了前所未有的视听体验。本文将探…

圆的反演 hdu 6097

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 题目大意 http://acm.hdu.edu.cn/showproblem.php?pid6097 有一个圆C&#xff0c;它的圆心是O(0,0), 半径是r。 在C内部或边界上有两点P和Q&#xff0c;OPOQ。 求解…

mysql 8.0 窗口函数 之 序号函数 与 sql server 序号函数 一样

sql server 序号函数 序号函数 ROW_NUMBER() 顺序排序RANK() 并列排序&#xff0c;会跳过重复的序号&#xff0c;比如序号为1&#xff0c;1&#xff0c;3DENSE_RANK() 并列排序&#xff0c;不会跳过重复的序号&#xff0c;比如 序号为 1&#xff0c;1&#xff0c;2 语法结构…

【树莓派打怪升级】:玩转个人Web世界!

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点 将web站点发布到公网安装 Cpolarcpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配置cpola…

MFC——base编码和json数据

目录 1. JSON是什么 2. base64是什么 Base64是一种编解码算法 1. JSON是什么 JSON 是一种数据格式。采用完全独立于语言的文本格式, 因为易读, 易写, 易解析的特性成为理想的数据交换语言。主要有三种类型的值:简单值(字符串, 数字, 布尔, null), 对象, 数组。 长这样的数…

AI Agent在情景猜谜场景下的AgentBench基准测试

目录 AgentBench评估哪些场景? 近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现…

什么是eval()?eval是用来干什么的?

一、什么是eval()? eval() 是 JavaScript 中的一个全局函数&#xff0c;用于解析并执行传递给它的字符串作为 JavaScript 代码。 二、eval()是用来干什么的&#xff1f; 当调用 eval() 时&#xff0c;它会将传入的字符串参数视为 JavaScript 代码&#xff0c;并在调用位置执…

KEPServerEX 助力选矿厂生产优化升级

背景 客户是一家系统集成商&#xff0c;在山西某选矿厂项目中为业主提供一系列的设备安装及通讯支持&#xff0c;为了更高效节能的完成选矿环节&#xff0c;客户需要对设备实时状态进行精确监控&#xff0c;并将需要的数据记录到数据库中&#xff0c;方便后期进行数据追溯、大数…

【无标题】 欢迎使用Markdown编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

继承中的构造与析构

思考 如何初始化父类成员&#xff1f; 父类构造函数和子类构造函数有什么关系&#xff1f; 子类对象的构造 子类中可以定义构造函数 子类构造函数 必须对继承而来的成员进行初始化 直接通过初始化列表或者赋值的方式进行初始化调用父类构造函数进行初始化 父类构造函数在子…

实业兴国 守护种源 —— 白露木實®农业的活力之风

高科技领域&#xff0c;芯片是生命线&#xff1b;而在农业领域&#xff0c;种源与芯片在高科技领域的重要性是相同的。保护、发展、培育我国的种质资源&#xff0c;是中国农业发展至为关键的一环。但是&#xff0c;因为思想、观念、认识、技术等方面的原因&#xff0c;让我们错…

营销系统类型有哪些?广州市营销系统开发推荐

营销系统是能够让企业实现与客户的价值交换&#xff0c;并从中获得销售收入的系统。企业的日常经营离不开营销推广活动&#xff0c;为了让用户获得更好的营销体验、也为了企业更快捷简便地提供营销服务&#xff0c;自然少不了对于营销系统的使用。如开利网络蚓链营销系统拥有70…

3D虚拟数字人定制及数字人影片制作方案

在新消费大环境下&#xff0c;各行业正在向着数字化方向发展&#xff0c;数字人是行业进入数字化的主要入口&#xff0c;因此“数字人品牌”的营销模式不断出现于市场&#xff0c;为何品牌偏爱3D虚拟数字人定制&#xff1f; 因为数字人随着惯性动作捕捉技术的应用&#xff0c;成…

如何将数据从 InfluxDB 无缝接入到 TDengine 中?来看看

现在借助 TDengine 3.0 企业版和 TDengine Cloud&#xff0c;你可以无缝接入不同数据源的数据到 TDengine 中了&#xff0c;为了帮助大家更好地应用此功能&#xff0c;我们还输出了系列的教程文章。上期《TDengine 推出重磅功能&#xff0c;助力 MQTT 无缝数据接入》一文为大家…

中小企业如何搭建在线客服中心?

随着人工智能时代的到来&#xff0c;人工智能在企业服务领域的实际场景尤为迫切&#xff0c;对智能客户服务机器人的需求也出现在历史时刻。同时&#xff0c;随着用户对体验的需求不断提高&#xff0c;传统企业的客户服务部门往往陷入一定的自我矛盾循环。 目前&#xff0c;企…

【技术】百度 LBS 地址转换

百度 LBS 地址转换 LBS 简介LBS 案例注册百度账号开发文档创建应用Java 代码请求参数返回参数 LBS 简介 在移动互联网时代&#xff0c;地理定位服务&#xff08;Location-Based Service, LBS&#xff09;成为了许多应用程序的重要功能之一。百度作为中国最大的互联网公司之一&…

c语言(11)

第一题 第二题 第三题 第四题 第五题 第六题 第七题

【C++】基础:常见错误与异常处理

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍常见错误与异常处理。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&a…