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

目录
相关文章
|
5天前
|
SQL XML Java
mybatis 调用修改SQL时 出现了一个问题 没有修改成功也没有报错
mybatis 调用修改SQL时 出现了一个问题 没有修改成功也没有报错
13 0
|
1月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
21 1
|
1月前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
30 1
|
1月前
|
XML Oracle Java
mybatis反向生成实体类、dao层以及映射文件
mybatis反向生成实体类、dao层以及映射文件
14 1
|
1月前
|
SQL
sql server模糊查询、分组
sql server模糊查询、分组
12 1
|
1月前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
15 1
|
1月前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
24 1
|
1月前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
22 2
|
1月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
1天前
|
SQL Java 数据库连接
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射