• mybatis 动态sql和分页


    目录

    一、mybatis动态sql

    1、if标签

    2、foreach

    二、模糊查询

    1、MyBatis中#和$的区别

    2、常用模糊查询

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

    四、分页查询

    五、特殊字符处理


    一、mybatis动态sql

    1、if标签

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

    自定义mvc

    update aa表 set a=?,b=?,c=?,d=? where id=?

    弊端:

           

            

    意味着后台

    实体类只有a,b属性值不为空,其他为空

    进一步 update aa set a=颠颠,b=老六,c=null,d=null where id=?

    mybatis动态sql
        update t_mvc_book
          title=颠颠,
          price = #{price,jdbcType=REAL},
        where bid = #{bid,jdbcType=INTEGER}

    没有赋值的原来有值依然是原来的值

    2、foreach

    1. <select id="selectBooksIn" resultType="com.javaxl.model.Book" parameterType="java.util.List">
    2. select * from t_mvc_book where bid in
    3. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    4. #{bid}
    5. foreach>
    6. select>
    7. List selectBooksIn(@Param("bookIds") List bookIds);

    二、模糊查询

    1、MyBatis中#和$的区别

    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>

    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>

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

    2、常用模糊查询

    1. <select id="selectBooksLike3" resultType="com.zking.model.Book" parameterType="java.lang.String">
    2. select * from t_mvc_book where bname like concat('%',#{bname},'%')
    3. select>

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

    1. <select id="list1" resultMap="BaseResultMap">
    2. select * from t_mvc_book
    3. select>
    4. <select id="list2" resultType="com.zking.model.Book">
    5. select * from t_mvc_book
    6. select>
    list1、list2的结论是:对于单表查询而言,可以用Resutmap/resultType接收,但是多表必须用Resutmap接收
    1. <select id="list3" resultType="com.zking.model.Book" parameterType="com.javaxl.model.BookVo">
    2. select * from t_mvc_book where bid in
    3. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    4. #{bid}
    5. foreach>
    6. select>
    如果要传入多个查询参数,必须以对象的方式进行传递
    不管返回1条数据,还是多条数据,都应该用java.util.Map进行接受
    如果是1条数据,那么返回值是Map
    如果返回是多条数据,那么返回值是List

    四、分页查询

    添加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(concat('%',#{bname}),'%')
    3. select>

    BookMapper

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

    BookBiz

      List<Map> listPager(Map map, PageBean pageBean);
    BookBizImpl
    1. @Override
    2. public List<Map> listPager(Map map, PageBean pageBean) {
    3. //分页插件相关代码
    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. }
    13. return maps;
    14. }
    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.zking.model.Book" parameterType="com.cdl.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.cdl.model.Book" parameterType="com.zking.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>
    BookMapper
    1. /**
    2. * 处理特殊字符
    3. * @param bookVo
    4. * @return
    5. */
    6. List list6(BookVo bookVo);
    7. List list7(BookVo bookVo);

     BookVo

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

    1. /**
    2. * 特殊字符处理
    3. * @param bookVo
    4. * @return
    5. */
    6. List list6(BookVo bookVo);
    7. List list7(BookVo bookVo);
    BookBizImpl
    1. @Test
    2. public void list6() {
    3. BookVo bookVo = new BookVo();
    4. bookVo.setMax(45);
    5. bookVo.setMax(35);
    6. bookBiz.list6(bookVo).forEach(System.out::println);
    7. }
    8. @Test
    9. public void list7() {
    10. BookVo bookVo = new BookVo();
    11. bookVo.setMax(45);
    12. bookVo.setMax(35);
    13. bookBiz.list6(bookVo).forEach(System.out::println);
    14. }
    15. }

  • 相关阅读:
    Java程序设计——JDBC基础(JDBC编程)
    达梦(DM)数据库管理表
    汉字乱码汇总
    分布式任务调度框架XXL-JOB
    SpringBean(配置、实例化、作用域、生命周期、装配方式)
    使用低代码可视化开发平台快速搭建应用
    Apache shiro 漏洞总结
    【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(一)
    SparkSQL
    openssl客户端编程:一个不起眼的函数导致的SSL会话失败问题
  • 原文地址:https://blog.csdn.net/yzq102873/article/details/126291319