mybatis动态sql及分页

目录

一、mybatis动态sql

1、if 

2、foreach

①、在BookMapper.xml增加foreach标签

②、BookMapper.java

③、BookService.java

④、BookServiceImpl.java

⑤、测试

二、模糊查询

1、BookMapper.xml增加三种写法

2、BookMapper.java

3、BookService.java

4、BookServiceImpl.java

5、 测试

①、BookServiceImplTest.java

②、#{...}

 ③、${...} 

​ ④、 Concat

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

1、BookMapper.xml增加返回结果集的处理

2、新建BookVo.java

3、 BookMapper.java

4、BookService.java

5、BookServiceImpl.java 

6、测试

①、BookServiceImplTest.java

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

 ③、使resultType返回List

 ④、使用resultType返回单个对象

​ ⑤、使用resultType返回List

 ⑥、 使用resultType返回Map

四、分页查询

1、导入pom依赖

2、Mybatis.cfg.xml配置拦截器

3、BookMapper.xml增加分页

4、BookMapper.java

5、 导入帮助类

①、PageBean.java

②、StringUtils 

6、BookService.java

7、BookServiceImpl.java

8、测试

①、BookServiceImplTest.java

②、运行结果 

五、特殊字符处理

1、BookMapper.xml增加特殊字符处理

2、BookMapper.java

3、BookService.java

4、BookServiceImpl.java

5、测试

①、BookServiceImplTest.java

②、运行结果


一、mybatis动态sql

1、if 

if标签解释:解决了修改需要传递所有列段的问题,以往所用的修改不传的值就为空,mybatis的if解决了它的漏洞,效率更好,单方面讲加了if条件的好一些.

2、foreach

foreach标签解释:解决了后台循环拼接字符串的问题

①、在BookMapper.xml增加foreach标签

  <select id="selectBooksIn" resultType="com.ysq.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>

②、BookMapper.java

有且只有一个变量,指名

List<Book> selectBooksIn(@Param("bookIds") List bookIds);

③、BookService.java

List<Book> selectBooksIn( List bookIds);

④、BookServiceImpl.java

 @Override
    public List<Book> selectBooksIn(List bookIds) {
        return bookMapper.selectBooksIn(bookIds);
    }

⑤、测试

(1)BookServiceImplTest.java 

 @Test
    public void selectBooksIn() {
        System.out.println("mybatis中的foreach标签");
        List<Book> books = this.bookService.selectBooksIn(Arrays.asList(new Integer[]{63, 64, 65}));
        books.forEach(System.out::println);

    }

 (2)运行结果:

二、模糊查询

#{...}  、   ${...}  、   Concat 三个都可以实现模糊查询

$:动态列,通用的增删改查会用

#:除了模糊查询不用 其它都会用

concat:不考虑通用的增删改查情况下都会用

注意:#{...}自带引号,${...}不带引号,有sql注入的风险

1、BookMapper.xml增加三种写法

注意:#{...}:%号需要在后台拼接;

<select id="selectBooksLike1" resultType="com.ysq.model.Book" parameterType="java.lang.String">
    select * from t_mvc_book where bname like #{bname}
  </select>
  <select id="selectBooksLike2" resultType="com.ysq.model.Book" parameterType="java.lang.String">
    select * from t_mvc_book where bname like '${bname}'
  </select>
  <select id="selectBooksLike3" resultType="com.ysq.model.Book" parameterType="java.lang.String">
    select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
  </select>

2、BookMapper.java

 List<Book> selectBooksLike1(@Param("bname") String bname);
    List<Book> selectBooksLike2(@Param("bname") String bname);
    List<Book> selectBooksLike3(@Param("bname") String bname);

3、BookService.java

List<Book> selectBooksLike1(String bname);
    List<Book> selectBooksLike2(String bname);
    List<Book> selectBooksLike3(String bname);

4、BookServiceImpl.java

@Override
    public List<Book> selectBooksLike1(String bname) {
        return bookMapper.selectBooksLike1(bname);
    }

    @Override
    public List<Book> selectBooksLike2(String bname) {
        return bookMapper.selectBooksLike2(bname);
    }

    @Override
    public List<Book> selectBooksLike3(String bname) {
        return bookMapper.selectBooksLike3(bname);
    }

