今天我们主要讲解
1、mybatis动态sql
2、模糊查询
3、查询返回结果集的处理
4、分页查询
5、特殊字符处理
在参数前面加上@Param(“bookIds”)的作用是在Mapper.xml中可以使用,里面放的是别名。
List<Book> selectByIn(@Param("bookIds") List bookIds);
在Mapper接口中定义好方法,然后alt + 回车。选择下图所示。
<select id="selectByIn" resultType="com.zking.model.Book" parameterType="java.util.List">
select * from t_mvc_book where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
foreach>
select>
resultType 是你返回来的数据类型,
parameterType 是你参数的数据类型,
select中间就是你要执行的sql语句
除了foreach还有if,trim if即是判断,trim则是去空格等动态sql可以生成。
foreach使用规则:
separator 是使用什么隔开。
item 则是代表着集合中的每个元素。
然后进行测试
@Test
public void insert() {
List list = new ArrayList();
list.add(15);
list.add(19);
list.add(26);
list.add(36);
List books = this.bookService.selectByIn(list);
for (Book b : books) {
System.out.println(b);
}
}
讲解三种模糊查
#{…}
${…}
Concat sql语句
Mapper接口:
List<Book> selectByLike1(@Param("bname") String bname);
List<Book> selectByLike2(@Param("bname") String bname);
List<Book> selectByLike3(@Param("bname") String bname);
sql:
这里可看到我第一个使用的是#{}、第二个使用的是${}、第三个使用的是concat()函数。后面会为大家讲解这三种区别
<select id="selectByLike1" resultType="com.zking.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like #{bname}
select>
<select id="selectByLike2" resultType="com.zking.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like '${bname}'
select>
<select id="selectByLike3" resultType="com.zking.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
select>
为了演示方便我们还写了一个静态方法用来传值
package com.zking.util;
/**
* @author润红的爸爸
* @site www.xiaomage.com
* @company 潇洒公司
* @create 2019-09-20 16:59
*/
public class StringUtils {
public static String toLikeStr(String str){
return "%"+str+"%";
}
}
测试
@Test
public void selectByLike() {
// List books = this.bookService.selectByLike1(StringUtils.toLikeStr("圣墟"));
// List books = this.bookService.selectByLike2(StringUtils.toLikeStr("圣墟"));
List<Book> books = this.bookService.selectByLike3("圣墟");
for (Book b : books) {
System.out.println(b);
}
}
三种方法都可以查出来效果但是要注意:第一种#{…}自带引号,第二种${…}有sql注入的风险
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型。比如String、list、int。。。
resultMap:适合使用返回值是自定义实体类的情况。也就是Mapper.xml中定义的:
3.1 使用resultMap返回自定义类型集合
3.2 使用resultType返回List
3.3 使用resultType返回单个对象
3.4 使用resultType返回List
3.5 使用resultType返回Map
/**
* 使用resultMap返回自定义类型集合
* @return
*/
List<Book> list1();
/**
* 使用resultType返回List
* @return
*/
List<Book> list2();
/**
* 使用resultType返回单个对象
* @return
*/
Book list3(BookVo bookVo);
/**
* 使用resultType返回List
List<Map> list4(Map map);
/**
* 使用resultType返回Map,适用于多表查询返回单个结果集
* @return
*/
Map list5(Map map);
这里就需要一个vo类了
BookVo
vo类,就是value Object,用来处理查询条件所需要用到的而又不是数据库字段的属性
package com.zking.model;
import java.util.List;
/**
* @author润红的爸爸
* @site www.xiaomage.com
* @company 潇洒公司
* @create 2019-09-20 19:15
*/
public class BookVo {
private List<String> bookIds;
private float min;
private float max;
public float getMax() {
return max;
}
public void setMax(float max) {
this.max = max;
}
public float getMin() {
return min;
}
public void setMin(float min) {
this.min = min;
}
public List<String> getBookIds() {
return bookIds;
}
public void setBookIds(List<String> bookIds) {
this.bookIds = bookIds;
}
}
sql
<select id="list1" resultMap="BaseResultMap">
select * from t_mvc_book
</select>
<select id="list2" resultType="com.zking.model.Book">
select * from t_mvc_book
</select>
<select id="list3" resultType="com.zking.model.Book" parameterType="com.zking.model.BookVo">
select * from t_mvc_book where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
<select id="list4" parameterType="java.util.Map" resultType="java.util.Map">
select * from t_mvc_book
<where>
<if test="null != bname and bname != ''">
and bname like #{bname}
</if>
</where>
</select>
<select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
select * from t_mvc_book
<where>
<if test="null != bid and bid != ''">
and bid = #{bid}
</if>
</where>
</select>
测试:
@Test
public void testListReturn() {
// 使用resultMap返回自定义类型集合
// List books = bookService.list1();
// 使用resultType返回List
// List books = bookService.list2();
// for (Book b : books) {
// System.out.println(b);
// }
// 使用resultType返回单个对象
// BookVo bookVo = new BookVo();
// List list = new ArrayList();
// list.add("19");
// bookVo.setBookIds(list);
// Book books = this.bookService.list3(bookVo);
// System.out.println(books);
//返回的是resultType,使用List
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的。
首先使用分页插件步奏第一步
1、导入pom依赖
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>5.1.2version>
dependency>
2、Mybatis.cfg.xml配置拦截器
在Mybatis.cfg.xml中插入:
注意要配在运行环境之前
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
plugin>
plugins>
然后在实现接口中写方法:
@Override
public List<Map> listPager(Map map, PageBean pageBean) {
if(pageBean != null && pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
List<Map> list = bookMapper.list4(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;
}
测试:
@Test
public void ListPager() {
Map map = new HashMap();
map.put("bname",StringUtils.toLikeStr("圣墟"));
PageBean pageBean = new PageBean();
// pageBean.setPage(3);
pageBean.setPagination(false);
List<Map> list = this.bookService.listPager(map, pageBean);
for (Map l : list) {
System.out.println(l);
}
}
(>)
<(<)
&(&)
空格( )
如果要写大于或者小于符号,是会报错的,他有专门的方法来表示的。
第一种方法:
> 代替大于 <代替小于
第二种方法:
在sql语句前加上
/**
* 处理特殊字符
* @param bookVo
* @return
*/
List<Map> list6(BookVo bookVo);
/**
* 处理特殊字符
* @param bookVo
* @return
*/
List<Map> list7(BookVo bookVo);
sql
<select id="list6" resultType="java.util.Map" parameterType="com.zking.model.BookVo">
select * from t_mvc_book
<where>
<if test="null != min and min != ''">
and price > #{min}
if>
<if test="null != max and max != ''">
and price < #{max}
if>
where>
select>
<select id="list7" resultType="java.util.Map" parameterType="com.zking.model.BookVo">
select * from t_mvc_book
<where>
<if test="null != min and min != ''">
#{min}]]>
if>
<if test="null != max and max != ''">
if>
where>
select>
@Test
public void sqlSpecial() {
BookVo bookVo = new BookVo();
bookVo.setMin(20);
bookVo.setMax(30);
// List list = this.bookService.list6(bookVo);
List<Map> list = this.bookService.list7(bookVo);
for (Map l : list) {
System.out.println(l);
}
}