MyBatis的场景应用(动态SQL、模糊查询及映射结果)附(Mybatis中#和$的区别)2

简介: MyBatis的场景应用(动态SQL、模糊查询及映射结果)附(Mybatis中#和$的区别)2

三.resultMap和resultType的区别

1.简介

resultType和resultMap是Mybatis中映射查询结果的两种方式

1.resultType:resultType是一种简单的映射方式,用于指定查询结果的目标类型。你可以通过指定目标类型的全限定名或简单类型名来使用它。例如,如果你有一个User类,你可以使用resultType="com.example.User"来告诉MyBatis将查询结果映射到该类的对象。在使用resultType时,MyBatis通过反射创建目标类型的对象,并将查询结果的列与目标对象的属性进行匹配。

2.resultMap:resultMap提供了更灵活和详细的结果映射方式。通过使用resultMap,你可以定义一个映射规则,将查询结果中的列映射到指定Java对象的属性。你可以在resultMap中指定列名和属性名之间的映射关系,还可以执行一些其他的映射操作,如类型转换、关联对象的加载等。通过使用resultMap,你可以更好地控制结果的映射过程。

2.区别

简单性:resultType比resultMap更简单,只需要指定目标类型即可,而resultMap需要定义详细的映射规则。

灵活性:resultMap比resultType更灵活,可以定义复杂的映射规则,并在映射过程中执行一些额外的操作。

可读性:由于resultType只指定目标类型,因此在查看代码时,可能需要跳转到目标类型的定义处以了解其属性。而resultMap可以在同一个地方定义所有的映射规则,使代码更易读。

3.总结与归纳

(1)

在使用MyBatis中拥有多个场景,返回的结果是多样的,resultType/resultMap

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

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

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

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

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

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

(2)

如果是单表的情况下,resultType与resultMap都可以使用。

1 使用resultMap返回映射关系,指的是实体类与数据库字段的关系

2 使用resultType返回List<T>

3 使用resultType返回单个对象

4 使用resultType返回List<Map>【适用于多表查询返回结果集】

5 使用resultType返回Map<String,Object>【适用于多表查询返回单个结果集】

四. Mybatis中的分页

1. 分页的重要性与介绍

分页,顾名思义,即将大数据集按照一定的页数进行切割,以便在用户界面上进行逐页展示,提升用户体验和数据加载效率。Mybatis作为一款Java持久层框架,内置了强大的分页插件,能够轻松应对海量数据的分页查询需求。

2. 案例演示:Mybatis实现分页

1.导入分页的pom.xml依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

2.在Mybatis.cfg.xml中配置拦截器

<plugins>
    <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
    </plugin>
</plugins>

3.导入PageBean工具类

package com.zking.pagination.entity;
import java.io.Serializable;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
public class PageBean implements Serializable {
  private static final long serialVersionUID = 2422581023658455731L;
  //页码
  private int page=1;
  //每页显示记录数
  private int rows=10;
  //总记录数
  private int total=0;
  //是否分页
  private boolean isPagination=true;
  //上一次的请求路径
  private String url;
  //获取所有的请求参数
  private Map<String,String[]> map;
  public PageBean() {
    super();
  }
  //设置请求参数
  public void setRequest(HttpServletRequest req) {
    String page=req.getParameter("page");
    String rows=req.getParameter("rows");
    String pagination=req.getParameter("pagination");
    this.setPage(page);
    this.setRows(rows);
    this.setPagination(pagination);
    this.url=req.getContextPath()+req.getServletPath();
    this.map=req.getParameterMap();
  }
  public String getUrl() {
    return url;
  }
  public void setUrl(String url) {
    this.url = url;
  }
  public Map<String, String[]> getMap() {
    return map;
  }
  public void setMap(Map<String, String[]> map) {
    this.map = map;
  }
  public int getPage() {
    return page;
  }
  public void setPage(int page) {
    this.page = page;
  }
  public void setPage(String page) {
    if(null!=page&&!"".equals(page.trim()))
      this.page = Integer.parseInt(page);
  }
  public int getRows() {
    return rows;
  }
  public void setRows(int rows) {
    this.rows = rows;
  }
  public void setRows(String rows) {
    if(null!=rows&&!"".equals(rows.trim()))
      this.rows = Integer.parseInt(rows);
  }
  public int getTotal() {
    return total;
  }
  public void setTotal(int total) {
    this.total = total;
  }
  public void setTotal(String total) {
    this.total = Integer.parseInt(total);
  }
  public boolean isPagination() {
    return isPagination;
  }
  public void setPagination(boolean isPagination) {
    this.isPagination = isPagination;
  }
  public void setPagination(String isPagination) {
    if(null!=isPagination&&!"".equals(isPagination.trim()))
      this.isPagination = Boolean.parseBoolean(isPagination);
  }
  /**
   * 获取分页起始标记位置
   * @return
   */
  public int getStartIndex() {
    //(当前页码-1)*显示记录数
    return (this.getPage()-1)*this.rows;
  }
  /**
   * 末页
   * @return
   */
  public int getMaxPage() {
    int totalpage=this.total/this.rows;
    if(this.total%this.rows!=0)
      totalpage++;
    return totalpage;
  }
  /**
   * 下一页
   * @return
   */
  public int getNextPage() {
    int nextPage=this.page+1;
    if(this.page>=this.getMaxPage())
      nextPage=this.getMaxPage();
    return nextPage;
  }
  /**
   * 上一页
   * @return
   */
  public int getPreivousPage() {
    int previousPage=this.page-1;
    if(previousPage<1)
      previousPage=1;
    return previousPage;
  }
  @Override
  public String toString() {
    return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
        + "]";
  }
}

4.编写繁琐的接口类,接口实现类(接口类就不放上去了)

@Override
    public List<Book> like4(String bname, PageBean pageBean) {
        if(pageBean!=null&&pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }
        List<Book> books = BookMapper.like4(bname);
        if(pageBean!=null&&pageBean.isPagination()){
            PageInfo<Book> info = new PageInfo<>(books);
            System.out.println("当前页"+info.getPageNum());
            System.out.println("展示记录数" + info.getPageNum());
            System.out.println("符合查询条件的总记录数" + info.getTotal());
            pageBean.setTotal((int) info.getTotal());
        }
        return books;
    }

5.开始测试

 @Test
    public void Testlike4(){
        PageBean pageBean = new PageBean();
        pageBean.setRows(20);
        pageBean.setPage(2);
        bookBiz.like4("%圣墟%",pageBean).forEach(System.out::println);
    }

这里我们为分页设置参数,查询第二页,每次查询20条数据

测试结果:

数据结果过多,就不演示了

五.mybatis中如何处理特殊字符

1.<![CDATA[]]>的介绍

<![CDATA[]]>是XML中的一个特殊语法,用于标记CDATA(不解析为XML实体)的部分,

使用<![CDATA[ ]]>可以方便地处理包含特殊字符的内容,而无需使用转义字符或动态拼接SQL语句。这样可以提高代码的可读性和维护性。

需要注意的是,尽管使用<![CDATA[ ]]>可以确保内容中的特殊字符不被解析为XML实体,但仍然需要谨慎处理防止SQL注入攻击。建议在执行SQL操作时,始终使用参数绑定和其他安全措施来保护应用程序的安全性。

2.案例演示  

<select id="queryByMinMax" resultType="com.YU.model.Book" parameterType="com.YU.dto.BookDto" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where <![CDATA[price <#{max} and price >#{min}]]>
  </select>

price <#{max} and price >#{min}中的“<”,“>”为特殊字符,在被<![CDATA[ ]]>包裹时不会被解析为XML实体,而作为原始文本处理

目录
相关文章
|
1月前
|
SQL 存储 测试技术
SQL在构建系统中的应用:关键步骤与技巧
在构建基于数据库的应用系统时,SQL(Structured Query Language)作为与数据库交互的核心语言,扮演着至关重要的角色
|
16天前
|
SQL 数据库
如何应用SQL约束条件?
【10月更文挑战第28天】如何应用SQL约束条件?
32 11
|
18天前
|
SQL 安全 Java
MyBatis(6)#{}和${}的区别
在MyBatis中,`#{}`和`${}`是用于在SQL语句中嵌入参数的两种方式。`#{}`用于预处理参数,可以防止SQL注入;而`${}`进行直接字符串替换,适用于动态插入表名或列名,但存在SQL注入风险。建议优先使用`#{}`,并在必要时谨慎使用`${}`。
|
1月前
|
SQL Oracle 关系型数据库
SQL语言的主要标准及其应用技巧
SQL(Structured Query Language)是数据库领域的标准语言,广泛应用于各种数据库管理系统(DBMS)中,如MySQL、Oracle、SQL Server等
|
8天前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
21 0
|
1月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
2月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
1月前
|
SQL 存储 数据库
SQL在构建系统中的应用:关键要素与编写技巧
在构建基于数据库的系统时,SQL(Structured Query Language)扮演着至关重要的角色
|
1月前
|
SQL 关系型数据库 数据库
SQL数据库:核心原理与应用实践
随着信息技术的飞速发展,数据库管理系统已成为各类组织和企业中不可或缺的核心组件。在众多数据库管理系统中,SQL(结构化查询语言)数据库以其强大的数据管理能力和灵活性,广泛应用于各类业务场景。本文将深入探讨SQL数据库的基本原理、核心特性以及实际应用。一、SQL数据库概述SQL数据库是一种关系型数据库
55 5
|
1月前
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
53 3

热门文章

最新文章