1, mybatis dynamic sql
2, fuzzy query
3, the query returns a result set
4, paging query
5, special character handling
1.mybatis dynamic sql
If、trim、foreach
If the label is determined whether a field is empty
<select id="list4" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book <where> <if test="null != bname and bname !=''"> and bname like #{bname} </if> </where> </select>
trim tab is generally used to remove excess sql statement and key, comma, or prior to splicing sql statement "where", "set" and "values (" et prefix, or add ")" suffix, can be used to selectively insert, update, delete, query and other operations or condition.
<trim prefix="values (" suffix=")" suffixOverrides="," > <if test="bid != null" > #{bid,jdbcType=INTEGER}, </if> <if test="bname != null" > #{bname,jdbcType=VARCHAR}, </if> <if test="price != null" > #{price,jdbcType=DOUBLE}, </if> </trim>
foreach tag through the collection, batch query, typically used in keyword
<select id="selectByIn" resultType="com.liuwenwu.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>
List<Book> selectByIn(@Param("bookIds")List bookIds);
test
@Test public void selectByIn() { List list = new ArrayList(); list.add(8); list.add(2); list.add(3); list.add(10); List<Book> books = this.bookService.selectByIn(list); for (Book b : books){ System.out.println(b); } }
2. Fuzzy query (three ways)
2.1 %% directly into the argument
2.2 Use $ {...} instead of # {...} (do not recommend using this mode, there is the risk of SQL injection)
key: # {...} and $ {...} difference?
Parameters of type String # longitudinal single quotes will [ '], $ value directly inserted
Note:
. 1) MyBatis pass parameters used OGNL expression
2) {...} # precedence
present SQL 3) $ {...} risk injection mode
2.3 SQL string concatenation CONCAT
<!--模糊查询--> <select id="selectByLike1" resultType="com.liuwenwu.model.Book" parameterType="java.lang.String"> select * from t_mvc_book where bname like #{bname} </select> <select id="selectByLike2" resultType="com.liuwenwu.model.Book" parameterType="java.lang.String"> select * from t_mvc_book where bname like '${bname}' </select> <select id="selectByLike3" resultType="com.liuwenwu.model.Book" parameterType="java.lang.String"> select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%') </select>
List<Book> selectByLike1(@Param("bname")String bname); List<Book> selectByLike2(@Param("bname")String bname); List<Book> selectByLike3(@Param("bname")String bname);
test
@Test public void selectByLike() { // List<Book> books = this.bookService.selectByLike1(StringUtil.toLikeStr("圣墟")); // List<Book> books = this.bookService.selectByLike2("%圣墟% or bid !=1"); List<Book> books = this.bookService.selectByLike3("圣墟"); for (Book b : books){ System.out.println(b); } }
result:
3. Query processing returns result sets
resultMap: suitable return value is the case where the custom entity class
resultType: suitable return value data type of non-custom, i.e. of the type provided jdk
3.1 resultMap return custom type set
3.2 resultType return List <T>
3.3 resultType return a single object
3.4 resultType return List <Map>, the result set returned applies to multi-table query
3.5 Use resultType return to Map <String, Object>, for multi-table queries return a single result set
<!--3、查询返回结果集的处理--> <select id="list1" resultMap="BaseResultMap"> select * from t_mvc_book </select> <select id="list2" resultType="com.liuwenwu.model.Book"> select * from t_mvc_book </select> <select id="list3" resultType="com.liuwenwu.model.Book" parameterType="com.liuwenwu.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" parameterType="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>
// 3.1 使用resultMap返回自定义类型集合 List<Book> list1(); // 3.2 使用resultType返回List<T> List<Book> list2(); // 3.3 使用resultType返回单个对象 Book list3(BookVo bookVo); // 3.4 使用resultType返回List<Map>,适用于多表查询返回结果集 List<Map> list4(Map map); // 3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集 Map list5(Map map);
测试:
@Test public void list() { // 返回一个resultMap但是使用list<T>接收 // List<Book> books = this.bookService.list1(); // 返回的是resulttype使用list<T>接收 // List<Book> books = this.bookService.list2(); // 返回的是resulttype使用list<T>接收 // for (Book b : books){ // System.out.println(b); // } // 返回的是resulttype使用T接收 // BookVo bookVo =new BookVo(); // List list = new ArrayList(); // list.add(2); // bookVo.setBookIds(list); // Book book = this.bookService.list3(bookVo); // System.out.println(book); // 返回的是resulttype使用list<Map>接收 Map map =new HashMap(); // map.put("bname",StringUtil.toLikeStr("圣墟")); // List<Map> list = this.bookService.list4(map); // for (Map m : list) { // System.out.println(m); // } // 返回的是resulttype使用Map接收 map.put("bid",2); Map m = this.bookService.list5(map); System.out.println(m); }
结果:
4.分页查询
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
使用分页插件步奏
1、导入pom依赖
2、Mybatis.cfg.xml配置拦截器
3、使用PageHelper进行分页
4、处理分页结果
Pom依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
Mybatis.cfg.xml配置拦截器
<plugins> <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> </plugin> </plugins>
<select id="list4" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book <where> <if test="null != bname and bname !=''"> and bname like #{bname} </if> </where> </select>
@Override public List<Map> listPager(Map map, PageBean pageBean) { if(pageBean!=null && pageBean.isPagination()){ PageHelper.startPage(pageBean.getPage(),pageBean.getRows()); } List<Map> list = this.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",StringUtil.toLikeStr("圣墟")); PageBean pageBean =new PageBean(); pageBean.setPage(3); // pageBean.setPagination(false); List<Map> list = this.bookService.listPager(map, pageBean); for (Map m : list) { System.out.println(m); } }
结果:
5.特殊字符处理
>(>)
<(<)
&(&)
空格( )
<![CDATA[ <= ]]>
<select id="list6" resultType="java.util.Map" parameterType="com.liuwenwu.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.liuwenwu.model.BookVo"> select * from t_mvc_book <where> <if test="null != min and min !=''"> <![CDATA[ and price > #{min} ]]> </if> <if test="null != max and max !=''"> <![CDATA[ and price < #{max} ]]> </if> </where> </select>
// 特殊字符的处理方式 List<Map> list6(BookVo bookVo); List<Map> list7(BookVo bookVo);
测试:
@Test public void listSpecoal() { BookVo bookVo =new BookVo(); bookVo.setMin(100.0); bookVo.setMax(500.0); // List<Map> list = this.bookService.list6(bookVo); List<Map> list = this.bookService.list7(bookVo); for (Map map : list) { System.out.println(map); } }
相关代码
PageBean 分页工具类
package com.liuwenwu.util; 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 + "]"; } }
Bookvo
vo用来存放包括数据库表映射的字段以及多余的查询条件所需属性列,保证实体类纯粹,降低耦合度
package com.liuwenwu.model; import java.util.List; /** * @author LWW * @site www.lww.com * @company * @create 2019-09-20 19:05 * vo用来存放包括数据库表映射的字段以及多余的查询条件所需属性列 */ public class BookVo extends Book{ private List<String> bookIds; private Double min; private Double max; public Double getMax() { return max; } public void setMax(Double max) { this.max = max; } public Double getMin() { return min; } public void setMin(Double min) { this.min = min; } public List<String> getBookIds() { return bookIds; } public void setBookIds(List<String> bookIds) { this.bookIds = bookIds; } }
BookService
package com.liuwenwu.service; import com.liuwenwu.model.Book; import com.liuwenwu.model.BookVo; import com.liuwenwu.util.PageBean; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * @author LWW * @site www.lww.com * @company * @create 2019-09-19 22:23 */ public interface BookService { int deleteByPrimaryKey(Integer bid); int insert(Book record); int insertSelective(Book record); Book selectByPrimaryKey(Integer bid); int updateByPrimaryKeySelective(Book record); int updateByPrimaryKey(Book record); List<Book> selectByIn(List bookIds); List<Book> selectByLike1(String bname); List<Book> selectByLike2(String bname); List<Book> selectByLike3(String bname); List<Book> list1(); List<Book> list2(); Book list3(BookVo bookVo); List<Map> list4(Map map); Map list5(Map map); List<Map> listPager(Map map, PageBean pageBean); List<Map> list6(BookVo bookVo); List<Map> list7(BookVo bookVo); }
BookServiceImpl
package com.liuwenwu.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.liuwenwu.mapper.BookMapper; import com.liuwenwu.model.Book; import com.liuwenwu.model.BookVo; import com.liuwenwu.service.BookService; import com.liuwenwu.util.PageBean; import java.util.List; import java.util.Map; /** * @author LWW * @site www.lww.com * @company * @create 2019-09-19 22:58 */ public class BookServiceImpl implements BookService { private BookMapper bookMapper; public BookMapper getBookMapper() { return bookMapper; } public void setBookMapper(BookMapper bookMapper) { this.bookMapper = bookMapper; } @Override public int deleteByPrimaryKey(Integer bid) { return bookMapper.deleteByPrimaryKey(bid); } @Override public int insert(Book record) { return bookMapper.insert(record); } @Override public int insertSelective(Book record) { return bookMapper.insertSelective(record); } @Override public Book selectByPrimaryKey(Integer bid) { return bookMapper.selectByPrimaryKey(bid); } @Override public int updateByPrimaryKeySelective(Book record) { return bookMapper.updateByPrimaryKeySelective(record); } @Override public int updateByPrimaryKey(Book record) { return bookMapper.updateByPrimaryKey(record); } @Override public List<Book> selectByIn(List bookIds) { return bookMapper.selectByIn(bookIds); } @Override public List<Book> selectByLike1(String bname) { return bookMapper.selectByLike1(bname); } @Override public List<Book> selectByLike2(String bname) { return bookMapper.selectByLike2(bname); } @Override public List<Book> selectByLike3(String bname) { return bookMapper.selectByLike3(bname); } @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(Map map) { return bookMapper.list4(map); } @Override public Map list5(Map map) { return bookMapper.list5(map); } @Override public List<Map> listPager(Map map, PageBean pageBean) { if(pageBean!=null && pageBean.isPagination()){ PageHelper.startPage(pageBean.getPage(),pageBean.getRows()); } List<Map> list = this.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; } @Override public List<Map> list6(BookVo bookVo) { return bookMapper.list6(bookVo); } @Override public List<Map> list7(BookVo bookVo) { return bookMapper.list7(bookVo); } }