• Mybatis——动态sql和分页


    目录

    一、Mybatis的foreach标签

    二、模糊查询

    三、结果集的处理

    四、第三方分页插件集成Mybatis使用

    五、特殊字符处理


    一、Mybatis的foreach标签

    if标签

    1. <update id="updateByPrimaryKeySelective" parameterType="com.javaxl.model.Book" >
    2. update t_mvc_book
    3. <set >
    4. <if test="bname != null" >
    5. bname = #{bname,jdbcType=VARCHAR},
    6. if>
    7. <if test="price != null" >
    8. price = #{price,jdbcType=REAL},
    9. if>
    10. set>
    11. where bid = #{bid,jdbcType=INTEGER}
    12. update>

    之前自定义mvc的时代:

    修改的SQL语句:

    update t_oa_meeting_info set id=?,title=?,content=?,zhuchiren=?,author=?,..... where id=?

    弊端

    会议编辑界面  infoEdit.jsp

           

           

    意味着后台meetingInfo实体类 只有title、content属性值不为空,其他为空

    进一步的:

    update t_oa_meeting_info set id=?,title=纳新,content=招点学妹,zhuchiren=null,author=null,..... where id=?

     update t_oa_meeting_info

            title= 纳新,
          
        
            price = #{content,jdbcType=REAL},
        
      
        where bid = #{bid,jdbcType=INTEGER}
     

    所以只要把 if标签 的拼接条件放在配置文件里面去拼接即可。

    foreach标签:

    比如:

    1. @Test
    2. public void test3() {
    3. int[] ints={1,2,3,4,5,6};
    4. // 将数据编程字符串 1,2,3,4,5,6
    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. }

    运行结果:

    但是,

     因此forEach标签就来了.

    BookMapper.xml:

    1. <select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_mvc_book
    5. where bid in
    6. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    7. #{bid}
    8. foreach>
    9. select>

     BookMapper :

    1. package com.zking.mapper;
    2. import com.javaxl.model.Book;
    3. import org.apache.ibatis.annotations.Param;
    4. import java.util.List;
    5. public interface BookMapper {
    6. int deleteByPrimaryKey(Integer bid);
    7. int insert(Book record);
    8. int insertSelective(Book record);
    9. Book selectByPrimaryKey(Integer bid);
    10. int updateByPrimaryKeySelective(Book record);
    11. int updateByPrimaryKey(Book record);
    12. // 通过in关键字进行查询,讲解foreach标签的使用
    13. // 如果说参数是非实体类(book,Order,....),那么记得加上注解 @param,bookIds是对应collection属性的
    14. List<Book> selectByIn(@Param("bookIds") List bookIds);
    15. }

     BookBizImpl :

    1. package com.zking.mapper.biz.impl;
    2. import com.javaxl.model.Book;
    3. import com.zking.mapper.BookMapper;
    4. import com.zking.mapper.biz.BookBiz;
    5. import java.util.List;
    6. /**
    7. * @author 杨总
    8. * @create 2022-08-10 23:07
    9. */
    10. public class BookBizImpl implements BookBiz {
    11. private BookMapper bookMapper;
    12. //alt+insert 快速提供set/get/toString/构造方法
    13. //alt+enter 快速构建实现类,填充代码的前半部分 Ctrl+1
    14. public BookMapper getBookMapper() {
    15. return bookMapper;
    16. }
    17. public void setBookMapper(BookMapper bookMapper) {
    18. this.bookMapper = bookMapper;
    19. }
    20. @Override
    21. public int deleteByPrimaryKey(Integer bid) {
    22. return bookMapper.deleteByPrimaryKey(bid);
    23. }
    24. @Override
    25. public Book selectByPrimaryKey(Integer bid) {
    26. return bookMapper.selectByPrimaryKey(bid);
    27. }
    28. @Override
    29. public List<Book> selectByIn(List bookIds) {
    30. return bookMapper.selectByIn(bookIds);
    31. }
    32. }

    BookBiz :

    1. package com.zking.mapper.biz;
    2. import com.javaxl.model.Book;
    3. import java.util.List;
    4. /**
    5. * @author 杨总
    6. * @create 2022-08-10 23:02
    7. */
    8. public interface BookBiz {
    9. int deleteByPrimaryKey(Integer bid);
    10. Book selectByPrimaryKey(Integer bid);
    11. List<Book> selectByIn(List bookIds);
    12. }

    测试:

    BookBizImplTest :

    1. package com.zking.mapper.biz.impl;
    2. import com.zking.mapper.BookMapper;
    3. import com.zking.mapper.util.SessionUtil;
    4. import org.apache.ibatis.session.SqlSession;
    5. import org.junit.After;
    6. import org.junit.Before;
    7. import org.junit.Test;
    8. import java.util.Arrays;
    9. import java.util.List;
    10. /**
    11. * @author 杨总
    12. * @create 2022-08-10 23:21
    13. */
    14. public class BookBizImplTest {
    15. private BookBizImpl bookBiz;
    16. private SqlSession sqlSession;
    17. @Before
    18. public void setUp() throws Exception {
    19. System.out.println("初始化方法...");
    20. BookBizImpl bookBiz = new BookBizImpl();
    21. // 从工具类中获取session对象
    22. sqlSession = SessionUtil.openSession();
    23. // 从session对象中获取mapper对象
    24. BookMapper mapper = sqlSession.getMapper(BookMapper.class);
    25. bookBiz.setBookMapper(mapper);
    26. this.bookBiz = bookBiz;
    27. }
    28. @After
    29. public void tearDown() throws Exception {
    30. System.out.println("方法测试结束...");
    31. sqlSession.commit();
    32. sqlSession.close();
    33. }
    34. @Test
    35. public void deleteByPrimaryKey() {
    36. bookBiz.deleteByPrimaryKey(44);
    37. }
    38. @Test
    39. public void selectByPrimaryKey() {
    40. System.out.println("测试的业务方法...");
    41. // System.out.println(bookBiz.getBookMapper());
    42. System.out.println(bookBiz.selectByPrimaryKey(44));
    43. }
    44. @Test
    45. public void test3() {
    46. int[] ints={1,2,3,4,5,6};
    47. // 将数据编程字符串 1,2,3,4,5,6
    48. StringBuffer sb=new StringBuffer();
    49. for (int i:ints){
    50. sb.append(",").append(i);
    51. }
    52. String s=sb.toString();
    53. System.out.println(s.substring(1));
    54. }
    55. @Test
    56. public void selectByIn(){
    57. List<Integer> bookIds = Arrays.asList(new Integer[]{31, 32, 33, 34});
    58. bookBiz.selectByIn(bookIds).forEach(System.out::println);
    59. }
    60. }

    运行结果

     如上图可见 值已经查询到了。

    二、模糊查询

    ①#{} 

    ②${}   ——(不建议使用该方式,有SQL注入风险)

    关键:#{...}与${...}区别?
              参数类型为字符串,#会在前后加单引号['],$则直接插入值

    ③concat()

     BookMapper.xml:

    1. <select id="selectBooksLike1" resultType="com.zking.model.Book" parameterType="java.lang.String">
    2. select * from t_mvc_book where bname like #{bname}
    3. select>
    4. <select id="selectBooksLike2" resultType="com.zking.model.Book" parameterType="java.lang.String">
    5. select * from t_mvc_book where bname like '${bname}'
    6. select>
    7. <select id="selectBooksLike3" resultType="com.zking.model.Book" parameterType="java.lang.String">
    8. select * from t_mvc_book where bname like concat('%',#{bname},'%')
    9. select>

     BookBizImpl:

    1. @Override
    2. public List<Book> selectBooksLike1(String bname) {
    3. return bookMapper.selectBooksLike1(bname);
    4. }
    5. @Override
    6. public List<Book> selectBooksLike2(String bname) {
    7. return bookMapper.selectBooksLike2(bname);
    8. }
    9. @Override
    10. public List<Book> selectBooksLike3(String bname) {
    11. return bookMapper.selectBooksLike3(bname);
    12. }
    13. }

     BookMapper :

    1. package com.zking.mapper;
    2. import com.javaxl.model.Book;
    3. import org.apache.ibatis.annotations.Param;
    4. import java.util.List;
    5. public interface BookMapper {
    6. int deleteByPrimaryKey(Integer bid);
    7. int insert(Book record);
    8. int insertSelective(Book record);
    9. Book selectByPrimaryKey(Integer bid);
    10. int updateByPrimaryKeySelective(Book record);
    11. int updateByPrimaryKey(Book record);
    12. // 通过in关键字进行查询,讲解foreach标签的使用
    13. // 如果说参数是非实体类(book,Order,....),那么记得加上注解 @param,bookIds是对应collection属性的
    14. List<Book> selectByIn(@Param("bookIds") List bookIds);
    15. List<Book> selectBooksLike1(@Param("bname") String bname);
    16. List<Book> selectBooksLike2(@Param("bname") String bname);
    17. List<Book> selectBooksLike3(@Param("bname") String bname);
    18. }

     测试:

    1. @Test
    2. public void selectBooksLike1(){
    3. bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
    4. }

    运行结果:

     BookMapper.xml:

    再测试:

    1. @Test
    2. public void selectBooksLike2(){
    3. bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
    4. }

     会报错:

    更改回来,也就是加上引号

    1. <select id="selectBooksLike2" resultType="com.zking.model.Book" parameterType="java.lang.String">
    2. select * from t_mvc_book where bname like '${bname}'
    3. select>

    即正常: 

    (参数传递)

    跟前面对比: 

     (占位符)

    concat:

    (无需加百分号)

    1. @Test
    2. public void selectBooksLike3(){
    3. bookBiz.selectBooksLike2("圣墟").forEach(System.out::println);
    4. }

     运行结果:

      

    ——MyBatis中#和$的区别


    1. # 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
       
    如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by '111', 
           如果传入的值是id,则解析成的sql为order by "id".

    2. $ 将传入的数据直接显示生成在sql中。
       如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,
           如果传入的值是id,则解析成的sql为order by id.
     
    3. # 方式能够很大程度防止sql注入。
     
    4. $ 方式无法防止Sql注入。
     
    5. $ 方式一般用于传入数据库对象,例如传入表名.。
     
    6. 一般能用 # 的就别用 $ 。

    三、结果集的处理

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

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

    如果是单表的情况下,resultType与resultMap都可以使用。

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

    如果是多条数据,那么返回值List

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

        

    2 使用resultType返回List

    3 使用resultType返回单个对象

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

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

    BookMapper.xml:

    1. <select id="list1" resultMap="BaseResultMap">
    2. select * from t_mvc_book
    3. select>
    4. <select id="list2" resultType="com.model.Book">
    5. select * from t_mvc_book
    6. select>
    7. <select id="list3" resultType="com.model.Book" parameterType="com.model.BookVo">
    8. select * from t_mvc_book where bid in
    9. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    10. #{bid}
    11. foreach>
    12. select>
    13. <select id="list4" resultType="java.util.Map">
    14. select * from t_mvc_book
    15. select>
    16. <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
    17. select * from t_mvc_book where bid = #{bid}
    18. select>

     BookMapper :

    1. package com.zking.mapper;
    2. import com.model.Book;
    3. import com.model.BookVo;
    4. import org.apache.ibatis.annotations.Param;
    5. import java.util.List;
    6. import java.util.Map;
    7. public interface BookMapper {
    8. int deleteByPrimaryKey(Integer bid);
    9. int insert(Book record);
    10. int insertSelective(Book record);
    11. Book selectByPrimaryKey(Integer bid);
    12. int updateByPrimaryKeySelective(Book record);
    13. int updateByPrimaryKey(Book record);
    14. // 通过in关键字进行查询,讲解foreach标签的使用
    15. // 如果说参数是非实体类(book,Order,....),那么记得加上注解 @param,bookIds是对应collection属性的
    16. List<Book> selectByIn(@Param("bookIds") List bookIds);
    17. List<Book> selectBooksLike1(@Param("bname") String bname);
    18. List<Book> selectBooksLike2(@Param("bname") String bname);
    19. List<Book> selectBooksLike3(@Param("bname") String bname);
    20. // list1 list2的结论是对于单表查询而言,可以用它resultType/resultMap接收,但是多表必须用resultMap接收
    21. List<Book> list1();
    22. List<Book> list2();
    23. // 如果要传入多个查询参数,必须以对象的方式进行传递
    24. List<Book> list3(BookVo vo);
    25. // 如果是返回一条数据,那么返回值Map
    26. // 如果是多条数据,那么返回值List
    27. List<Map> list4();
    28. Map list5(Map map);
    29. }

    BookBizImpl :

    1. package com.zking.mapper.biz.impl;
    2. import com.model.Book;
    3. import com.model.BookVo;
    4. import com.zking.mapper.BookMapper;
    5. import com.zking.mapper.biz.BookBiz;
    6. import java.util.List;
    7. import java.util.Map;
    8. /**
    9. * @author 杨总
    10. * @create 2022-08-10 23:07
    11. */
    12. public class BookBizImpl implements BookBiz {
    13. private BookMapper bookMapper;
    14. //alt+insert 快速提供set/get/toString/构造方法
    15. //alt+enter 快速构建实现类,填充代码的前半部分 Ctrl+1
    16. public BookMapper getBookMapper() {
    17. return bookMapper;
    18. }
    19. public void setBookMapper(BookMapper bookMapper) {
    20. this.bookMapper = bookMapper;
    21. }
    22. @Override
    23. public int deleteByPrimaryKey(Integer bid) {
    24. return bookMapper.deleteByPrimaryKey(bid);
    25. }
    26. @Override
    27. public Book selectByPrimaryKey(Integer bid) {
    28. return bookMapper.selectByPrimaryKey(bid);
    29. }
    30. @Override
    31. public List<Book> selectByIn(List bookIds) {
    32. return bookMapper.selectByIn(bookIds);
    33. }
    34. @Override
    35. public List<Book> selectBooksLike1(String bname) {
    36. return bookMapper.selectBooksLike1(bname);
    37. }
    38. @Override
    39. public List<Book> selectBooksLike2(String bname) {
    40. return bookMapper.selectBooksLike2(bname);
    41. }
    42. @Override
    43. public List<Book> selectBooksLike3(String bname) {
    44. return bookMapper.selectBooksLike3(bname);
    45. }
    46. @Override
    47. public List<Book> list1() {
    48. return bookMapper.list1();
    49. }
    50. @Override
    51. public List<Book> list2() {
    52. return bookMapper.list2();
    53. }
    54. @Override
    55. public List<Book> list3(BookVo vo) {
    56. return bookMapper.list3(vo);
    57. }
    58. @Override
    59. public List<Map> list4() {
    60. return bookMapper.list4();
    61. }
    62. @Override
    63. public Map list5(Map map) {
    64. return bookMapper.list5(map);
    65. }
    66. }

    BookBiz :

    1. package com.zking.mapper.biz;
    2. import com.model.Book;
    3. import com.model.BookVo;
    4. import java.util.List;
    5. import java.util.Map;
    6. /**
    7. * @author 杨总
    8. * @create 2022-08-10 23:02
    9. *
    10. * ctrl+T 跳到接口的实现类
    11. */
    12. public interface BookBiz {
    13. public int deleteByPrimaryKey(Integer bid);
    14. public Book selectByPrimaryKey(Integer bid);
    15. List<Book> selectByIn(List bookIds);
    16. public List<Book> selectBooksLike1(String bname);
    17. public List<Book> selectBooksLike2(String bname);
    18. public List<Book> selectBooksLike3(String bname);
    19. List<Book> list1();
    20. List<Book> list2();
    21. List<Book> list3(BookVo vo);
    22. List<Map> list4();
    23. Map list5(Map map);
    24. }

    测试list1、list2:

    结论是对于单表查询而言,可以用它resultType/resultMap接收,但是多表必须用resultMap接收

    1. @Test
    2. public void list1() {
    3. bookBiz.list1().forEach(System.out::println);
    4. }
    5. @Test
    6. public void list2() {
    7. bookBiz.list2().forEach(System.out::println);
    8. }

    运行结果分别如下: 

     

     测试  list3:

     如果要传入多个查询参数,必须以对象的方式进行传递

    1. @Test
    2. public void list3() {
    3. BookVo vo=new BookVo();
    4. vo.setBookIds(Arrays.asList(new Integer[]{31,32,33,34}));
    5. bookBiz.list3(vo).forEach(System.out::println);
    6. }

    运行结果如下: 

      测试  list4:

     如果是返回一条数据,那么返回值Map
     如果是多条数据,那么返回值List

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

    运行结果如下:

      测试  list5:

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

    运行结果如下:

    四、第三方分页插件集成Mybatis使用

    为什么要重写mybatis的分页?

       Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的

    使用分页插件步奏

    1、导入pom依赖

    1. <groupId>com.github.pagehelpergroupId>
    2. <artifactId>pagehelperartifactId>
    3. <version>5.1.2version>

    2、Mybatis.cfg.xml配置拦截器

    1. <plugin interceptor="com.github.pagehelper.PageInterceptor">
    2. plugin>

    3、使用PageHelper进行分页

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

    4、处理分页结果

    BookVo : 

    1. package com.model;
    2. import java.util.List;
    3. /**
    4. * @author 杨总
    5. * @create 2022-08-12 0:42
    6. */
    7. public class BookVo extends Book{
    8. private List bookIds;
    9. private int min;
    10. private int max;
    11. public int getMax() {
    12. return max;
    13. }
    14. public void setMax(int max) {
    15. this.max = max;
    16. }
    17. public int getMin() {
    18. return min;
    19. }
    20. public void setMin(int min) {
    21. this.min = min;
    22. }
    23. public List getBookIds() {
    24. return bookIds;
    25. }
    26. public void setBookIds(List bookIds) {
    27. this.bookIds = bookIds;
    28. }
    29. }
    BookMapper:
    1. // 利用第三方插件进行分页
    2. List<Map> listPager(Map map);

    BookBizImpl:

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

    BookBiz:
     List<Map> listPager(Map map, PageBean pageBean);

    PageBean : 

    1. package com.zking.pagination.entity;
    2. import java.io.Serializable;
    3. import java.util.Map;
    4. import javax.servlet.http.HttpServletRequest;
    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<String,String[]> 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<String, String[]> getMap() {
    40. return map;
    41. }
    42. public void setMap(Map<String, String[]> 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. }

    测试:

    1. @Test
    2. public void listPager(){
    3. Map map=new HashMap();
    4. map.put("bname","圣墟");
    5. // bookBiz.listPager(map).forEach(System.out::println);
    6. // 查询出第二页的20条数据
    7. PageBean pageBean=new PageBean();
    8. pageBean.setPage(2);
    9. pageBean.setRows(20);
    10. bookBiz.listPager(map,pageBean).forEach(System.out::println);
    11. }

     

     struts拦截器
        定义一个拦截器类
            invoke
                sysout("action方法被调用前执行的功能")
                method.invoke
                sysout("action方法被调用后执行的功能")
            
        struts-sy.xml
            将拦截器的类申明到interceptors
            引用拦截器
            
                

    五、特殊字符处理

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

    (用其包裹会被转义成sql语句中的字符)

    1. <select id="list7" resultType="com.javaxl.model.Book" parameterType="com.javaxl.model.BookVo">
    2. select * from t_mvc_book
    3. <where>
    4. <if test="null != min and min != ''">
    5. and #{min} < price
    6. if>
    7. <if test="null != max and max != ''">
    8. and #{max} > price
    9. if>
    10. where>
    11. select>

    BookBizImpl:

    1. @Override
    2. public List<Book> list6(BookVo vo) {
    3. return bookMapper.list6(vo);
    4. }
    5. @Override
    6. public List<Book> list7(BookVo vo) {
    7. return bookMapper.list7(vo);
    8. }

     测试:

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

     

     

  • 相关阅读:
    #力扣:70. 爬楼梯@FDDLC
    行业案例|指标中台如何助力银行业普惠金融可持续发展
    开发环境和准备工作
    【Django】聚合查询——聚合和其他 QuerySet 子句(filter() 、 exclude()、order_by()、values())
    Wi-Fi7将带来前所未有的快捷、稳定的互联网,更快的传输速度
    windows 安装mysql
    [JS入门到进阶] 手写解析uin8数组的工具:解析二进制字节,太快太方便了!
    5000张高清壁纸大图(手机用),用Python在法律的边缘又试探了一把
    GIS杂记(三):MaxEnt模型中的图像地理范围不匹配【全网最好的方法,没有之一】
    心情不好就狂吃?好心情心理:这是病,得治!
  • 原文地址:https://blog.csdn.net/weixin_65808248/article/details/126291686