动态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> selectBooksIn(List bookIds);
BookServiceImpl
1  @Override
2     public List<Book> selectBooksIn(List bookIds) {
3         return bookMapper.selectBooksIn(bookIds);
4     }

Bookmapper.xml

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

结果:

模糊查询

Mybatis对模糊查询共有三种方式
{}${}concat
#与$的区别$会引起sql攻击 Java代码差别(#):%圣墟% select  * from t_mvc_book where bname like #{bname} select  * from t_mvc_book where bname like %圣墟%

 select  * from t_mvc_book where bname like ‘${bname}‘  人为加的引导 %圣墟%正常传值 比如:‘%圣墟% or 1=1‘ select  * from t_mvc_book where bname like ‘‘%圣墟% or 1=1‘‘BookMapper
 1 /**
 2      *Mybatis对模糊查询共有三种方式
 3      * #{}
 4      * ${}
 5      * concat
 6      * @param bname
 7      * @return
 8      */
 9     List<Book> selectBooksLike1(@Param("bname")String bname);
10     List<Book> selectBooksLike2(@Param("bname")String bname);
11     List<Book> selectBooksLike3(@Param("bname")String bname);
BookService
 1 /**
 2      *Mybatis对模糊查询共有三种方式
 3      * #{}
 4      * ${}
 5      * concat
 6      * @param bname
 7      * @return
 8      */
 9     List<Book> selectBooksLike1(String bname);
10     List<Book> selectBooksLike2(String bname);
11     List<Book> selectBooksLike3(String bname);

Bookmapper.xml

 1 <select id="selectBooksLike1" resultType="com.Mybatis.model.Book" parameterType="java.lang.String">
 2 select  * from t_mvc_book where bname like #{bname}
 3   </select>
 4
 5   <select id="selectBooksLike2" resultType="com.Mybatis.model.Book" parameterType="java.lang.String">
 6 select  * from t_mvc_book where bname like ‘${bname}‘
 7   </select>
 8
 9   <select id="selectBooksLike3" resultType="com.Mybatis.model.Book" parameterType="java.lang.String">
