c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...
目標及項目目錄結構
目標
1、mybatis動態sql2、模糊查詢
3、查詢返回結果集的處理
4、分頁查詢
5、特殊字符處理
項目的目錄結構
1.mybatis動態sql
If、trim、foreach1.1 if、trim標簽(了解即可)
trim是用來去空格用的,if是用來判斷屬性是否為空,是否要拼接sql語句
<insert id="insertSelective" parameterType="com.xiaoqing.model.Book" >insert into t_mvc_book<trim prefix="(" suffix=")" suffixOverrides="," ><if test="bid != null" >bid,</if><if test="bname != null" >bname,</if><if test="price != null" >price,</if></trim><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=REAL},</if></trim></insert>1.2 foreach標簽(測試此標簽效果的流程)
第一步 :BookMapper.java中的方法:
/*測試foreach標簽方法的dao層*/ List<Book> selectBooksIn(@Param("bookIds") List bookIds);第二步 :BookMapper.xml中的配置標簽:
parameterType:參數的類型collection:參數的變量
item :遍歷的指針
open:左開區間打開
close:右開區間關閉
separator:中間的分隔符
#{bid}:指針的值<!--講解foreach 標簽--><select id="selectBooksIn" resultType="com.xiaoqing.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>
第三步 :加入方法到BookService.java接口類中:
/*測試foreach標簽方法的業務邏輯層*/List<Book> selectBooksIn(List bookIds);第四步 :在BookServiceImpl.java實現類中實現此方法:
@Overridepublic List<Book> selectBooksIn(List bookIds) {return bookMapper.selectBooksIn(bookIds);}第五步 :在BookServiceImplTest.java測試類中測試此方法:
/*測試foreach標簽的測試方法*/@Testpublic void selectBooksIn(){List bookIds=new ArrayList();bookIds.add(1);bookIds.add(4);bookIds.add(5);for (Book book : this.bookService.selectBooksIn(bookIds)) {System.out.println(book);}}第六步 :數據庫中的數據
第七步 :測試的結果:查詢bid編號為1,4,5的數據信息
2.模糊查詢
2.1 語法
第一種形式:#{…}(常用)第二種形式:${…}(動態列需要用到,比如下拉框查詢,按價格或者作者這些列字段進行查詢)
第三種形式:Concat
注意:#{…}自帶引號,${…}有sql注入的風險
2.2 做一個案例
第一步 :BookMapper.java中的方法:
/*測試模糊查詢方法一:#{...}形式*/List<Book> selectBookLike1(@Param("bname")String bname);/*測試模糊查詢方法二:${…}形式*/List<Book> selectBookLike2(@Param("bname")String bname);/*測試模糊查詢方法三:Concat形式*/List<Book> selectBookLike3(@Param("bname")String bname);第二步 :BookMapper.xml中的配置標簽:
<!--測試模糊查詢方法一:#{...}形式--><select id="selectBookLike1" resultType="com.xiaoqing.model.Book" parameterType="java.lang.String">select * from t_mvc_book<where>bname like #{bname}</where></select><!--測試模糊查詢方法二:${…}形式 需要帶引號--><select id="selectBookLike2" resultType="com.xiaoqing.model.Book" parameterType="java.lang.String">select * from t_mvc_book<where>bname like '${bname}'</where></select><!--測試模糊查詢方法三:Concat形式--><select id="selectBookLike3" resultType="com.xiaoqing.model.Book" parameterType="java.lang.String">select * from t_mvc_book<where>bname like concat('%',#{bname},'%')</where></select>第三步 :加入方法到BookService.java接口類中:
List<Book> selectBookLike1(String bname);List<Book> selectBookLike2(String bname);List<Book> selectBookLike3(String bname);第四步 :在BookServiceImpl.java實現類中實現此方法:
@Overridepublic List<Book> selectBookLike1(String bname) {return bookMapper.selectBookLike1(bname);}@Overridepublic List<Book> selectBookLike2(String bname) {return bookMapper.selectBookLike2(bname);}@Overridepublic List<Book> selectBookLike3(String bname) {return bookMapper.selectBookLike3(bname);}第五步 :在BookServiceImplTest.java測試類中測試此方法:
/*測試模糊查詢的三種形式*/@Testpublic void selectBookLike(){/*for (Book book : this.bookService.selectBookLike1("%而%")) {System.out.println(book);}*//*for (Book book : this.bookService.selectBookLike2("%而%")) {System.out.println(book);}*/for (Book book : this.bookService.selectBookLike3("而")) {System.out.println(book);}}第六步 :數據庫中的數據
第七步 :測試的結果:查詢bname書名中含有“而”字的數據信息
3.查詢返回結果集的處理
3.1 語法
resultMap:
適合使用返回值是自定義實體類的情況(可以理解為將實體類進行了二次包裝和處理)resultType:
適合使用返回值的數據類型是非自定義的,即jdk的提供的類型(可以理解為是自己寫的實體類沒有經過任何的包裝和處理的)3.1.1 使用resultMap返回自定義類型集合3.1.2 使用resultType返回List<T>3.1.3 使用resultType返回單個對象3.1.4 使用resultType返回List<Map>,適用于多表查詢返回結果集3.1.5 使用resultType返回Map<String,Object>,適用于多表查詢返回單個結果集3.2 案例(用來測試)
首先再建一個BookVo(V:view,o:object)實體類用于多表查詢返回一個集合:
/*** @author 晴sister* @site https://blog.csdn.net/men_ma* @company* @create 2020-10-1020:21** vo類專門用來封裝多表聯查信息用于展示的* 也可用于封裝查詢條件*/ public class BookVo extends Book{private List<Integer> bookIds;public List<Integer> getBookIds() {return bookIds;}public void setBookIds(List<Integer> bookIds) {this.bookIds = bookIds;} }第一步 :BookMapper.java中的方法:
/*查詢多條數據返回的是map自定義集合:使用resultMap返回自定義類型集合*/List<Book> list1();/* 使用resultType返回List<T>*/List<Book> list2();/*使用resultType返回Map<String,Object>,適用于多表查詢返回單個結果集*/List<Book> list3(BookVo bookVo);/*直接返回map集合,有多少個鍵都可取,常用*/List<Map> list4();/*查詢單個結果集,常用*/Map list5(Map map);第二步 :BookMapper.xml中的配置標簽:
<select id="list1" resultMap="BaseResultMap">select * from t_mvc_book</select><select id="list2" resultType="com.xiaoqing.model.Book">select * from t_mvc_book</select><select id="list3" resultType="com.xiaoqing.model.Book" parameterType="com.xiaoqing.model.BookVo">select * from t_mvc_book where bid in<foreach collection="bookIds" item="bid" open="(" close=")" separator=",">#{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>第三步 :加入方法到BookService.java接口類中:
List<Book> list1();List<Book> list2();List<Book> list3(BookVo bookVo);List<Map> list4();Map list5(Map map);第四步 :在BookServiceImpl.java實現類中實現此方法:
@Overridepublic List<Book> list1() {return bookMapper.list1();}@Overridepublic List<Book> list2() {return bookMapper.list2();}@Overridepublic List<Book> list3(BookVo bookVo) {return bookMapper.list3(bookVo);}@Overridepublic List<Map> list4() {return bookMapper.list4();}@Overridepublic Map list5(Map map) {return bookMapper.list5(map);}第五步 :在BookServiceImplTest.java測試類中測試此方法:
@Testpublic void list1(){for (Book book : this.bookService.list1()) {System.out.println(book);}}@Testpublic void list2(){for (Book book : this.bookService.list2()) {System.out.println(book);}}@Testpublic void list3(){BookVo bookVo=new BookVo();List bookIds=new ArrayList();bookIds.add(6);bookIds.add(9);bookIds.add(4);bookVo.setBookIds(bookIds);for (Book book : this.bookService.list3(bookVo)) {System.out.println(book);}}@Testpublic void list4(){//常用for (Map map : this.bookService.list4()) {System.out.println(map);}}@Testpublic void list5(){//常用Map map=new HashMap();map.put("bid",6);System.out.println(this.bookService.list5(map));}第六步 :數據庫中的數據
第七步 :測試的結果:查詢各個結果集的數據信息
4.分頁查詢
4.1 語法
為什么要重寫mybatis的分頁?Mybatis的分頁功能很弱,它是基于內存的分頁(查出所有記錄再按偏移量offset和邊界limit取結果),在大數據量的情況下這樣的分頁基本上是沒有用的
使用分頁插件步奏
1、導入pom依賴
2、Mybatis.cfg.xml配置攔截器
3、使用PageHelper進行分頁
4、處理分頁結果
4.2 分頁的準備工作
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>pageBean的工具類:
package com.xiaoqing.utils;import java.util.HashMap; import java.util.Map;import javax.servlet.http.HttpServletRequest;/*** 分頁工具類**/ public class PageBean {private int page = 1;// 當前頁碼private int rows = 5;// 頁大小private int total = 0;//總記錄數//上一次查詢的urlprivate String url;//上一次查詢所攜帶的查詢條件private Map<String, String[]> parameterMap=new HashMap<String, String[]>();//對pagebean進行初始化public void setRequest(HttpServletRequest req) {//初始化jsp頁面傳遞過來的當前頁this.setPage(req.getParameter("page"));//初始化jsp頁面傳遞過來的頁大小this.setRows(req.getParameter("rows"));//初始化jsp頁面 傳遞過來是否分頁this.setPagination(req.getParameter("pagination"));//保留上一次的查詢請求this.setUrl(req.getRequestURL().toString());//保留上一次的查詢條件this.setParameterMap(req.getParameterMap());}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Map<String, String[]> getParameterMap() {return parameterMap;}public void setParameterMap(Map<String, String[]> parameterMap) {this.parameterMap = parameterMap;}private void setPage(String page) {if(StringUtils.isNotBlank(page)) {this.setPage(Integer.valueOf(page));}}private void setRows(String rows) {if(StringUtils.isNotBlank(rows)) {this.setRows(Integer.valueOf(rows));}}private void setPagination(String pagination) {//只有填了false字符串,才代表不分頁this.setPagination(!"false".equals(pagination));;}private boolean pagination = true;// 是否分頁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;}@Overridepublic String toString() {return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";}//上一頁public int getPrevPage() {return this.page>1?this.page-1:this.page;}//下一頁public int getNextPage() {return this.page<this.getMaxPage()?this.page+1:this.page;}//最大頁public int getMaxPage() {return this.total%this.rows==0?this.total/this.rows:(this.total/this.rows)+1;}}StringUtils工具類:附屬pagebean工具類
package com.xiaoqing.utils;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);}}4.3 案例(測試)
第一步 :BookMapper.java中的方法:
// select * from t_mvc_book where bname like '%而%' limit 20,10List<Map> listPager(Map map);**第二步 :BookMapper.xml中的配置標簽:
**
第三步 :加入方法到BookService.java接口類中:
List<Map> listPager(Map map, PageBean pageBean);第四步 :在BookServiceImpl.java實現類中實現此方法:
@Overridepublic 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;}第五步 :在BookServiceImplTest.java測試類中測試此方法:
@Testpublic void listPager(){Map map=new HashMap();map.put("bname","%而%");PageBean pageBean=new PageBean(); // 設置是否分頁 // pageBean.setPagination(false); // 查詢第幾頁的數據pageBean.setPage(2);for (Map m : this.bookService.listPager(map, pageBean)) {System.out.println(m);}}第六步 :數據庫中的數據
第七步 :測試的結果:查詢分頁效果的數據信息
5.特殊字符處理
5.1 語法
(>)<(<)
&(&)
空格( )
<![CDATA[ <= ]]>
5.2 準備工作(BookVo.java實體類添加兩個屬性)
package com.xiaoqing.model;import java.util.List;/*** @author 晴sister* @site https://blog.csdn.net/men_ma* @company* @create 2020-10-1020:21** vo類專門用來封裝多表聯查信息用于展示的* 也可用于封裝查詢條件*/ public class BookVo extends Book{private List<Integer> bookIds;private Float min;private Float max;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;} }5.3 案例(測試)
第一步 :BookMapper.java中的方法:
List<Book> list6(BookVo bookVo);第二步 :BookMapper.xml中的配置標簽:
兩種形式,注釋了一種 測試時替換一下就好了
第三步 :加入方法到BookService.java接口類中:
List<Book> list6(BookVo bookVo);第四步 :在BookServiceImpl.java實現類中實現此方法:
@Overridepublic List<Book> list6(BookVo bookVo) {return bookMapper.list6(bookVo);}第五步 :在BookServiceImplTest.java測試類中測試此方法:
@Testpublic void list6(){BookVo bookVo=new BookVo();bookVo.setMax(35f);bookVo.setMin(21f);for (Book book : this.bookService.list6(bookVo)) {System.out.println(book);}}第六步 :數據庫中的數據
第七步 :測試的結果:查詢特殊字符處理的數據信息
原文作者:不怕報錯 就怕不報錯的小猿猿
原文鏈接:https://segmentfault.com/a/1190000023961648
原文出處:CSDN
總結
以上是生活随笔為你收集整理的c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天线开路短路检测原理_变频空调通讯电路原
- 下一篇: cad怎么查找未闭合_CAD无法填充的这