mybatis动态sql及分页

文章详细介绍了如何在Java中使用MyBatis进行SQL查询,包括动态查询(like操作),resultMap和resultType的区别,以及如何处理多表查询、分页和特殊字符在SQL中的编码。还展示了如何在BookService和BookMapper接口中实现相关功能和测试用例。
摘要由CSDN通过智能技术生成

@Test

public void testselectBooksLike1() {

List<Book> list = this.bookService.selectBooksLike1("%圣%");
list.forEach(System.out::println);

}

@Test

public void testselectBooksLike2() {

List<Book> list = this.bookService.selectBooksLike2("%圣%");
list.forEach(System.out::println);

}@Test

public void testselectBooksLike3() {

List<Book> list = this.bookService.selectBooksLike3("圣");
list.forEach(System.out::println);

}

三、查询返回结果集的处理

=============

resultMap:适合使用返回值是自定义实体类的情况,适合多表,Mapper.xml中自定义集合

resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型,适合单表

bookMapper.xml

select * from t_mvc_book

select * from t_mvc_book

select * from t_mvc_book where bid in

#{bid}

select * from t_mvc_book

select * from t_mvc_book where bid = #{bid}

bookService和bookMapper一致

/**

* 使用resultMap返回自定义类型集合

* @return

*/

List list1();

/**

* 使用resultType返回List

* @return

*/

List list2();

/**

* 使用resultType返回单个对象

* @return

*/

Book list3(BookVo bookVo);

/**

* 使用resultType返回List,适用于多表查询返回结果集

* @return

*/

List list4();

/**

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

* @return

*/

Map list5(Map book);

List listPager(Map map);

BookVo

package com.ltf.vo;

import com.ltf.model.Book;

import java.util.List;

public class BookVo extends Book {

private List<Integer> bookIds;
public List<Integer> getBookIds() {
    return bookIds;
}
public void setBookIds(List<Integer> bookIds) {
    this.bookIds = bookIds;
}

}

bookServiceImpl

@Override

public List list1() {

return bookMapper.list1();

}

@Override

public List list2() {

return bookMapper.list2();

}

@Override

public Book list3(BookVo bookVo) {

return bookMapper.list3(bookVo);

}

@Override

public List list4() {

return bookMapper.list4();

}

@Override

public Map list5(Map book) {

return bookMapper.list5(book);

}

list3如果传多个参数会报以下错误,因为他返回的是list类型,但是方法定义中是Book类型

bookServiceImplTest

@Test

public void testlist1() {

List<Book> list = this.bookService.list1();
list.forEach(System.out::println);

} @Test

public void testlist2() {

List<Book> list = this.bookService.list2();
list.forEach(System.out::println);

}

@Test

public void testlist3() {

BookVo bookVo=new BookVo();
bookVo.setBookIds(Arrays.asList(new Integer\[\]{64}));
System.out.println(this.bookService.list3(bookVo));

}

@Test

public void testlist4() {

List<Map> maps = this.bookService.list4();
maps.forEach(System.out::println);

}

@Test

public void testlist5() {

Map map=new HashMap();
map.put("bid",65);
System.out.println(this.bookService.list5(map));

}

只传一个id结果

结论:多表使用resultMap时,需要在BookMapper.xml中将表的列段进行配置

<idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg column="price" jdbcType="REAL" javaType="java.lang.Float" />

四、分页查询

======

1.为什么要重写mybatis的分页?


Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的

mybatis是借用了拦截器引入第三方完成分页的

2.使用分页插件步骤


导入pom依赖

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

Mybatis.cfg.xml配置拦截器

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

必须配置到environments标签之前,否则会报错

BookMapper.xml

select * from t_mvc_book where bname like concat(concat(‘%’,#{bname}),‘%’)

BookMapper

/**

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

* @return

*/

Map list5(Map book);

List listPager(Map map);

BookService

/**

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

* @return

*/

Map list5(Map book);

List listPager(Map map, PageBean pageBean);

BookServiceImpl

@Override

public List listPager(Map map, PageBean pageBean) {

if(pageBean != null && pageBean.isPagination()){
    PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
List<Map> list = bookMapper.listPager(map);
if(pageBean != null && pageBean.isPagination()){
    PageInfo pageInfo = new PageInfo(list);
    System.out.println("页码:"+pageInfo.getPageNum());
    System.out.println("页大小:"+pageInfo.getPageSize());
    System.out.println("总记录:"+pageInfo.getTotal());
    pageBean.setTotal(pageInfo.getTotal()+"");
}
return list;

}

bookServiceImplTest

@Test

public void testlistPager() {

Map map=new HashMap();
map.put("bname","圣");
List<Map> maps = this.bookService.listPager(map,new PageBean());
maps.forEach(System.out::println);

}

五、特殊字符处理

========

>(>)    <(<)  &(&) 空格(&)  <![CDATA[ <= ]]>

sql语句映射

BookMapper.xml

select * from t_mvc_book

<if test="null != min and min != ''">
  <!\[CDATA\[  and #{min} < price \]\]>
</if>
<if test="null != max and max != ''">
  <!\[CDATA\[ and #{max} > price \]\]>
</if>

select * from t_mvc_book

<if test="null != min and min != ''">
  and #{min} &lt; price
</if>
<if test="null != max and max != ''">
  and #{max} &gt; price
</if>

BookMapper 和 BookService 一致

/**

* 处理特殊字符

* @param bookVo

* @return

*/

List list6(BookVo bookVo);

/**

* 处理特殊字符

* @param bookVo

* @return

*/

List list7(BookVo bookVo);

BookVo增加min和max字段并实现get、set方法

BookServiceImpl

@Override

public List list6(BookVo bookVo) {

return bookMapper.list6(bookVo);

}

@Override

public List list7(BookVo bookVo) {

return bookMapper.list7(bookVo);

}

bookServiceImplTest

@Test

public void testlist6() {

BookVo bookVo=new BookVo();
bookVo.setMin(40f);
bookVo.setMax(70f);
List<Book> books = this.bookService.list6(bookVo);
books.forEach(System.out::println);

}

@Test

public void testlist7() {

前端面试题汇总

JavaScript

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

性能

linux

前端资料汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值