MyBatis动态sql和分页

MyBatis动态sql

在接口中定义方法

然后alt加回车在xml中如图:

1.if 语句 (简单的条件判断)

2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似

3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)

4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)、

5. set (主要用于更新时)

6. foreach (在实现 mybatis in 语句查询时特别有用)

测试:

    @Test
    public void selectByIn() {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(10003);
        List<Book> books = this.bookService.selectByIn(list);
        for(Book b : books){
            System.out.println(b);
        }
    }

展示:

模糊查询

这里演示3种:

接口:

 List<Book> selectBylike1(@Param("bname") String bname);

    List<Book> selectBylike2(@Param("bname") String bname);

    List<Book> selectBylike3(@Param("bname") String bname);

映射文件

  <select id="selectBylike1"  resultType="com.cjh.model.Book" parameterType="java.lang.String">
  select * from  t_mvc_book where bname like #{bname}
  </select>

  <select id="selectBylike2"  resultType="com.cjh.model.Book" parameterType="java.lang.String">
   select * from  t_mvc_book where bname like ‘${bname}‘
  </select>

  <select id="selectBylike3"  resultType="com.cjh.model.Book" parameterType="java.lang.String">
  select * from t_mvc_book where bname like concat(concat(‘%‘,#{bname},‘%‘))
  </select>

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

测试:

 @Test
    public void selectBylike() {

//      List<Book> books = this.bookService.selectBylike1(StringUtils.toLikeStr("圣墟"));

//      List<Book> books = this.bookService.selectBylike2("%圣墟 or bid!=1%");//这种方式存在sql攻击

        List<Book> books = this.bookService.selectBylike3("圣墟");
        for(Book b : books){
            System.out.println(b);
        }
    }

其中StringUtils:

public class StringUtils {

    public static  String toLikeStr(String str){
        return  "%"+str+"%";
    }
}

结果:

查询返回结果集的处理

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

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

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

3.2 使用resultType返回List<T>

3.3 使用resultType返回单个对象

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

3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集

接口:

//    3.1 使用resultMap返回自定义类型集合
    List<Book> list1();
//    3.2 使用resultType返回List<T>
    List<Book> list2();
//    3.3 使用resultType返回单个对象
    Book list3(BookVo bookVo);
//    3.4 使用resultType返回List<Map>,适用于多表查询返回结果集
     List<Map> list4(Map map);
//    3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
    Map list5(Map map);

BookVo类:

public class BookVo extends Book{

    private List<String> bookIds;
 public List<String> getBookIds() {
        return bookIds;
    }

    public void setBookIds(List<String> bookIds) {
        this.bookIds = bookIds;
    }
}

映射文件:

 <select id="list1" resultMap="BaseResultMap">
    select * from t_mvc_book
  </select>

  <select id="list2" resultType="com.cjh.model.Book">
     select * from t_mvc_book
  </select>

  <select id="list3" resultType="com.cjh.model.Book" parameterType="com.cjh.model.BookVo">
    select * from t_mvc_book where bid in
    <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
      #{bid}
    </foreach>
  </select>

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

  <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
      select * from t_mvc_book
    <where>
      <if test="null !=bid and bid !=‘‘">
        and bid = #{bid}
      </if>
    </where>
  </select>

测试:

 @Test
    public void list() {
        //返回resultMap但是使用list<T>
        // List<Book> books = this.bookService.list1();

        //返回resulttype使用list<T>接收
//        List<Book> books = this.bookService.list2();
//        for(Book b : books){
//            System.out.println(b);
//        }

//        //返回的是resulttype使用T接收
//        BookVo bookVo = new BookVo();
//        List list = new ArrayList();
//        list.add(1);
//        bookVo.setBookIds(list);
//        Book book = this.bookService.list3(bookVo);
//        System.out.println(book);

        //返回的是resultTypr ,然后用list<Map>进行接收
        Map map = new HashMap();
//        map.put("bname", StringUtils.toLikeStr("圣墟"));
//        List<Map> list = this.bookService.list4(map);
//        for (Map m : list) {
//            System.out.println(m);
//        }
        //返回的是resultTypr ,然后用Map进行接收
        map.put("bid",2);
        Map k = this.bookService.list5(map);
        System.out.println(k);

    }

分页查询

为什么要重写mybatis的分页?

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

使用分页插件步奏

1、导入pom依赖

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

3、使用PageHelper进行分页

4、处理分页结果

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>

然后在实现类中写方法:

    @Override
    public List<Map> listPagers(Map map, PageBean pageBean) {
        if (pageBean != null && pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }
        List<Map> list = this.BookMapper.list4(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;
    }

测试:

    @Test
    public void listPage() {
        Map map = new HashMap();
        map.put("bname", StringUtils.toLikeStr("圣墟"));
        PageBean pageBean = new PageBean();
//        pageBean.setPage(3);
        //不分页
        pageBean.setPagination(false);
        List<Map> list = this.bookService.listPagers(map, pageBean);
        for (Map m : list){
            System.out.println(m);
        }

    }

特殊字符处理:

方式一:
大于:>
小于:<
空格:&

方式二:<![CDATA[ <= ]]>

接口:

    List<Map> list6(BookVo bookVo);

    List<Map> list7(BookVo bookVo);

映射文件:

<select id="list6" resultType="java.util.Map" parameterType="com.cjh.model.BookVo">
    select * from t_mvc_book
    <where>
      <if test="null !=min and min !=‘‘">
        and price &gt; #{min}
      </if>
      <if test="null !=max and max !=‘‘">
        and price &lt; #{max}
      </if>
    </where>
  </select>

  <select id="list7" resultType="java.util.Map" parameterType="com.cjh.model.BookVo">
    select * from t_mvc_book
    <where>
      <if test="null !=min and min !=‘‘">
        <![CDATA[ and price > #{min}]]>
      </if>
      <if test="null !=max and max !=‘‘">
        <![CDATA[ and price < #{max}]]>
      </if>
    </where>

  </select>

测试:

    @Test
    public void sqlSpecial() {
        BookVo bookVo = new BookVo();
        bookVo.setMax(80);
        bookVo.setMin(20);
        /*  List<Map> maps = this.bookService.list6(bookVo);*/
        List<Map> maps = this.bookService.list7(bookVo);
        for (Map map : maps) {
            System.out.println(map);
        }
    }

原文地址:https://www.cnblogs.com/chenjiahao9527/p/11566006.html

时间: 2024-10-16 03:30:48

MyBatis动态sql和分页的相关文章

mybatis动态sql以及分页

1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 1.mybatis动态sql If.trim.foreach If 标签判断某一字段是否为空 <select id="list4" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book <where> <i

Oracle -Mybatis动态SQL查询分页的实现

首先看SQL 怎么写 select * from ( select a.*,ROWNUM rn from ( 最底层查询语句 ) a where ROWNUM <= #{endCol} ) where rn > #{startCol} 注意:Mybatis中 < 是小于号  >是大于号 当然 我们还需要 select count(*) 最底层查询语句来得到结果集的总数.然后再换算出 endCol 和 startCol 换算代码如下: //int totalRecord= 总条数;

动态sql和分页

Mybatis动态SQL If.trim.foreach BookMapper 1 /** 2 * 如果形参要在mapper.xml中使用需要加上面注解 3 * map.name: zs age: 12 4 * @param bookIds 5 * @return 6 */ 7 List<Book> selectBooksIn(@Param("bookIds") List bookIds); BookService 1 List<Book> selectBook

MyBatis动态SQL小结

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: 等线 } .MsoChpDefault { font-family: 等线 } div.WordSection1 { } ol { margin-bottom: 0cm } ul { margin-bottom: 0cm } Mybati

MyBatis动态SQL————MyBatis动态SQL标签的用法

1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 a

用Groovy模板写MyBatis动态SQL

MyBatis动态SQL简介 MyBatis有个强大的功能,动态SQL.有了这个功能,定义在Mapper里的SQL语句,就不必是静止不变的了,而是可以根据传入的参数,动态调整.下面是MyBatis官方文档里的一个if语句的例子: <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = 'ACTIVE' <if test=

Mybatis 动态sql(转载)

原文地址:http://www.cnblogs.com/dongying/p/4092662.html 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率.下面就去感受Mybatis动态SQL的魅力吧: 1

mybatis 动态sql语句

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的