5、 测试

①、BookServiceImplTest.java

 @Test
    public void selectBooksLike1() {
        System.out.println("mybatis中的模糊查询#与$");
        List<Book> books = this.bookService.selectBooksLike1("%圣墟%");
        books.forEach(System.out::println);
    }
    @Test
    public void selectBooksLike2() {
        System.out.println("mybatis中的模糊查询#与$");
        List<Book> books = this.bookService.selectBooksLike2("%圣墟%");
        books.forEach(System.out::println);
    }
    @Test
    public void selectBooksLike3() {
        System.out.println("mybatis中的模糊查询#与$");
        List<Book> books = this.bookService.selectBooksLike3("圣墟");
        books.forEach(System.out::println);
    }

②、#{...}

 @Test
    public void selectBooksLike1() {
        System.out.println("mybatis中的模糊查询#与$");
        List<Book> books = this.bookService.selectBooksLike1("%圣墟%");
        books.forEach(System.out::println);
    }

运行结果:

 ③、${...} 

@Test
    public void selectBooksLike2() {
        System.out.println("mybatis中的模糊查询#与$");
        List<Book> books = this.bookService.selectBooksLike2("%圣墟%");
        books.forEach(System.out::println);
    }

运行结果:

 ④、 Concat

 @Test
    public void selectBooksLike3() {
        System.out.println("mybatis中的模糊查询#与$");
        List<Book> books = this.bookService.selectBooksLike3("圣墟");
        books.forEach(System.out::println);
    }

运行结果:

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

resultMap对应1一种情况

resultType对应2、3、4、5四种情况;

resultMap:适合使用返回值是自定义实体类的情况

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

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

       2、 使用resultType返回List<T>

        3、使用resultType返回单个对象

        4、使用resultType返回List<Map>,适用于多表查询返回结果集

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

1、BookMapper.xml增加返回结果集的处理

<select id="list1" resultMap="BaseResultMap">
    select * from t_mvc_book
  </select>
  <select id="list2" resultType="com.ysq.model.Book">
    select * from t_mvc_book
  </select>
  <select id="list3" resultType="com.ysq.model.Book" parameterType="com.ysq.model.BookVo">
    select * from t_mvc_book where bid in
    <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
      #{bid}
    </foreach>
  </select>
  <select id="list4" resultType="java.util.Map">
    select * from t_mvc_book
  </select>
  <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
    select * from t_mvc_book where bid = #{bid}
  </select>

2、新建BookVo.java

<select id="list1" resultMap="BaseResultMap">
    select * from t_mvc_book
  </select>
  <select id="list2" resultType="com.ysq.model.Book">
    select * from t_mvc_book
  </select>
  <select id="list3" resultType="com.ysq.model.Book" parameterType="com.ysq.model.BookVo">
    select * from t_mvc_book where bid in
    <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
      #{bid}
    </foreach>
  </select>
  <select id="list4" resultType="java.util.Map">
    select * from t_mvc_book
  </select>
  <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
    select * from t_mvc_book where bid = #{bid}
  </select>

3、 BookMapper.java

/**
     * 使用resultMap返回自定义类型集合
     * @return
     */
    List<Book> list1();

    /**
     * 使用resultType返回List<T>
     * @return
     */
    List<Book> list2();

    /**
     * 使用resultType返回单个对象
     * @return
     */
    Book list3(BookVo bookVo);

    /**
     * 使用resultType返回List<Map>,适用于多表查询返回结果集
     * @return
     */
    List<Map> list4();

    /**
     * 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
     * @return
     */
    Map list5(Map book);

4、BookService.java

/**
     * 使用resultMap返回自定义类型集合
     * @return
     */
    List<Book> list1();

    /**
     * 使用resultType返回List<T>
     * @return
     */
    List<Book> list2();

    /**
     * 使用resultType返回单个对象
     * @return
     */
    Book list3(BookVo bookVo);

    /**
     * 使用resultType返回List<Map>,适用于多表查询返回结果集
     * @return
     */
    List<Map> list4();

    /**
     * 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
     * @return
     */
    Map list5(Map book);

