1、mybatis动态sql
If、trim、foreach
/** * param * 如果形参在mapper.xml中使用就需要加上面注释 * map name:zs gqe:12 * @param bookIds * @return */
List<Book> selectBooksIn(@Param("bookIds") List bookIds);
foreach标签的使用
<select id="selectBooksIn" resultType="com.huangyucan.model.Book" parameterType="java.util.List"> select * from t_mvc_book where bid in <foreach collection="bookIds" item="bid" open="(" close=")" separator=","> #{bid} </foreach> </select>
测试一下
@Test public void selectBooksIn() { List list=new ArrayList(); list.add(13); list.add(16); list.add(18); List<Book> books = this.bookService.selectBooksIn(list); for (Book b : books) { System.out.println(b); } }
2、模糊查询
mybatis对模糊查询共有三种方式
这里推荐1、3
1、 #{}
2、 ${}
3、 concat
List<Book> selectBooksLikel(@Param("bname")String bname); List<Book> selectBooksLike2(@Param("bname")String bname); List<Book> selectBooksLike3(@Param("bname")String bname);
映射文件
注意:#{…}自带引号,${…}有sql注入的风险
测试
@Test public void selectBooksLike() { String bname="圣墟"; // List<Book> books = this.bookService.selectBooksLike1(StringUtils.toLikeStr(bname)); List<Book> books = this.bookService.selectBooksLike2(StringUtils.toLikeStr(bname)); // List<Book> books = this.bookService.selectBooksLike3(bname); for (Book a : books) { System.out.println(a); }
3、查询返回结果集的处理
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
3.1 使用resultMap返回自定义类型集合
接口
List<Book> list1();
映射文件
<select id="list1" resultMap="BaseResultMap"> select * from t_mvc_book </select>
测试
3.2 使用resultType返回List<T>
接口
List<Book> list2();
映射文件
<select id="list2" resultType="com.huangyucan.model.Book"> select * from t_mvc_book </select>
测试
3.3 使用resultType返回单个对象
BookVo 用来存放包括数据库表映射字段以及多余查询条件所用到的属性
package com.huangyucan.model.vo; import com.huangyucan.model.Book; import java.util.List; /** * @auther 宇晨 * @company * @create 2019-10-17-16:49 * * 介绍 * mybatis、hibernate都是orm框架,表所存在的列段是实体类model都有映射 * 实际开发中,会因为某一些需求改变model,破坏model封装性 * 此时为了保证model的封装性,就可以使用vo类来完成指定的需求 */ public class BookVo extends Book { private Float min; private Float max; private List<Integer> bookIds; public Float getMin() { return min; } public void setMin(Float min) { this.min = min; } public Float getMax() { return max; } public void setMax(Float max) { this.max = max; } public List<Integer> getBookIds() { return bookIds; } public void setBookIds(List<Integer> bookIds) { this.bookIds = bookIds; } }
接口
List<Book> list3(BookVo bookVo);
映射文件
<select id="list3" resultType="com.huangyucan.model.Book" parameterType="com.huangyucan.model.vo.BookVo"> select * from t_mvc_book where bid in <foreach collection="bookIds" item="bid" open="(" close=")" separator=","> #{bid} </foreach> </select>
测试
3.4 使用resultType返回List<Map>,适用于多表查询返回结果集
接口
List<Map> list4(Map map);
映射文件
<select id="list4" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book where bid in <foreach collection="bookIds" item="bid" open="(" close=")" separator=","> #{bid} </foreach> </select>
测试
3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
接口
Map list5(Map map);
映射文件
<select id="list5" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book where bid=#{bid} </select>
测试
4、分页查询
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
使用分页插件步骤
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、使用PageHelper进行分页
@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.getTotal()); System.out.println("当前页:"+pageInfo.getPageNum()); System.out.println("页大小:"+pageInfo.getPageSize()); pageBean.setTotal(pageInfo.getTotal()+""); System.out.println("总页数:"+pageBean.getMaxPage()); } return list; }
4、处理分页结果
5、特殊字符处理
通常的特殊字符会报错
接口
List<Book> list6(BookVo bookVo);
错误演示
<select id="list6" resultType="com.huangyucan.model.Book" parameterType="com.huangyucan.model.vo.BookVo"> select * from t_mvc_book where price > #{min} and price < #{max} </select>
结果
两种解决方法
1、
<select id="list6" resultType="com.huangyucan.model.Book" parameterType="com.huangyucan.model.vo.BookVo"> select * from t_mvc_book where <![CDATA[ price > #{min} and price < #{max} ]]> </select>/
2、
<select id="list6" resultType="com.qukang.model.Book"> select * from t_mvc_book where > price > #{min} and price < #{max} </select>
结果