#动态SQL中本章只讲if/foreach
- mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类:
1.1 if 语句 (简单的条件判断)
1.2 choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似
1.3 trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
1.4 where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
1.5 set (主要用于更新时)
1.6 foreach (在实现 mybatis in 语句查询时特别有用)
- Mybatis中模糊查询的各种写法
2.1 sql中字符串拼接(推荐)
SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT(’%’, #{text}), ‘%’);//注:CONCAT是mysql数据库中才有的
SELECT * FROM tableName WHERE name LIKE like ‘%’+#{bookName}+’%’;//注:sqlserver中的写法
2.2 使用 #{…} 代替 . . . S E L E C T ∗ F R O M t a b l e N a m e W H E R E n a m e L I K E ′ {...} SELECT * FROM tableName WHERE name LIKE '% ...SELECT∗FROMtableNameWHEREnameLIKE′{text}%’;
#与KaTeX parse error: Expected 'EOF', got '#' at position 20: … 前提:参数类型为字符串,#̲会在前后加单引号['],则直接插入值
2.3 程序中拼接
String searchText = “%” + text + “%”;
2.4 大小写匹配查询
注:sql模糊查询中小于符号“<”报错,<
>(>=) <(<=) &(&) 空格( )
- mybatis中返回List集合
3.1 定义结果集
3.2 指定结果集
select book_id, book_name, book_price, book_brief
from t_book where 1=1
List<Map>
-
为什么要重写mybatis的分页
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
selectList(String statement, Object parameter, RowBounds rowBounds) -
使用pagehelper插件分页
3.1 导入分页插件
com.github.pagehelper
pagehelper
5.1.2
3.2 将pagehelper插件配置到mybatis中
3.3 在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
//设置分页处理
if (null != pageBean && pageBean.isPagination()) {
PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
}
3.4 获取分页信息(二种方式)
3.4.1 使用插件后,查询实际返回的是Page,而非List,Page继承了ArrayList,同时还包含分页相关的信息
if (null != pageBean && pageBean.isPagination()) {
PageInfo pageInfo = new PageInfo(bookList);
pageBean.setTotal(pageInfo.getTotal() + “”);
}
System.out.println(“页码:” + page.getPageNum());
System.out.println(“页大小:” + page.getPageSize());
System.out.println(“总记录:” + page.getTotal());
3.4.2 使用PageInfo
PageInfo pageInfo = new PageInfo(list);
System.out.println(“页码:” + pageInfo.getPageNum());
System.out.println(“页大小:” + pageInfo.getPageSize());
System.out.println(“总记录:” + pageInfo.getTotal());
-
通过version字段解决并发问题
throw new RuntimeException(“对象已过期(ObjectExpired)或不存在(Object Not Found)”)
update t_book set book_price = #{bookPrice},version=version+1
where book_id=#{bookId} and version=#vsersion#