5、BookServiceImpl.java 

 @Override
    public List<Book> list1() {
        return bookMapper.list1();
    }

    @Override
    public List<Book> list2() {
        return bookMapper.list2();
    }

    @Override
    public Book list3(BookVo bookVo) {
        return bookMapper.list3(bookVo);
    }

    @Override
    public List<Map> list4() {
        return bookMapper.list4();
    }

    @Override
    public Map list5(Map book) {
        return bookMapper.list5(book);
    }

6、测试

①、BookServiceImplTest.java

/**
     * 结论1:
     * resultMap:多表查询用
     * resultType:单表查询
     *结论2:
     * List<T></>:单表
     * List<Map></>:多表
     */
@Test
    public void list1() {
        System.out.println("五种返回类型配置");
        List<Book> books = this.bookService.list1();
        books.forEach(System.out::println);
    }
    @Test
    public void list2() {
        System.out.println("五种返回类型配置");
        List<Book> books = this.bookService.list2();
        books.forEach(System.out::println);
    }
    @Test
    public void list3() {
        System.out.println("五种返回类型配置");
        BookVo bookVo=new BookVo();
        bookVo.setBookId(Arrays.asList(new Integer[]{61}));
        System.out.println(this.bookService.list3(bookVo));
    }
    @Test
    public void list4() {
        System.out.println("五种返回类型配置");
        List<Map> books = this.bookService.list4();
        books.forEach(System.out::println);
    }
    @Test
    public void list5() {
        System.out.println("五种返回类型配置");
        Map map=new HashMap();
        map.put("bid",61);
        Map m = this.bookService.list5(map);
        System.out.println(m);
    }

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

 @Test
    public void list1() {
        System.out.println("五种返回类型配置");
        List<Book> books = this.bookService.list1();
        books.forEach(System.out::println);
    }

运行结果: 

 ③、使resultType返回List<T>

@Test
    public void list2() {
        System.out.println("五种返回类型配置");
        List<Book> books = this.bookService.list2();
        books.forEach(System.out::println);
    }

运行结果: 

 ④、使用resultType返回单个对象

@Test
    public void list3() {
        System.out.println("五种返回类型配置");
        BookVo bookVo=new BookVo();
        bookVo.setBookId(Arrays.asList(new Integer[]{61}));
        System.out.println(this.bookService.list3(bookVo));
    }

运行结果: 

 ⑤、使用resultType返回List<Map>

适用于多表查询返回结果集

@Test
    public void list4() {
        System.out.println("五种返回类型配置");
        List<Map> books = this.bookService.list4();
        books.forEach(System.out::println);
    }

运行结果:  

 ⑥、 使用resultType返回Map<String,Object>

适用于多表查询返回单个结果集

 @Test
    public void list5() {
        System.out.println("五种返回类型配置");
        Map map=new HashMap();
        map.put("bid",61);
        Map m = this.bookService.list5(map);
        System.out.println(m);
    }

运行结果: 

四、分页查询

1、导入pom依赖

<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、BookMapper.xml增加分页

 <select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
    select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
  </select>

4、BookMapper.java

 List<Map> listPager(Map map);

5、 导入帮助类

(可导可不导,导入为了便捷)

①、PageBean.java

package com.ysq.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
 * 分页工具类
 *
 */
public class PageBean {

	private int page = 1;// 页码

	private int rows = 10;// 页大小

	private int total = 0;// 总记录数

	private boolean pagination = true;// 是否分页
	
	private String url; //保存上一次请求的URL
	
	private Map<String,String[]> paramMap = new HashMap<>();// 保存上一次请求的参数
	
	/**
	 * 初始化pagebean的,保存上一次请求的重要参数
	 * @param req
	 */
	public void setRequest(HttpServletRequest req) {
//		1.1	需要保存上一次请求的URL
		this.setUrl(req.getRequestURL().toString());
//		1.2	需要保存上一次请求的参数	bname、price
		this.setParamMap(req.getParameterMap());
//		1.3	需要保存上一次请求的分页设置	pagination
		this.setPagination(req.getParameter("pagination"));
//		1.4	需要保存上一次请求的展示条目数
		this.setRows(req.getParameter("rows"));
//		1.5  初始化请求的页码	page
		this.setPage(req.getParameter("page"));
	}
	
