Mybatis动态sql
时间:2021-01-26
本文章向大家介绍Mybatis动态sql,主要包括Mybatis动态sql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Mybatis动态sql
动态sql:根据不同的条件生成不同的sql语句。
mybatis提供了如下几个元素来实现动态sql
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
搭建数据库
动态sql——if
要求:若title和author都为空的情况下,查出所有记录,title不为空的情况下查出相对应的title记录,author不为空的情况下查出相对应的author记录。
定义接口
public interface BlogMapper {
List<Blog> queryBlogIF(Map<Object,Object> map);
}
实现接口
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="gbl.dao.BlogMapper">
<insert id="addBlog" parameterType="blog">
insert into mybatis.blog(id, title, author, create_time, views)
values (#{id},#{title},#{author},#{createTime},#{views})
</insert>
<select id="queryBlogIF" parameterType="map" resultType="blog">
select * from blog
<where>
<if test="title != null " >
and title = #{title}
</if>
<if test="author != null " >
and author = #{author}
</if>
</where>
</select>
</mapper>
测试
title和author为空,查出所有信息
public void queryBlogIF(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Map<Object,Object> map = new HashMap<>();
List<Blog> blogs = mapper.queryBlogIF(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='33a67d7887b04d628a4c915db5056f2c', title='SSM', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='796207a9cd2c48d4aa83049d7afd4e48', title='Spring', author='gbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='2ee49a5bca2b400794b410cadf7fe175', title='JS', author='gbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
title不为空
public void queryBlogIF(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Map<Object,Object> map = new HashMap<>();
map.put("title","Java");
List<Blog> blogs = mapper.queryBlogIF(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
author不为空
public void queryBlogIF(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Map<Object,Object> map = new HashMap<>();
map.put("author","xxgbl");
List<Blog> blogs = mapper.queryBlogIF(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='33a67d7887b04d628a4c915db5056f2c', title='SSM', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
动态sql——choose(when、otherwise)
choose有点像Java中的switch语句。
<select id="queryBlogChoose" parameterType="map" resultType="blog">
select * from blog
<where>
<choose>
<when test="title != null " >
and title = #{title}
</when>
<when test="author != null " >
and author = #{author}
</when>
<otherwise>
and views = #{views}
</otherwise>
</choose>
</where>
</select>
动态sql——foreach
<!--
select * from blog where title in("Java" , "SSM")
collection: 接受一个集合,相当于("Java" , "SSM")
item:相当于("Java" , "SSM")中的每一个具体的值
open:前缀,相当于("Java" , "SSM")中的前括号(
separator:分隔符,相当于("Java" , "SSM")中的逗号,
close:后缀,相当于("Java" , "SSM")中的后括号)
所以这个sql语句应该是: select * from blog where title in("Java" , "SSM")
-->
<select id="queryBlogForeach" parameterType="map" resultType="blog">
select * from blog where title in
<foreach item="title" collection="list" open="(" separator="," close=")">
#{title}
</foreach>
</select>
测试:
public void queryBlogForeach(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("SSM");
Map<Object,Object> map = new HashMap();
map.put("list",list);
List<Blog> blogs = mapper.queryBlogForeach(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
//
这个sql相当于 select * from blog where title in("Java" , "SSM")
//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='33a67d7887b04d628a4c915db5056f2c', title='SSM', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
原文地址:https://www.cnblogs.com/xxgbl/p/14332720.html
- 【MIG专项测试组】腾讯手机管家实战分析:内存突增是为神马?
- 全系统栈崩溃是什么鬼?手机管家高级工程师 jaylin,教你如何抓鬼!
- 【团队分享】苍翼之刃:论File Descriptor泄漏如何导致Crash?
- 【沙龙干货分享】你要知道的N个Android适配问题
- 优化安卓应用内存的神秘方法以及背后的原理,一般人我不告诉他
- 安全快速下载Xcode的姿势
- Android之实现妙趣横生的粘连布局
- 萝莉有话说:你的App真正适配了iOS 9吗?
- H5 缓存机制浅析 移动端 Web 加载性能优化
- Android 开发必备知识:我和 Gradle 有个约会
- dex分包变形记
- 手把手教你如何分析 iOS 系统栈 crash
- 通往全栈工程师的捷径 —— React
- GLC - glog 日志清理类库
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释