目录
简介:
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
一、foreach标签
<!--bookIds 就是{1,2,3,4,5}-->
<select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
2、BookMapper
// 通过in关键字进行查询:讲解foreach 标签的使用
// 如果说参数是非实体类(book,Order,....),那么急的加上注解 @param,bookIds是对应collection属性的
List<Book> selectByIn(@Param("bookIds") List bookIds);
3、BookBizImpl
@Override
public List<Book> selectByIn(List bookIds) {
return bookMapper.selectByIn(bookIds);
}
4、BookBiz
List<Book> selectByIn(List bookIds);
5、BookBizImplTest
@Test
public void selectByIn() {
List<Integer> bookIds = Arrays.asList(new Integer[]{31, 32, 33, 34});
bookBiz.selectByIn(bookIds).forEach(System.out::println);
}
二、模糊查询
public List<Book> selectBooksLike1(String bname);
BookBizImpl
@Override
public List<Book> selectBooksLike1(String bname) {
return bookMapper.selectBooksLike1(bname);
}
BookMapper.xml
<select id="selectBooksLike1" resultType="com.liaoxin.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like #{bname}
</select>
BookMapper.java
List<Book> selectBooksLike1(@Param("bname") String bname);
BookBizImplTest
@Test
public void selectBooksLike1() {
bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
}
2、test2
public List<Book> selectBooksLike2(String bname);
BookBizImpl
@Override
public List<Book> selectBooksLike2(String bname) {
return bookMapper.selectBooksLike2(bname);
}
BookMapper.xml
<select id="selectBooksLike2" resultType="com.liaoxin.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like '${bname}'
</select>
BookMapper.java
List<Book> selectBooksLike2(@Param("bname") String bname);
BookBizImplTest
@Test
public void selectBooksLike2() {
bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
}
3、test3
public List<Book> selectBooksLike3(String bname);
BookBizImpl
@Override
public List<Book> selectBooksLike3(String bname) {
return bookMapper.selectBooksLike3(bname);
}
BookMapper.xml
<select id="selectBooksLike3" resultType="com.liaoxin.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like concat('%',#{bname},'%')
</select>
BookMapper.java
List<Book> selectBooksLike3(@Param("bname") String bname);
BookBizImplTest
@Test
public void selectBooksLike3() {
bookBiz.selectBooksLike3("圣墟").forEach(System.out::println);
}
三、结果集的处理
BookBiz
List<Book> list1();
BookBizImpl
@Override
public List<Book> list1() {
return bookMapper.list1();
}
BookMapper.xml
<select id="list1" resultMap="BaseResultMap">
select * from t_mvc_book
</select>
BookMapper.java
// list1 list2的结论是,对于单表查询而言,可以用resultmap/resulttype接收,但是多表必须用resultmap接收
List<Book> list1();
BookVo
package com.liaoxin.model;
import java.util.List;
public class BookVo extends Book{
private List bookIds;
public List getBookIds() {
return bookIds;
}
public void setBookIds(List bookIds) {
this.bookIds = bookIds;
}
}
BookBizImplTest
@Test
public void list1() {
bookBiz.list1().forEach(System.out::println);
}
2、list2
BookBiz
List<Book> list2();
BookBizImpl
@Override
public List<Book> list2() {
return bookMapper.list2();
}
BookMapper.xml
</select>
<select id="list2" resultType="com.liaoxin.model.Book">
select * from t_mvc_book
</select>
BookMapper.java
List<Book> list2();
BookVo
package com