	public void setPage(String page) {
		if(StringUtils.isNotBlank(page))
			this.setPage(Integer.valueOf(page));
	}

	public void setRows(String rows) {
		if(StringUtils.isNotBlank(rows))
			this.setRows(Integer.valueOf(rows));
	}

	public void setPagination(String pagination) {
//		只有在前台jsp填写了pagination=false,才代表不分页
		if(StringUtils.isNotBlank(pagination))
			this.setPagination(!"false".equals(pagination));
	}


	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getParamMap() {
		return paramMap;
	}

	public void setParamMap(Map<String, String[]> paramMap) {
		this.paramMap = paramMap;
	}



	public PageBean() {
		super();
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = 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 pagination;
	}

	public void setPagination(boolean pagination) {
		this.pagination = pagination;
	}

	/**
	 * 获得起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}
	
	/**
	 * 最大页
	 * @return
	 */
	public int maxPage() {
//		total % rows == 0 ? total / rows : total / rows +1
		return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows + 1;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int nextPage() {
//		如果当前页小于最大页,那就下一页为当前页+1;如果不小于,说明当前页就是最大页,那就无需+1
		return this.page < this.maxPage() ? this.page + 1 : this.page;
	}
	
	/**
	 * 上一页
	 * @return
	 */
	public int previousPage() {
		return this.page > 1 ? this.page - 1 : this.page;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
	}

}

②、StringUtils 

package com.ysq.util;

public class StringUtils {
	// 私有的构造方法,保护此类不能在外部实例化
	private StringUtils() {
	}

	/**
	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isBlank(String s) {
		boolean b = false;
		if (null == s || s.trim().equals("")) {
			b = true;
		}
		return b;
	}
	
	/**
	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNotBlank(String s) {
		return !isBlank(s);
	}

}

6、BookService.java

List<Map> listPager(Map map,PageBean pageBean);

7、BookServiceImpl.java

@Override
    public List<Map> 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;
    }

8、测试

①、BookServiceImplTest.java

@Test
    public void listPager() {
        System.out.println("分页查询");
        Map map=new HashMap();
        map.put("bname","圣墟");
        List<Map> ms = this.bookService.listPager(map,new PageBean());
        ms.forEach(System.out::println);

    }

②、运行结果 

五、特殊字符处理

1、BookMapper.xml增加特殊字符处理

<select id="list6" resultType="com.ysq.model.Book" parameterType="com.ysq.vo.BookVo">
    select * from t_mvc_book
    <where>
      <if test="null != min and min != ''">
        <![CDATA[  and #{min} < price ]]>
      </if>
      <if test="null != max and max != ''">
        <![CDATA[ and #{max} > price ]]>
      </if>
    </where>
  </select>

  <select id="list7" resultType="com.ysq.model.Book" parameterType="com.ysq.vo.BookVo">
    select * from t_mvc_book
    <where>
      <if test="null != min and min != ''">
        and #{min} &lt; price
      </if>
      <if test="null != max and max != ''">
        and #{max} &gt; price
      </if>
    </where>
  </select>

2、BookMapper.java

/**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list6(BookVo bookVo);


    /**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list7(BookVo bookVo);

3、BookService.java

/**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list6(BookVo bookVo);

    /**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list7(BookVo bookVo);

4、BookServiceImpl.java

    @Override
    public List<Book> list6(BookVo bookVo) {
        return bookMapper.list6(bookVo);
    }

    @Override
    public List<Book> list7(BookVo bookVo) {
        return bookMapper.list7(bookVo);
    

5、测试

①、BookServiceImplTest.java

 @Test
    public void list6() {
        System.out.println("特殊字符处理");
        BookVo bookVo=new BookVo();
        bookVo.setMin(20f);
        bookVo.setMax(40f);
        List<Book> books = this.bookService.list6(bookVo);
        books.forEach(System.out::println);
    }
    @Test
    public void list7() {
        System.out.println("特殊字符处理");
        BookVo bookVo=new BookVo();
        bookVo.setMin(20f);
        bookVo.setMax(40f);
        List<Book> books = this.bookService.list7(bookVo);
        books.forEach(System.out::println);
    }

②、运行结果

二者结果是一样的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值