9. 1 动态 SQL
动态 SQL 就是 指 根据 不同的条件 生成 不同的 SQL 语句。也就是说 它的 自适应能力 会很强,会减少 我们 手写的 一些SQL。
比如说 在 项目开发的时候,我们可能会遇到 不同条件 进行 SQL 拼接的问题。
这个时候 其实 动态 SQL 就 显得 非常 牛B 了。但是 写起来 其实 也不太开心,只能说 重复的 再遇到 这种 问题的时候,复制粘贴 就好了。不需要考虑太多的事情。稍微改改就 ok。
9.1.1 环境搭建
CREATE TABLE `blog`(
`id` VARCHAR(50) NOT NULL COMMENT '博客id',
`title` VARCHAR(100) NOT NULL COMMENT '博客标题',
`author` VARCHAR(30) NOT NULL COMMENT '博客作者',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`views` INT(30) NOT NULL COMMENT '浏览量'
)ENGINE=INNODB DEFAULT CHARSET=utf8;
字段名 下划线问题:在 早些时候,特别是 Oracle 是不允许 大小写的。所以 我们就要写 下划线。也就 有了 create_Time 类似于 这样的字段名就出现了。
那么 怎么解决呢这个问题呢?字段名 现在 和 属性名 对应不上呀。
答案是:直接 在 mybatis-config.xml 进行 配置即可。
<settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings>
写一个 UUID 的 工具类,因为我们 的 主键id 如果是 自增的,那么 实际上 int 类型的 那个 默认 id 是没啥意义的。那还不如 压根 就让它 随机生成了。
package top.muquanyu.utils;import org.junit.Test;import java.util.UUID;@SuppressWarnings("all") // 抑制掉 警告
public class IDutils {public static String getId(){return UUID.randomUUID().toString().replaceAll("-","");}@Testpublic void test(){System.out.println(getId());}
}
当然 我们一定要注意,除了 查询 之外,剩下的 增删改 都是需要 提交事务的,否则 数据 不会 有更新变动。
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import top.muquanyu.Mapper.BlogMapper;
import top.muquanyu.pojo.Blog;
import top.muquanyu.utils.IDutils;
import top.muquanyu.utils.MybatisUtils;import java.util.Date;public class MyTest {@Testpublic void addInitBlog(){SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);Blog blog = new Blog();blog.setId(IDutils.getId());blog.setTitle("aaaa");blog.setAuthor("mqy");blog.setCreateTime(new Date());blog.setViews(9999);mapper.addBlog(blog);blog.setId(IDutils.getId());blog.setTitle("bbbb");blog.setAuthor("mqy");mapper.addBlog(blog);blog.setId(IDutils.getId());blog.setTitle("cccc");blog.setAuthor("mqy");mapper.addBlog(blog);sqlSession.commit();// 提交事务sqlSession.close();}
}
9.2.1 动态 SQL 之 IF 语句
- 解决 查询 关键字 不同 情况的 SQL 拼接。
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import top.muquanyu.Mapper.BlogMapper;
import top.muquanyu.pojo.Blog;
import top.muquanyu.utils.IDutils;
import top.muquanyu.utils.MybatisUtils;import java.util.Date;
import java.util.HashMap;
import java.util.List;public class MyTest {@Testpublic void addInitBlog(){SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);Blog blog = new Blog();blog.setId(IDutils.getId());blog.setTitle("aaaa");blog.setAuthor("mqy");blog.setCreateTime(new Date());blog.setViews(9999);mapper.addBlog(blog);blog.setId(IDutils.getId());blog.setTitle("bbbb");blog.setAuthor("mqy");mapper.addBlog(blog);blog.setId(IDutils.getId());blog.setTitle("cccc");blog.setAuthor("mqy");mapper.addBlog(blog);sqlSession.commit();// 提交事务sqlSession.close();}@Testpublic void test(){SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);HashMap<String, Object> map = new HashMap<>();map.put("title","aaaa");List<Blog> blogs = mapper.queryBlogIF(map);for (Blog blog : blogs) {System.out.println(blog);}sqlSession.close();}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.muquanyu.Mapper.BlogMapper"><insert id="addBlog" parameterType="top.muquanyu.pojo.Blog">insert into test.blog(id,title,author,create_time,views)values(#{id},#{title},#{author},#{createTime},#{views});</insert><select id="queryBlogIF" parameterType="map" resultType="top.muquanyu.pojo.Blog">select * from test.blog where 1 = 1<if test="title != null">and title = #{title}</if><if test="author != null">and author = #{author}</if></select>
</mapper>