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实体,而作为原始文本处理

目录
相关文章
|
4天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
9天前
|
SQL 安全 Java
MyBatis(6)#{}和${}的区别
在MyBatis中,`#{}`和`${}`是用于在SQL语句中嵌入参数的两种方式。`#{}`用于预处理参数,可以防止SQL注入;而`${}`进行直接字符串替换,适用于动态插入表名或列名,但存在SQL注入风险。建议优先使用`#{}`,并在必要时谨慎使用`${}`。
|
27天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
2月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
2月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
3月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志