10 select  * from t_mvc_book where bname like concat(concat(‘%‘,#{bname}),‘%‘)
11   </select>
BookServiceImpl
 1  @Override
 2     public List<Book> selectBooksLike1(String bname) {
 3         return bookMapper.selectBooksLike1(bname);
 4     }
 5
 6     @Override
 7     public List<Book> selectBooksLike2(String bname) {
 8         return bookMapper.selectBooksLike2(bname);
 9     }
10
11     @Override
12     public List<Book> selectBooksLike3(String bname) {
13         return bookMapper.selectBooksLike3(bname);
14     }

测试:

Mybatis结果集处理的五种情况

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

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

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

使用resultType返回List<T>

使用resultType返回单个对象

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

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

BookMapper
1  List<Book> list1();
2     List<Book> list2();
3     List<Book> list3(BookVo bookVo);
4     List<Map> list4(Map map);
5     Map list5(Map map);
 Bookmapper.xml
 1   <select id="list1" resultMap="BaseResultMap">
 2 select  * from t_mvc_book
 3   </select>
 4   <select id="list2" resultMap="BaseResultMap">
 5 select  * from t_mvc_book
 6   </select>
 7   <select id="list3" resultType="com.Mybatis.model.Book" parameterType="com.Mybatis.model.vo.BookVo">
 8 select  * from t_mvc_book where bid in
 9     <foreach collection="bookIds" item="bid" open="(" close=")" separator=",">
10       #{bid}
11     </foreach>
12   </select>
13   <select id="list4" resultType="java.util.Map" parameterType="java.util.Map">
14     select  * from t_mvc_book where bid in
15     <foreach collection="bookIds" item="bid" open="(" close=")" separator=",">
16       #{bid}
17     </foreach>
18   </select>
19   <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
20     select  * from t_mvc_book where bid = #{bid}
21   </select>
BookService
1  List<Book> list1();
2     List<Book> list2();
3     List<Book> list3(BookVo bookVo);
4     List<Map> list4(Map map);
5     Map list5(Map map);
BookServiceImpl
 1 @Override
 2     public List<Book> list2() {
 3         return bookMapper.list2();
 4     }
 5
 6     @Override
 7     public List<Book> list3(BookVo bookVo) {
 8         return bookMapper.list3(bookVo);
 9     }
10
11     @Override
12     public List<Map> list4(Map map) {
13         return bookMapper.list4(map);
14     }
15
16     @Override
17     public Map list5(Map map) {
18         return bookMapper.list5(map);
19     }
测试:

分页查询

为什么要重写mybatis的分页?

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

1、导入pom依赖

1 <dependency>
2     <groupId>com.github.pagehelper</groupId>
3     <artifactId>pagehelper</artifactId>
4     <version>5.1.2</version>
5 </dependency>

Mybatis.cfg.xml配置拦截器

BookMapper
1  /**
2      * 分页
3      * @param map
4      * @return
5      */
6     List<Map> listPager(Map map);

Bookmapper.xml
 <select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
    select  * from t_mvc_book where bname like #{bname}
  </select>
BookService
1     /**
2      * 分页
3      * @param map
4      * @return
5      */
6     List<Map> listPager(Map map, PageBean pageBean);
BookServiceImpl
 1 @Override
 2     public List<Map> listPager(Map map, PageBean pageBean) {
 3         if (pageBean != null && pageBean.isPagination()){
 4             PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
 5         }
 6         List<Map> list = bookMapper.listPager(map);
 7         if (pageBean != null && pageBean.isPagination()){
 8             PageInfo pageInfo = new PageInfo(list);
 9             System.out.println("总记录数:"+pageInfo.getTotal());
10             System.out.println("当前页:"+pageInfo.getPageNum());
11             System.out.println("页大小:"+pageInfo.getPageSize());
12             pageBean.setTotal(pageInfo.getTotal()+"");
13             System.out.println("总页数:"+pageBean.getMaxPage());
14         }
15         return list;
16     }

测试:

特殊字符处理

>(>)

<(<)

&(&)

空格( )

<![CDATA[ <= ]]>

BookMapper
1 /**
2      * 特殊字符处理
3      * @param bookVo
4      * @return
5      */
6     List<Book> list6(BookVo bookVo);
Bookmapper.xml
1  <select id="list6" resultType="com.Mybatis.model.Book" parameterType="com.Mybatis.model.vo.BookVo">
2        select  * from t_mvc_book where <![CDATA[  price > #{min} and price < #{max} ]]>
3     </select>
BookService
1 /**
2      * 特殊字符处理
3      * @param bookVo
4      * @return
5      */
6     List<Book> list6(BookVo bookVo);
BookServiceImpl
1  @Override
2     public List<Book> list6(BookVo bookVo) {
3         return bookMapper.list6(bookVo);
4     }

测试:

原文地址:https://www.cnblogs.com/xcn123/p/11699418.html

时间: 2024-08-29 16:33:36

动态sql和分页的相关文章

MyBatis框架(三)动态SQL,分页,二进制存入数据库图片

一.动态sql语句,分页 1, <if>条件 <if test="key!=null"> 拼接sql语句 </if> 2, <choose><when><otherwise> 注意:只能执行一个分支 <choose> <when test="key=='value'"> 拼接sql语句 </when> <when test="key=='val

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 (主要用于更新时)

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实现分页查询

1.创建实体类对象需要查询的条件com.rl.ecps.model.QueryCondition private Long brandId; private Short auditStatus; private Short showStatus; private String itemName; private Integer pageNo; private Integer startNum; private Integer endNum; 2.查询语句 查询条数: <select id="

1.动态sql语句 2.逆向工程(generator) 3.分页助手(pagehelper)

2019-8-30 大纲 1.动态sql语句 2.逆向工程(generator) 3.分页助手(pagehelper) 1.动态sql语句(即sql语句的拼接) 1.1  if标签(属性:test(判断条件)) 缺点:如果仅仅是第二个条件满足导致sql语句出错(使用if+where) <select id="select1" resultType="com.zhiyou.clg.bean.User"> select *from user <if t

mybatis入门篇3 ---- 动态sql,缓存,以及分页jar包的使用

首先我们来看一下动态sql,动态sql就是传递的参数不确定的时候,使用if,where,select,choose,set等标签,先来看一下 lib,rescources,以及utils里面文件不变,直接来看使用 直接看if跟where,if使用比较简单,就是if会有一个条件判断,如果条件满足,就会把if里面的sql语句块加入slq语句,where就是帮助我们加载一个where条件判断,并且会把拼接语句中的第一个and删除掉,接下来看一下例子 看一下UserMapper public inter

动态SQL语句:定义(一)

文章系列 动态SQL语句:定义(一) 静态SQL与动态SQL 静态SQL:程序运行前,具有固定的形式和结构的SQL. 动态SQL:程序运行时,能够动态改变形式或结构的SQL. 一些思考和想法 在实际的项目中,很多时候无法简单地用一条静态的SQL语句实现复杂的业务逻辑,往往需要通过程序语言动态地生成SQL语句.然而,在代码中通过条件判断语句拼接产生SQL语句,存在诸多缺点,简单列举如下: 代码杂乱和重复,编码的工作量大,而且容易产生错误. 拼接SQL语句的过程中,容易引起SQL注入. 代码与SQL

Mybatis学习(4)输入映射、输出映射、动态sql

一.输入映射: 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型 1) 传递pojo的包装对象 需求是:完成用户信息的综合查询,传入的查询条件复杂:(包括用户信息.其他信息等); 定义包装类型: 用户扩展类: package com.cy.po; /** *用户的扩展类 * @author chengyu * */ public class UserCustom extends User{ } 视图层面的用户包装类型: 1 package