• 动态sql和分页


    目录

    一、mybatis动态sql

    foreach标签

    二、模糊查询

     MyBatis中#和$的区别

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

    四、分页查询

    五、特殊字符处理


    一、mybatis动态sql

    foreach标签

    在BookMapper.xml中使用foreach标签查询

    1. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    2. <mapper namespace="com.maomao.mapper.BookMapper" >
    3. <resultMap id="BaseResultMap" type="com.maomao.model.Book" >
    4. <constructor >
    5. <idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" />
    6. <arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" />
    7. <arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
    8. constructor>
    9. resultMap>
    10. <sql id="Base_Column_List" >
    11. bid, bname, price
    12. sql>
    13. <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    14. select
    15. <include refid="Base_Column_List" />
    16. from t_mvc_book
    17. where bid = #{bid,jdbcType=INTEGER}
    18. select>
    19. <select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
    20. select
    21. <include refid="Base_Column_List" />
    22. from t_mvc_book
    23. where bid in
    24. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    25. #{bid}
    26. foreach>
    27. select>
    28. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    29. delete from t_mvc_book
    30. where bid = #{bid,jdbcType=INTEGER}
    31. delete>
    32. <insert id="insert" parameterType="com.maomao.model.Book" >
    33. insert into t_mvc_book (bid, bname, price
    34. )
    35. values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
    36. )
    37. insert>
    38. <insert id="insertSelective" parameterType="com.maomao.model.Book" >
    39. insert into t_mvc_book
    40. <trim prefix="(" suffix=")" suffixOverrides="," >
    41. <if test="bid != null" >
    42. bid,
    43. if>
    44. <if test="bname != null" >
    45. bname,
    46. if>
    47. <if test="price != null" >
    48. price,
    49. if>
    50. trim>
    51. <trim prefix="values (" suffix=")" suffixOverrides="," >
    52. <if test="bid != null" >
    53. #{bid,jdbcType=INTEGER},
    54. if>
    55. <if test="bname != null" >
    56. #{bname,jdbcType=VARCHAR},
    57. if>
    58. <if test="price != null" >
    59. #{price,jdbcType=REAL},
    60. if>
    61. trim>
    62. insert>
    63. <update id="updateByPrimaryKeySelective" parameterType="com.maomao.model.Book" >
    64. update t_mvc_book
    65. <set >
    66. <if test="bname != null" >
    67. bname = #{bname,jdbcType=VARCHAR},
    68. if>
    69. <if test="price != null" >
    70. price = #{price,jdbcType=REAL},
    71. if>
    72. set>
    73. where bid = #{bid,jdbcType=INTEGER}
    74. update>
    75. <update id="updateByPrimaryKey" parameterType="com.maomao.model.Book" >
    76. update t_mvc_book
    77. set bname = #{bname,jdbcType=VARCHAR},
    78. price = #{price,jdbcType=REAL}
    79. where bid = #{bid,jdbcType=INTEGER}
    80. update>
    81. mapper>

    BookBiz.java 

    1. package com.maomao.biz;
    2. import com.maomao.model.Book;
    3. import org.apache.ibatis.annotations.Param;
    4. import java.util.List;
    5. public interface BookBiz {
    6. int deleteByPrimaryKey(Integer bid);
    7. Book selectByPrimaryKey(Integer bid);
    8. List selectByIn(List bookIds);
    9. }

    BookBizImpl.java

    1. package com.maomao.biz.impl;
    2. import com.maomao.biz.BookBiz;
    3. import com.maomao.mapper.BookMapper;
    4. import com.maomao.model.Book;
    5. import java.util.List;
    6. public class BookBizImpl implements BookBiz {
    7. private BookMapper bookMapper;
    8. public BookMapper getBookMapper() {
    9. return bookMapper;
    10. }
    11. public void setBookMapper(BookMapper bookMapper) {
    12. this.bookMapper = bookMapper;
    13. }
    14. @Override
    15. public int deleteByPrimaryKey(Integer bid) {
    16. return bookMapper.deleteByPrimaryKey(bid);
    17. }
    18. @Override
    19. public Book selectByPrimaryKey(Integer bid) {
    20. return bookMapper.selectByPrimaryKey(bid);
    21. }
    22. @Override
    23. public List selectByIn(List bookIds) {
    24. return bookMapper.selectByIn(bookIds);
    25. }
    26. }

     BookBizImplTest.java

    1. package com.maomao.biz.impl;
    2. import com.maomao.biz.BookBiz;
    3. import com.maomao.mapper.BookMapper;
    4. import com.maomao.util.SessionUtil;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.junit.After;
    7. import org.junit.Before;
    8. import org.junit.Test;
    9. import java.util.Arrays;
    10. import java.util.List;
    11. public class BookBizImplTest {
    12. private BookBizImpl bookBiz;
    13. private SqlSession sqlSession;
    14. @Before
    15. public void setUp() throws Exception {
    16. System.out.println("初始化方法");
    17. BookBizImpl bookBiz=new BookBizImpl();
    18. // 工具类中获取session对象
    19. sqlSession = SessionUtil.openSession();
    20. // 从session对象中获取mapper对象
    21. BookMapper mapper = sqlSession.getMapper(BookMapper.class);
    22. bookBiz.setBookMapper(mapper);
    23. this.bookBiz=bookBiz;
    24. }
    25. @After
    26. public void tearDown() throws Exception {
    27. System.out.println("方法测试结束");
    28. }
    29. @Test
    30. public void deleteByPrimaryKey() {
    31. }
    32. @Test
    33. public void selectByPrimaryKey() {
    34. System.out.println("测试的业务方法");
    35. // System.out.println(bookBiz.getBookMapper());
    36. System.out.println(bookBiz.selectByPrimaryKey(44));
    37. }
    38. @Test
    39. public void selectByIn(){
    40. List bookIds = Arrays.asList(new Integer[]{22, 23, 24, 25});
    41. bookBiz.selectByIn(bookIds).forEach(System.out::println);
    42. }
    43. }

    运行结果:

     

    二、模糊查询

    通常写sql语句有三种方式:

    #{...}

    ${...}

    Concat

    注意:#{...}自带引号,${...}sql注入的风险

     BookMapper.xml

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

    BookMapper.java

    1. package com.maomao.biz;
    2. import com.maomao.model.Book;
    3. import org.apache.ibatis.annotations.Param;
    4. import java.util.List;
    5. public interface BookBiz {
    6. List selectBooksLike1(@Param("bname") String bname);
    7. List selectBooksLike2(@Param("bname") String bname);
    8. List selectBooksLike3(@Param("bname") String bname);
    9. }

     BookBizImpl.java

    1. package com.maomao.biz.impl;
    2. import com.maomao.biz.BookBiz;
    3. import com.maomao.mapper.BookMapper;
    4. import com.maomao.model.Book;
    5. import java.util.List;
    6. public class BookBizImpl implements BookBiz {
    7. private BookMapper bookMapper;
    8. public BookMapper getBookMapper() {
    9. return bookMapper;
    10. }
    11. public void setBookMapper(BookMapper bookMapper) {
    12. this.bookMapper = bookMapper;
    13. }
    14. @Override
    15. public List selectBooksLike1(String bname) {
    16. return bookMapper.selectBooksLike1(bname);
    17. }
    18. @Override
    19. public List selectBooksLike2(String bname) {
    20. return bookMapper.selectBooksLike2(bname);
    21. }
    22. @Override
    23. public List selectBooksLike3(String bname) {
    24. return bookMapper.selectBooksLike3(bname);
    25. }
    26. }

     BookBizImplTest.java

    1. package com.maomao.biz.impl;
    2. import com.maomao.biz.BookBiz;
    3. import com.maomao.mapper.BookMapper;
    4. import com.maomao.util.SessionUtil;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.junit.After;
    7. import org.junit.Before;
    8. import org.junit.Test;
    9. import java.util.Arrays;
    10. import java.util.List;
    11. public class BookBizImplTest {
    12. private BookBizImpl bookBiz;
    13. private SqlSession sqlSession;
    14. @Before
    15. public void setUp() throws Exception {
    16. System.out.println("初始化方法");
    17. BookBizImpl bookBiz=new BookBizImpl();
    18. // 工具类中获取session对象
    19. sqlSession = SessionUtil.openSession();
    20. // 从session对象中获取mapper对象
    21. BookMapper mapper = sqlSession.getMapper(BookMapper.class);
    22. bookBiz.setBookMapper(mapper);
    23. this.bookBiz=bookBiz;
    24. }
    25. @After
    26. public void tearDown() throws Exception {
    27. System.out.println("方法测试结束");
    28. }
    29. @Test
    30. public void selectByPrimaryKey() {
    31. System.out.println("测试的业务方法");
    32. // System.out.println(bookBiz.getBookMapper());
    33. System.out.println(bookBiz.selectByPrimaryKey(44));
    34. }
    35. @Test
    36. public void selectByIn(){
    37. List bookIds = Arrays.asList(new Integer[]{22, 23, 24, 25});
    38. bookBiz.selectByIn(bookIds).forEach(System.out::println);
    39. }
    40. @Test
    41. public void selectBookLike1(){
    42. bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
    43. }
    44. @Test
    45. public void selectBookLike2(){
    46. bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
    47. }
    48. @Test
    49. public void selectBookLike3(){
    50. bookBiz.selectBooksLike3("%圣墟%").forEach(System.out::println);
    51. }
    52. }

    三个方法的运行结果都是一样

     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. 一般能用#的就别用$. 

      

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

    BookMapper.xml

    1. <select id="list1" resultMap="BaseResultMap">
    2. select * from t_mvc_book
    3. select>
    4. <select id="list2" resultType="com.maomao.model.Book">
    5. select * from t_mvc_book
    6. select>
    7. <select id="list3" resultType="com.maomao.model.Book"parameterType="com.maomao.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>

     BookVo.java

    1. package com.maomao.model;
    2. import java.util.List;
    3. public class BookVo extends Book{
    4. private List bookIds;
    5. public List getBookIds() {
    6. return bookIds;
    7. }
    8. public void setBookIds(List bookIds) {
    9. this.bookIds = bookIds;
    10. }
    11. }

    BookBiz.java

    1. package com.maomao.biz;
    2. import com.maomao.model.Book;
    3. import com.maomao.model.BookVo;
    4. import org.apache.ibatis.annotations.Param;
    5. import java.util.List;
    6. import java.util.Map;
    7. public interface BookBiz {
    8. //list1和list2的结论是:对于单表查询而言,可以用它Resultmap/ReaultType接收 但是多表必须用Resultmap
    9. List list1();
    10. List list2();
    11. //如果要传入多个查询参数,必须以对象的方式进行传递
    12. List list3(BookVo vo);
    13. //说明了返回一条数据还是多条数据 都应该用java.util.Map" 接收
    14. // 如果是多条数据,那么返回的是list
    15. List list4();
    16. Map list5(Map map);
    17. }

     BookBizImpl.java

    1. package com.cdl.biz.impl;
    2. import com.cdl.biz.BookBiz;
    3. import com.cdl.mapper.BookMapper;
    4. import com.cdl.model.Book;
    5. import com.cdl.model.BookVo;
    6. import java.util.List;
    7. import java.util.Map;
    8. public class BookBizImpl implements BookBiz {
    9. private BookMapper bookMapper;
    10. //alt + insert 快速提供set/get/tostring/构造函数
    11. //alt +enter 快速构建实现类 能够自动补全
    12. public BookMapper getBookMapper() {
    13. return bookMapper;
    14. }
    15. public void setBookMapper(BookMapper bookMapper) {
    16. this.bookMapper = bookMapper;
    17. }
    18. @Override
    19. public List list1() {
    20. return bookMapper.list1();
    21. }
    22. @Override
    23. public List list2() {
    24. return bookMapper.list2();
    25. }
    26. @Override
    27. public List list3(BookVo vo) {
    28. return bookMapper.list3(vo);
    29. }
    30. @Override
    31. public List list4() {
    32. return bookMapper.list4();
    33. }
    34. @Override
    35. public Map list5(Map map) {
    36. return bookMapper.list5(map);
    37. }
    38. }
     
    

    BookBizImplTest.java

    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. }

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

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

     

    list4和list5

    说明了返回一条数据还是多条数据 都应该用java.util.Map" 接收

    如果是多条数据,那么返回的是list

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

     

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

     

    四、分页查询

    添加pom.xml的文件

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

     Mybatis.cfg.xml

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

     BookMapper.xml

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

     BookMapper.java

    1. //利用第三方插件进行分页
    2. List listPager(Map map);

     BookBiz.java

    List listPager(Map map);

     BookBizImpl.java

    1. @Override
    2. public List listPager(Map map) {
    3. return bookMapper.listPager(map);
    4. }

    此时还不能分页 ,因为没有使用MySQL的limit分页 就要使用代码进行分页

    PageBean.java 

    1. package com.maomao.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. }

    BookBiz.java 

      List listPager(Map map, PageBean pageBean);

     BookBizImpl.java

    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 = bookMapper.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. }

    BookBizImplTest.java

    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. }
    12. }

     

    五、特殊字符处理

    >(>)  

        <(<) 

        &(&)

     空格( )

     

    BookMapper.xml 

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

     BookVo.java

    1. package com.maomao.model;
    2. import java.util.List;
    3. public class BookVo extends Book{
    4. private List bookIds;
    5. private int min;
    6. private int max;
    7. public int getMin() {
    8. return min;
    9. }
    10. public void setMin(int min) {
    11. this.min = min;
    12. }
    13. public int getMax() {
    14. return max;
    15. }
    16. public void setMax(int max) {
    17. this.max = max;
    18. }
    19. public List getBookIds() {
    20. return bookIds;
    21. }
    22. public void setBookIds(List bookIds) {
    23. this.bookIds = bookIds;
    24. }
    25. }

    BookBiz.java

    1. /**
    2. * 特殊字符处理
    3. * @param bookVo
    4. * @return
    5. */
    6. List list6(BookVo bookVo);
    7. List list7(BookVo bookVo);

     BookBizImpl.java

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

     

  • 相关阅读:
    13-1-SRGAN-图像超分-残差模块-亚像素卷积
    学校食堂明厨亮灶 yolov8
    rust学习—— 不一样的break
    目标检测中的BBox 回归损失函数-L2,smooth L1,IoU,GIoU,DIoU,CIoU,Focal-EIoU,Alpha-IoU,SIoU
    计算机毕业设计Java校园易购二手交易平台(源码+系统+mysql数据库+Lw文档)
    PMP 11.27 考试倒计时15天!冲刺啦!
    Windows桌面便笺 - 置顶任务TODO - 便利贴工具
    Java多线程实战教学
    java基于微信小程序面向企事业单位的项目申报小程序+ssm+uinapp+Mysql+计算机毕业设计
    M和打印及绘图的火花
  • 原文地址:https://blog.csdn.net/m12120426/article/details/126290988