目标及项目目录结构

目标

1、mybatis动态sql
2、模糊查询
3、查询返回结果集的处理
4、分页查询
5、特殊字符处理

项目的目录结构

1.mybatis动态sql

If、trim、foreach

1.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中的配置标签:
**

<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">select * from t_mvc_book<where><if test="bname!=null and bname!=''">bname like #{bname}</if></where></select>

第三步 :加入方法到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中的配置标签:
两种形式,注释了一种 测试时替换一下就好了

<!--或者是 select * from t_mvc_book where <![CDATA[ price >#{min} and price <#{max} ]]>--><select id="list6" resultType="com.xiaoqing.model.Book" parameterType="com.xiaoqing.model.BookVo">select * from t_mvc_book where price &gt; #{min} and price &lt; #{max}</select>

第三步 :加入方法到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分页及特殊字符处理...相关推荐

  1. 动态sql模糊查询和分页

    文章目录 动态sql 模糊查询 查询返回结果集的处理 分页 动态sql BookMapper xml bookservice 测试: MapperSql.test 运行: 模糊查询 BookMappe ...

  2. iBatis 动态SQL别名查询结果为Null问题

    iBatis 动态SQL别名查询结果为Null问题 在项目中使用了iBatis,使用xml方便的维护SQL,清晰明了,偶然发现动态拼接的SQL语句在数据中执行很好的返回结果,而到了程序中总是有字段返回 ...

  3. MyBatis——占位符,转义字符,多元素查询(模糊查询),动态sql(多条件中多查询,多条件中单查询)

    占位符:${},#{} ${}:充当占位符时,无法防止sql注入,纯纯的外面给啥,他就往上放啥 #{}:充当-,可以防止sql注入 实体类: package com.itjh.pojo;public ...

  4. 动态SQL 模糊查询 联表查询

    1. 正文 1. set标签 和 foreach标签 trim标签 sql片段 2. mybatis映射文件处理特殊字符. 3. mybatis完成模糊查询. 4. 联表查询 2. 动态sql 2.1 ...

  5. mybatis collection标签_MyBatis第二天(结果映射+动态sql+关联查询)

    笑不出莱:MyBatis第一天(介绍+文件配置+Mapper动态代理)​zhuanlan.zhihu.com 一.导包+配置文件+pojo类 1.jar包:mybatis的核心包和依赖包+连接数据库的 ...

  6. mybatis动态sql模糊查询方法

    动态SQL可以省略很多拼接SQL的步骤,使用类似于JSTL方式. 方式1 : <select id="queryBlogIf" resultType="blog&q ...

  7. mybatis02映射动态sql关联查询spring整合mybatis

    2019独角兽企业重金招聘Python工程师标准>>> 输入映射和输出映射: 动态sql: 关联查询_一对一: 关联查询_一对多: 一对一,一对多操作的区别: 一对一,resultM ...

  8. 长sql和短sql加java区别_Mybatis下动态sql中##和$$的区别讲解

    一.介绍 mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user ...

  9. MyBatis 实践 -动态SQL/关联查询

    MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...

最新文章

  1. 2. 把一幅图像进行平移。
  2. Power Designer使用技巧
  3. python把光标定义到指定的位置并删除之前的字符_python 批量修改预定字符串并将修改后的字符串插入文件指定位置...
  4. .NET开发系列工具之NDoc:让NDoc支持简体中文!(含修改了的源代码)
  5. 7.多媒体☞图像图形拍照
  6. python中变量和函数的区别_关于python中带下划线的变量和函数 的意义
  7. 高可用集群 heartbeatv1实例
  8. 数据库:MySQL和MariaDB的JDBC连接
  9. 【转】Oracle 系统权限详细列表
  10. Kafka Producer生产者原理
  11. OrCAD的下载与安装的详细步骤
  12. Python 操作 DB2 库_亲测可用
  13. cpu在计算机系统中的地位和作用是什么,电脑的核心-中央处理器(CPU)及其在游戏中的作用...
  14. 淘宝直播详细开通方法
  15. SQL注入-显错注入
  16. android ssl双向验证 X509证书信任管理器类的实现及应用
  17. Python#Typora-Python笔记
  18. 计算机开机后无法网络拨号怎样处理,拨号上网时电脑假死的原因和解决方法
  19. iOS循环引用问题集合、内存泄漏、僵尸对象、代码静态分析
  20. 电气转行嵌入式还是java_19 届 985 毕业生想从电气行业转行到 IT 行业,你们怎么看?...

热门文章

  1. Flask abort
  2. C语言之随机数和字符串输入输出
  3. Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)...
  4. TYVJ 2002 扑克牌 题解
  5. C#的winform拼数字游戏
  6. Gimmie — 一个创新的 GNOME 面板按次
  7. 光脚丫学LINQ(002):筛选数据
  8. 华表 单元格公式设定与计算
  9. 快来看看Google出品的Protocol Buffer,别仅仅会用Json和XML了
  10. Fedora升级到4.3.4内核后virtualbox执行/sbin/rcvboxdrv setup报Bad argument setup