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