目录
一、Mybatis的动态SqlMybatis的动态sql可以让我们在xml文件中,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能
一、Mybatis的动态Sql
Mybatis的动态sql可以让我们在xml文件中,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能
使用foreach和if标签
1、foreach标签(遍历集合,批量查询、通常用于in关键字)
<select id="list3" resultType="com.zjy.model.Book" parameterType="com.zjy.model.BookVo">
select * from t_mvc_book where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
2、if标签
使用if标签将sql进行拼接,当我们对事务进行修改的时候,如果没有把值传过来,那么当我们点击修改之后,结果不会变为null,会保持原来的值不变,所以动态拼接sql可以减少资源错误
<update id="updateByPrimaryKeySelective" parameterType="com.zjy.model.Book" >
update t_mvc_book
<set >
<if test="bname != null" >
bname = #{bname,jdbcType=VARCHAR},
</if>
<if test="price != null" >
price = #{price,jdbcType=REAL},
</if>
</set>
where bid = #{bid,jdbcType=INTEGER}
</update>
二、分页
1、模糊查询(三种方式)
1.1参数中直接加入%%
1.2使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
${...}和#{...}的区别:参数类型为字符串,#会在前后加单引号['],$则直接插入值
1.3 SQL字符串拼接CONCAT
<select id="selectBooksLike1" resultType="com.zjy.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like #{bname}
</select>
<select id="selectBooksLike2" resultType="com.zjy.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like '${bname}'
</select>
<select id="selectBooksLike3" resultType="com.zjy.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
</select>
2、查询返回结果集
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型如果是单表的情况下,resultType和resultMap都可以使用
多表的情况下,必须使用resultMap
使用resultType返回List<T>必须要以参数的形式传递
使用resultType返回List<Map>,适用于多表查询返回多个结果集
使用resultType返回Map<String,O bject>,适用于多表查询返回单个结果集
3、分页查询
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
3.1在pom.xml文件中导入分页查询
<!--分页查询的插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
3.2在Mybatis.cfg.xml文件中配置拦截器
<plugins>
<!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
3.3BookBiz
//利用第三方插件进行分页
List<Map> listPager (Map map, PageBean pageBean);
3.4BookBizImpl
@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;
}
3.5测试类
@Test
public void listPager() {
System.out.println("mybatis中模糊查询#与$的区别.....");
Map map=new HashMap();
map.put("bname","圣墟");
PageBean pageBean=new PageBean();
pageBean.setPage(4);
List<Map> ms=this.bookBiz.listPager(map,pageBean);
ms.forEach(System.out::println);
}
测试效果
![](https://i-blog.csdnimg.cn/blog_migrate/9e550a32965c5e2ff8abde7ba11595ce.png)
4、特殊字符处理
>(>)
<(<)
&(&)
空格( )
<![CDATA[ <= ]]>
<select id="list6" resultType="com.zjy.model.Book" parameterType="com.zjy.model.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.zjy.model.Book" parameterType="com.zjy.model.BookVo">
/**
* 处理特殊字符
* @param bookVo
* @return
*/
List<Book> list6(BookVo bookVo);
/**
* 处理特殊字符
* @param bookVo
* @return
*/
List<Book> list7(BookVo bookVo);