一、mybatis动态SQL
foreach
<!--
collection :集合变量
open 自动补充的前缀
close自动补充的后缀
separator分隔符
item 集合变量当前元素的引用
-->
<select id="selectBooksIn" resultType="com.lxy.model.Book" parameterType="java.util.List">
select * from t_mvc_book where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
BookMapper
List<Book> selectBooksIn(@Param("bookIds") List bookIds);
BookServiceImplTest
@org.junit.Test public void selectBooksIn() { System.out.println("mybatis中的foreach标签。。。"); List<Book> books=this.bookService.selectBooksIn(Arrays.asList(new Integer[]{24,25,28})); books.forEach(System.out::println); }
二、模糊查询
结论:#是自带$符号的,$是不带的有SQL注入的风险。在项目中虽然$符号有注入的风险,但是在开发中我们一般会用它来做mybatis的动态列的小功能。
什么叫mybatis的动态列?
有的时候我们在模块之间会有这种相互调用的情况,你需要在开发中,会在别人的代码上做修改,所以我们会在开发中做这种动态列的效果。可以去减少我们的dao层、map.xml的代码编写。
<select id="selectBooksLike1" resultType="com.javaxl.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like #{bname}
</select>
<select id="selectBooksLike2" resultType="com.javaxl.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like '${bname}'
</select>
<select id="selectBooksLike3" resultType="com.javaxl.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
</select>
BookMspper/BookService
List<Book> selectBooksLike1(@Param("bname") String bname); List<Book> selectBooksLike2(@Param("bname") String bname); List<Book> selectBooksLike3(@Param("bname") String bname);
BookServiceImpl
@Override
public List<Book> selectBooksLike1(String bname) {
return bookMapper.selectBooksLike1(bname);
}
@Override
public List<Book> selectBooksLike2(String bname) {
return bookMapper.selectBooksLike2(bname);
}
@Override
public List<Book> selectBooksLike3(String bname) {
return bookMapper.selectBooksLike3(bname);
}
BookServiceImplTest
@org.junit.Test
public void selectBooksLike1() {
System.out.println("mybatis中的模糊查询#与$的区别");
List<Book> books=this.bookService.selectBooksLike1("%斗破%");
books.forEach(System.out::println);
}
@org.junit.Test
public void selectBooksLike2() {
System.out.println("mybatis中的模糊查询#与$的区别");
List<Book> books=this.bookService.selectBooksLike2("%斗破%");
books.forEach(System.out::println);
}@org.junit.Test
public void selectBooksLike3() {
System.out.println("mybatis中的模糊查询#与$的区别");
List<Book> books=this.bookService.selectBooksLike3("斗破");
books.forEach(System.out::println);
}
运行结果
三、查询返回结果集的处理
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>,适用于多表查询返回单个结果集
<select id="list1" resultMap="BaseResultMap">
select * from t_mvc_book
</select>
<select id="list2" resultType="com.lxy.model.Book">
select * from t_mvc_book
</select>
<select id="list3" resultType="com.lxy.model.Book" parameterType="com.lxy.vo.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">
select * from t_mvc_book
</select>
<select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
select * from t_mvc_book where bid = #{bid}
</select>
vo.BookVo
package com.lxy.vo;
import com.lxy.model.Book;
import java.util.List;
public class BookVo extends Book {
private List<Integer> bookIds;
public List<Integer> getBookIds() {
return bookIds;
}
public void setBookIds(List<Integer> bookIds) {
this.bookIds = bookIds;
}
}
Bookservice/BookMapper
/**
* 使用resultMap返回自定义类型集合
* @return
*/
List<Book> list1();
/**
* 使用resultType返回List<T>
* @return
*/
List<Book> list2();
/**
* 使用resultType返回单个对象
* @return
*/
Book list3(BookVo bookVo);
/**
* 使用resultType返回List<Map>,适用于多表查询返回结果集
* @return
*/
List<Map> list4();
/**
* 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
* @return
*/
Map list5(Map book);
BookServiceImpl
@Override
public List<Book> list1() {
return bookMapper.list1();
}
@Override
public List<Book> list2() {
return bookMapper.list2();
}
@Override
public Book list3(BookVo bookVo) {
return bookMapper.list3(bookVo);
}
@Override
public List<Map> list4() {
return bookMapper.list4();
}
@Override
public Map list5(Map book) {
return bookMapper.list5(book);
}
BookServiceImplTest
结论1:resultMap多表查询会用,resultType单表查询
结论2:List<T></>单表,List<Map></>多表
@Test
public void list1() {
System.out.println("五种返回类型配置");
List<Book> books=this.bookService.list1();
books.forEach(System.out::println);
}
@Test
public void list2() {
System.out.println("五种返回listbook对象");
List<Book> books=this.bookService.list2();
books.forEach(System.out::println);
}
@Test
public void list3() {
System.out.println("五种返回类型配置之返回单个对象");
BookVo bookVo=new BookVo();
bookVo.setBookIds(Arrays.asList(new Integer[]{28}));
this.bookService.list3(bookVo);
}
@Test
public void list4() {
System.out.println("五种返回类型配置之返回listMap对象");
List<Map> books=this.bookService.list4();
books.forEach(System.out::println);
}
@Test
public void list5() {
System.out.println("五种返回类型配置之返回listMap对象");
Map map=new HashMap();
map.put("bid",29);
Map m=this.bookService.list5(map);
System.out.println(m);
}
四、分页查询
1、自定义mvc
basedao是通过数据库的limit关键字完成的,limit起始下标,偏移重
原始SQL
查询符合条件的记录数countSQL select count(1)from(SQL)t
查询符合条件某一页的数据pagebean
2、Hibernate
分页是自带的
原始SQL
查询分页符合条件的记录数:select count(1)from hql
squery.setFirstResult(pageBean.getStartIndex());
query.setMaxResults(pageBean.getRows());
3、mybatis
引入第三方插件pom依赖·
mybatis是借用了拦截器引入第三方完成分页的,配置拦截器
在对应需要分页的代码中加入相应的代码
导入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>
BookMapper/BookService
List<Map> listPager(Map map, PageBean pageBean);
BookServiceImpl
@Override
public List<Map> listPager(Map map, PageBean pageBean) {
if(pageBean != null && pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
List<Map> list = bookMapper.listPager(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;
}
BookServiceImplTest
@Test
public void listPager() {
System.out.println("mybatis中模糊查询#与$的区别.....");
Map map=new HashMap();
map.put("bname","圣墟");
PageBean pageBean=new PageBean();
//查第三页
pageBean.setPage(3);
//不分页
pageBean.setPagination(false);
List<Map> ms=this.bookService.listPager(map,pageBean);
ms.forEach(System.out::println);
}
五、特殊字符处理
BookMapper
<select id="list6" resultType="com.lxy.model.Book" parameterType="com.lxy.vo.BookVo">
select * from t_mvc_book
<where>
<if test="null != min and min != ''">
<![CDATA[ and #{min} < price ]]>
</if>
<if test="null != max and max != ''">
<![CDATA[ and #{max} > price ]]>
</if>
</where>
</select>
<select id="list7" resultType="com.lxy.model.Book" parameterType="com.lxy.vo.BookVo">
select * from t_mvc_book
<where>
<if test="null != min and min != ''">
and #{min} < price
</if>
<if test="null != max and max != ''">
and #{max} > price
</if>
</where>
</select>
BookVo
BookService/BookMapper
/** * 处理特殊字符 * @param bookVo * @return */ List<Book> list6(BookVo bookVo); /** * 处理特殊字符 * @param bookVo * @return */ List<Book> list7(BookVo bookVo); }
BookServiceimpl
@Override public List<Book> list6(BookVo bookVo) { return bookMapper.list6(bookVo); } @Override public List<Book> list7(BookVo bookVo) { return bookMapper.list7(bookVo); }
BookServiceImplTest
@Test
public void list6() {
System.out.println("五种返回listbook对象");
BookVo bookVo=new BookVo();
bookVo.setMin(20);
bookVo.setMax(40);
List<Book> books=this.bookService.list6(bookVo);
books.forEach(System.out::println);
}
@Test
public void list7() {
System.out.println("五种返回listbook对象");
BookVo bookVo=new BookVo();
bookVo.setMin(20);
bookVo.setMax(40);
List<Book> books=this.bookService.list7(bookVo);
books.forEach(System.out::println);
}