• Mybatis之动态sql、模糊查询、查询返回结果集的处理、分页查询与特殊字符处理


    目录

    一、Mybatis 动态sql

    Foreach标签

    二、模糊查询(3种方式)

    参数中直接加入%%(#{...})

    使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)

    #{...}与${...}区别?

    SQL字符串拼接CONCAT

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

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

    使用resultType返回List 

    使用resultType返回单个对象

     使用resultType返回List,适用于多表查询返回结果集

     使用resultType返回Map,适用于多表查询返回单个结果集 ,object>

    四、分页查询

    为什么要重写mybatis的分页?

    使用分页插件步奏

    导入分页相关的pom依赖

     Mybatis.cfg.xml配置拦截器

    使用分页插件

    五、特殊字符处理 


    一、Mybatis 动态sql

    Foreach标签

    创建一个数组,再用Foreach遍历

    1. @Test
    2. public void Test() {
    3. int [] ints={1,2,3,4,5,6};
    4. //将数据变成字符串
    5. StringBuffer sb=new StringBuffer();
    6. for (int i:ints){
    7. sb.append(",").append(i);
    8. }
    9. String s=sb.toString();
    10. System.out.println(s.substring(1));
    11. }

     可以看到,我们此时代码没问题,可如果我们把数组里的值删掉呢?

    1. @Test
    2. public void Test() {
    3. int [] ints={};
    4. //将数据变成字符串
    5. StringBuffer sb=new StringBuffer();
    6. for (int i:ints){
    7. sb.append(",").append(i);
    8. }
    9. String s=sb.toString();
    10. System.out.println(s.substring(1));
    11. }

     报下标越界异常了,可以发现,代码写到这里还有点小复杂。这时Mybatis提供了一个foreach标签,我们只管传值就完了

    PermissionMapper.xml

    1. <select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
    2. select
    3. <include refid="Base_Column_List"/>
    4. from t_easyui_permission
    5. where id in
    6. <foreach collection="permissionIds" open="(" close=")" separator="," item="id">
    7. #{id}
    8. foreach>
    9. select>
    PermissionBiz
     List selectByIn(List permissionIds);
    PermissionMapper
    1. //通过in关键字进行查询,讲解foreach 标签的使用
    2. //如果说参数 是 非实体类(Permission,Meeting,...) 那么记得加上注解 @param,permissionIds是对应collection属性的
    3. List selectByIn(@Param("permissionIds") List permissionIds);
    PermissionBizImpl
    1. @Override
    2. public List selectByIn(List permissionIds) {
    3. return permission.selectByIn(permissionIds);
    4. }
    PermissionBizImplTest
    1. @Test
    2. public void selectByIn() {
    3. /*permissionIds*/
    4. permissionBiz.selectByIn(Arrays.asList(new Long[]{1L, 2L, 3L, 4L})).forEach(System.out::println);
    5. }

    二、模糊查询(3种方式)

    参数中直接加入%%(#{...})

    PermissionMapper.xml

    1. <select id="selectPermissoonLike1" resultType="com.oyang.model.Permission" parameterType="java.lang.String">
    2. select * from t_easyui_permission where name like #{name}
    3. select>

    PermissionMapper

        List selectPermissoonLike1(@Param("name") String name);
    

    PermissionBiz

        public List selectPermissoonLike1(String name);
    
    PermissionBizImpl
    1. @Override
    2. public List selectPermissoonLike1(String name) {
    3. return permission.selectPermissoonLike1(name);
    4. }

     测试

    1. @Test
    2. public void selectPermissoonLike1() {
    3. permissionBiz.selectPermissoonLike1("%架%").forEach(System.out::println);
    4. }

     

    使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)

     PermissionMapper.xml

    1. <select id="selectPermissoonLike2" resultType="com.oyang.model.Permission" parameterType="java.lang.String">
    2. select * from t_easyui_permission where name like '${name}'
    3. select>

    PermissionMapper

        List selectPermissoonLike2(@Param("name") String name);

    PermissionBiz

    public List selectPermissoonLike2(String name);

    PermissionBizImpl

    1. @Override
    2. public List selectPermissoonLike2(String name) {
    3. return permission.selectPermissoonLike2(name);
    4. }

     测试

    1. @Test
    2. public void selectPermissoonLike2() {
    3. permissionBiz.selectPermissoonLike2("%架%").forEach(System.out::println);
    4. }

     

    #{...}与${...}区别?

    参数类型为字符串,#会在前后加单引号['],$则直接插入值

    1) mybatis中使用OGNL表达式传递参数
    2) 优先使用#{...}
    3) ${...}方式存在SQL注入风险 

    SQL字符串拼接CONCAT

    PermissionMapper.xml

    1. <select id="selectPermissoonLike3" resultType="com.oyang.model.Permission" parameterType="java.lang.String">
    2. select * from t_easyui_permission where name like concat(concat('%',#{name}),'%')
    3. select>

    PermissionMapper

    List selectPermissoonLike3(@Param("name") String name);

    PermissionBiz

     public  List selectPermissoonLike3(String name);

    PermissionBizImpl

    1. @Override
    2. public List selectPermissoonLike3(String name) {
    3. return permission.selectPermissoonLike3(name);
    4. }

     测试

    1. public void selectPermissoonLike3() {
    2. permissionBiz.selectPermissoonLike3("架").forEach(System.out::println);
    3. }

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

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

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

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

     PermissionMapper.xml

    1. <select id="list1" resultMap="BaseResultMap">
    2. select * from t_easyui_permission
    3. select>

    PermissionMapper

    List list1();

    PermissionBiz

    List list1();

    PermissionBizImpl

    1. @Override
    2. public List list1() {
    3. return permission.list1();
    4. }

    测试

    1. @Test
    2. public void list1() {
    3. permissionBiz.list1().forEach(System.out::println);
    4. }

    使用resultType返回List 

     PermissionMapper.xml

    1. <select id="list2" resultType="com.oyang.model.Permission">
    2. select * from t_easyui_permission
    3. select>

    PermissionMapper

    List list2();

    PermissionBiz

    List list2();

    PermissionBizImpl

    1. @Override
    2. public List list2() {
    3. return permission.list2();
    4. }

    测试

    1. @Test
    2. public void list2() {
    3. permissionBiz.list2().forEach(System.out::println);
    4. }

    list1()、list2()的结论是,对于单表而言,可以用ResultMap/ResultType接收,但是多表必须用ResultMap接收 

    使用resultType返回单个对象

     PermissionMapper.xml

    1. <select id="list3" resultType="com.oyang.model.Permission" parameterType="com.oyang.model.PermissionVo">
    2. select * from t_easyui_permission
    3. where id in
    4. <foreach collection="permissionIds" open="(" close=")" separator="," item="id">
    5. #{id}
    6. foreach>
    7. select>

    PermissionVo

    1. package com.oyang.model;
    2. import java.util.List;
    3. /**
    4. * @author oyang
    5. * @site https://blog.csdn.net
    6. * @qq 1828190940
    7. * @create  2022-08-12 11:42
    8. */
    9. public class PermissionVo extends Permission{
    10. private List permissionIds;
    11. public List getPermissionIds() {
    12. return permissionIds;
    13. }
    14. public void setPermissionIds(List permissionIds) {
    15. this.permissionIds = permissionIds;
    16. }
    17. }

    PermissionMapper

    1. //如果要传入多个查询参数,必须以对象的方式进行传递
    2. List list3(PermissionVo Vo);

    PermissionBiz

     List list3(PermissionVo Vo);

    PermissionBizImpl

    1. @Override
    2. public List list3(PermissionVo Vo) {
    3. return permission.list3(Vo);
    4. }

    测试

    1. @Test
    2. public void list3() {
    3. PermissionVo vo=new PermissionVo();
    4. vo.setPermissionIds(Arrays.asList(new long[]{1L,2L,3L,4L}));
    5. permissionBiz.list3(vo).forEach(System.out::println);
    6. }

     使用resultType返回List,适用于多表查询返回结果集

     PermissionMapper.xml

    PermissionMapper

        List list4();

    PermissionBiz

    List list4();

    PermissionBizImpl

    1. @Override
    2. public List list4() {
    3. return permission.list4();
    4. }

    测试

    1. @Test
    2. public void list4() {
    3. permissionBiz.list4().forEach(System.out::println);
    4. }

     使用resultType返回Map,适用于多表查询返回单个结果集 

     PermissionMapper.xml

    PermissionMapper

     Map list5(Map map);

    PermissionBiz

    Map list5(Map map);

    PermissionBizImpl

    1. @Override
    2. public Map list5(Map map) {
    3. return permission.list5(map);
    4. }

    测试

    1. @Test
    2. public void list5() {
    3. Map map=new HashMap();
    4. map.put("id",1);
    5. System.out.println(permissionBiz.list5(map));
    6. }

    说明不管返回一条数据,还是多条数据,都应该用java.util.Map进行接收-->

  • <plugin interceptor="com.github.pagehelper.PageInterceptor">
  • plugin>
  •  注意:拦截器要放在运行环境上面

    使用分页插件

     PermissionMapper.xml

    1. <select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
    2. select * from t_easyui_permission where name like concat(concat('%',#{name}),'%')
    3. select>

    PageBean

    1. package com.oyang.util;
    2. import javax.servlet.http.HttpServletRequest;
    3. import java.io.Serializable;
    4. import java.util.Map;
    5. public class PageBean implements Serializable {
    6. private static final long serialVersionUID = 2422581023658455731L;
    7. //页码
    8. private int page=1;
    9. //每页显示记录数
    10. private int rows=10;
    11. //总记录数
    12. private int total=0;
    13. //是否分页
    14. private boolean isPagination=true;
    15. //上一次的请求路径
    16. private String url;
    17. //获取所有的请求参数
    18. private Map map;
    19. public PageBean() {
    20. super();
    21. }
    22. //设置请求参数
    23. public void setRequest(HttpServletRequest req) {
    24. String page=req.getParameter("page");
    25. String rows=req.getParameter("rows");
    26. String pagination=req.getParameter("pagination");
    27. this.setPage(page);
    28. this.setRows(rows);
    29. this.setPagination(pagination);
    30. this.url=req.getContextPath()+req.getServletPath();
    31. this.map=req.getParameterMap();
    32. }
    33. public String getUrl() {
    34. return url;
    35. }
    36. public void setUrl(String url) {
    37. this.url = url;
    38. }
    39. public Map getMap() {
    40. return map;
    41. }
    42. public void setMap(Map map) {
    43. this.map = map;
    44. }
    45. public int getPage() {
    46. return page;
    47. }
    48. public void setPage(int page) {
    49. this.page = page;
    50. }
    51. public void setPage(String page) {
    52. if(null!=page&&!"".equals(page.trim()))
    53. this.page = Integer.parseInt(page);
    54. }
    55. public int getRows() {
    56. return rows;
    57. }
    58. public void setRows(int rows) {
    59. this.rows = rows;
    60. }
    61. public void setRows(String rows) {
    62. if(null!=rows&&!"".equals(rows.trim()))
    63. this.rows = Integer.parseInt(rows);
    64. }
    65. public int getTotal() {
    66. return total;
    67. }
    68. public void setTotal(int total) {
    69. this.total = total;
    70. }
    71. public void setTotal(String total) {
    72. this.total = Integer.parseInt(total);
    73. }
    74. public boolean isPagination() {
    75. return isPagination;
    76. }
    77. public void setPagination(boolean isPagination) {
    78. this.isPagination = isPagination;
    79. }
    80. public void setPagination(String isPagination) {
    81. if(null!=isPagination&&!"".equals(isPagination.trim()))
    82. this.isPagination = Boolean.parseBoolean(isPagination);
    83. }
    84. /**
    85. * 获取分页起始标记位置
    86. * @return
    87. */
    88. public int getStartIndex() {
    89. //(当前页码-1)*显示记录数
    90. return (this.getPage()-1)*this.rows;
    91. }
    92. /**
    93. * 末页
    94. * @return
    95. */
    96. public int getMaxPage() {
    97. int totalpage=this.total/this.rows;
    98. if(this.total%this.rows!=0)
    99. totalpage++;
    100. return totalpage;
    101. }
    102. /**
    103. * 下一页
    104. * @return
    105. */
    106. public int getNextPage() {
    107. int nextPage=this.page+1;
    108. if(this.page>=this.getMaxPage())
    109. nextPage=this.getMaxPage();
    110. return nextPage;
    111. }
    112. /**
    113. * 上一页
    114. * @return
    115. */
    116. public int getPreivousPage() {
    117. int previousPage=this.page-1;
    118. if(previousPage<1)
    119. previousPage=1;
    120. return previousPage;
    121. }
    122. @Override
    123. public String toString() {
    124. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
    125. + "]";
    126. }
    127. }

    PermissionMapper

    List listPager(Map map, PageBean pageBean);

    PermissionBiz

    List listPager(Map map, PageBean pageBean);

    PermissionBizImpl

    1. @Override
    2. public List listPager(Map map, PageBean pageBean) {
    3. //分页插件相关的代码
    4. if(pageBean!=null&&pageBean.isPagination()){
    5. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    6. }
    7. List maps = permission.listPager(map);
    8. if(pageBean!=null&&pageBean.isPagination()){
    9. //处理查询结果的前提:是需要分页的
    10. PageInfo info=new PageInfo(maps);
    11. pageBean.setTotal(info.getTotal()+"");
    12. }
    13. return maps;
    14. }

    测试

    1. @Test
    2. public void listPager() {
    3. Map map=new HashMap();
    4. map.put("name","架");
    5. // permissionBiz.listPager(map).forEach(System.out::println);
    6. PageBean pageBean=new PageBean();
    7. //查询出第一个的2条数据
    8. pageBean.setPage(1);
    9. pageBean.setRows(2);
    10. permissionBiz.listPager(map,pageBean).forEach(System.out::println);
    11. }
    12. }

    五、特殊字符处理 

    在配置文件里面,< > 都有特殊的含义的--标签

       >(>)   
        <(<)  
        &(&) 
     空格( )
      

     被CDATA所包裹的特殊字符,都会被转义成SQL语句中的字符

        >(>) ; <(<);  

     PermissionMapper.xml

    1. <select id="list6" resultType="com.oyang.model.Permission" parameterType="com.oyang.model.PermissionVo">
    2. select * from t_easyui_permission
    3. <where>
    4. <if test="null != min and min != ''">
    5. if>
    6. <if test="null != max and max != ''">
    7. pid ]]>
    8. if>
    9. where>
    10. select>
    11. <select id="list7" resultType="com.oyang.model.Permission" parameterType="com.oyang.model.PermissionVo">
    12. select * from t_easyui_permission
    13. <where>
    14. <if test="null != min and min != ''">
    15. and #{min} < pid
    16. if>
    17. <if test="null != max and max != ''">
    18. and #{max} > pid
    19. if>
    20. where>
    21. select>

     PermissionVo

    1. package com.oyang.model;
    2. import java.util.List;
    3. /**
    4. * @author oyang
    5. * @site https://blog.csdn.net
    6. * @qq 1828190940
    7. * @create  2022-08-12 11:42
    8. */
    9. public class PermissionVo extends Permission{
    10. private List permissionIds;
    11. private int min;
    12. private int max;
    13. public int getMin() {
    14. return min;
    15. }
    16. public void setMin(int min) {
    17. this.min = min;
    18. }
    19. public int getMax() {
    20. return max;
    21. }
    22. public void setMax(int max) {
    23. this.max = max;
    24. }
    25. public List getPermissionIds() {
    26. return permissionIds;
    27. }
    28. public void setPermissionIds(List permissionIds) {
    29. this.permissionIds = permissionIds;
    30. }
    31. }

     PermissionMapper

    1. * 处理特殊字符
    2. * @return
    3. */
    4. List list6(PermissionVo permissionVo);
    5. /**
    6. * 处理特殊字符
    7. * @return
    8. */
    9. List list7(PermissionVo permissionVo);

     PermissionBiz

    1. List list6(PermissionVo permissionVo);
    2. List list7(PermissionVo permissionVo);

     PermissionBizimpl

    1. @Override
    2. public List list6(PermissionVo permissionVo) {
    3. return permission.list6(permissionVo);
    4. }
    5. @Override
    6. public List list7(PermissionVo permissionVo) {
    7. return permission.list7(permissionVo);
    8. }

    测试

    1. @Test
    2. public void list6() {
    3. PermissionVo vo=new PermissionVo();
    4. vo.setMax(7);
    5. vo.setMin(0);
    6. permissionBiz.list6(vo).forEach(System.out::println);
    7. }
    8. @Test
    9. public void list7() {
    10. PermissionVo vo=new PermissionVo();
    11. vo.setMax(7);
    12. vo.setMin(0);
    13. permissionBiz.list7(vo).forEach(System.out::println);
    14. }


     OK,今日的学习就到此结束啦,如果对个位看官有帮助的话可以留下免费的赞哦(收藏或关注也行),如果文章中有什么问题或不足以及需要改正的地方可以私信博主,博主会做出改正的。个位看官,小陽在此跟大家说拜拜啦   

  • 相关阅读:
    【C++】3-1.2.4 函数通过引用传参
    高效、易用、可拓展我全都要:OneFlow CUDA Elementwise模板库的设计优化思路
    垃圾回收之三色标记法(Tri-color Marking)
    双因素方差分析全流程汇总
    600+,亮眼数据背后的康铂酒店品牌硬实力
    生成与调用C++动态链接库(so文件)
    UnityShader(四)
    [附源码]JAVA毕业设计科研项目审批管理系统(系统+LW)
    【前端代码实例】使用HTML5+CSS3+JavaScript制作一个响应式的后台管理系统~带侧边导航栏仪表盘功能
    阿里云新用户:定义,专享福利及优惠活动
  • 原文地址:https://blog.csdn.net/weixin_65211978/article/details/126291678