Mybatis-动态sql和分页

这篇具有很好参考价值的文章主要介绍了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

Mybatis-动态sql和分页,mybatis,sql,java 

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-动态sql和分页,mybatis,sql,java  测试结果

Mybatis-动态sql和分页,mybatis,sql,java

 文章来源地址https://www.toymoban.com/news/detail-667066.html

三.mybatis中的模糊查询

这是一个面试题:

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

resulrType:对应的返回类型

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

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

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

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

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

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

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

预处理SQL

Mybatis-动态sql和分页,mybatis,sql,java 

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

Mybatis-动态sql和分页,mybatis,sql,java

在BookMapper.xml里面建立三个模糊查询
Mybatis-动态sql和分页,mybatis,sql,java Bookmapper

Mybatis-动态sql和分页,mybatis,sql,java

BookBiz接口类
Mybatis-动态sql和分页,mybatis,sql,java 
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-动态sql和分页,mybatis,sql,java

Mybatis-动态sql和分页,mybatis,sql,java 

 

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

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

实例演示

使用resultType:

Mybatis-动态sql和分页,mybatis,sql,java

测试结果: 

Mybatis-动态sql和分页,mybatis,sql,java 

 

使用resultMap:

Mybatis-动态sql和分页,mybatis,sql,java

输出结果:

Mybatis-动态sql和分页,mybatis,sql,java 

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

Mybatis-动态sql和分页,mybatis,sql,java

 测试结果:

resultType:

Mybatis-动态sql和分页,mybatis,sql,java

 resultMap:

Mybatis-动态sql和分页,mybatis,sql,java

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

Mybatis-动态sql和分页,mybatis,sql,java

 

测试结果:

Mybatis-动态sql和分页,mybatis,sql,java 

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

Mybatis-动态sql和分页,mybatis,sql,javaMybatis-动态sql和分页,mybatis,sql,java

 

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

Mybatis-动态sql和分页,mybatis,sql,java

 测试结果:

Mybatis-动态sql和分页,mybatis,sql,java

 

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

 Mybatis-动态sql和分页,mybatis,sql,java

测试结果:

Mybatis-动态sql和分页,mybatis,sql,java 

 

 

到了这里,关于Mybatis-动态sql和分页的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis从入门到CRUD到分页到日志到Lombok到动态SQL再到缓存

    1.导入maven依赖 2.配置核心文件 3.从 XML 中构建 SqlSessionFactory 编写mybatis工具类 dao接口 接口实现类由原来的UserDaolmpl转变为-一个Mapper配置文件. 测试 测试二 select insert update dalete 创建实体类 编写接口 编写对应sql语句 测试 万能map Map传递参数,直接在sq|中取出key即可! [parameterT

    2024年03月08日
    浏览(50)
  • Mybatis-分页与动态字符

    目录 一.Mybatis动态分页    什么是动态分页:  导入pom依赖 配置拦截器 编写Bookmapper文件 配置pageBean文件  配置BookBiz接口类 配置BookBizImpl实现接口类  编写实现类demo 测试结果 ​编辑  不走插件,不会分页  二.Mybatis的特殊字符 编写一个BookDto  编写BookMapper.xml  编写BookMapp

    2024年02月11日
    浏览(32)
  • MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式

    目录 引言 一、使用正确的方式实现分页 1.1.什么是分页 1.2.MyBatis中的分页实现方式 1.3.避免SQL注入的技巧 二、特殊字符的正确使用方式 2.1.什么是特殊字符 2.2.特殊字符在SQL查询中的作用 2.3.如何避免特殊字符引起的问题 2.3.1.使用CDATA区段  2.3.2.使用实体引用 三、总结和展望

    2024年02月11日
    浏览(39)
  • 认识MyBatis 之 MyBatis的动态SQL

    本篇介绍MyBatis里如何使用动态SQL,了解如何去简单使用动态标签;如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 使用动态SQL的好处:根据不同的条件拼接 SQL 语句,提高了SQL的灵活性; if标签:判断时使用,满足test中的判断,执行if条件 格式: if te

    2024年02月14日
    浏览(40)
  • 【MyBatis】四、MyBatis中的动态SQL标签

    动态SQL语句是动态的拼接Mybatis中SQL语句的情况,可以动态的在Mybatis中使用SQL if语句的xml文件: 传入对象来进行调用: where标签中的and会被自动去掉,并且若没有合适的内容,则不会添加where 注意:where标签只能去掉条件前的and、五福去掉条件后的and trim标签会在其内容

    2024年02月09日
    浏览(41)
  • 【MyBatis】2、MyBatis 的动态 SQL 和增删改操作

    注意: openSession() 的参数默认值是 false (不自动提交事务) 🌼 设置新插入记录的主键(id)到参数对象中 动态 SQL 官方文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html ☆ 批量插入: 💦 批量添加的执行效率比 多次 单个添加的执行效率要高,但是无法获取到新插入的记录的主

    2024年02月07日
    浏览(49)
  • mybatis----动态Sql

    1.if标签 通过if标签构建动态条件,通过其test属性的true或false来判断该添加语句是否执行。 mapper接口 映射文件 这里test中的属性名与Account类中的属性名一致。例如:上述文件的第一个if标签中的id严格与Account中属性名id一致。 测试 结果: 执行效果等同于select * from account whe

    2024年01月23日
    浏览(43)
  • MyBatis之动态sql

    目录 一、MyBatis动态sql 1.1 是什么 1.2 作用 1.3 优点 1.4 特殊标签 1.5 代码演示 二、#和$的区别 2.1 #使用 2.2 $使用 2.3 综合 2.4 代码演示 三、resultType与resultMap的区别 3.1 关于resultType 3.2 关于resultMap   3.3 两者区别 3.4 代码演示 是一种在SQL语句中根据不同条件动态拼接SQL的方式。通

    2024年02月11日
    浏览(37)
  • MyBatis - 动态 SQL

    动态 SQL 是 MyBatis 提供的一个非常强大的功能,它可以让我们在运行时构建 SQL 语句。这意味着我们可以根据应用程序的需求来构建符合要求的 SQL。通常情况下,这是非常有用的,因为有时我们不知道要查询哪些表,或者要查询哪些列。此外,动态 SQL 还可以用来构建动态修改

    2024年02月07日
    浏览(51)
  • 【MyBatis】动态SQL

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。具体的定义大家可以参

    2024年01月17日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包