mybatis之动态SQL测试环境的搭建以及if语句的使用
动态SQL:
动态 SQL 是 MyBatis 的强大特性之一,如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号,利用动态 SQL,可以彻底摆脱这种痛苦
,动态SQL指的是根据不同的条件生成不同的SQL语句
动态SQL元素和JSTL或基于类似XML的文本处理器相似
,在mybatis之前的版本中,有很多元素需要花时间了解,mybatis3大大精简了元素种类,现在只需要学习原来一半的元素即可,mybatis采用功能强大的基于OGNL的表达式来淘汰其他大部分元素
if
choose(when otherwise)
trim(where set)
foreach
搭建环境:
在数据库中建表:
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 '浏览量');
注:在SQL中字段或列的注释是用属性comment来添加
具体可参考这篇文章
新建接口:
BlogMapper接口:
package dao;
import pojo.Blog;
public interface BlogMapper {
//方法---插入数据
int addBlog(Blog blog);
}
BlogMapper.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.BlogMapper">
<insert id="addBlog" parameterType="blog">
insert into blog(id,title,author,create_time,views)
values(#{id},#{title},#{author},#{createTime},#{views});
</insert>
</mapper>
新建实体类:
Blog类:
package pojo;
import lombok.Data;
import java.util.Date;
@Data
public class {
private String id;
private String title;
private String author;
private Date createTime;
private int views;
}
IDutils类:
package utils;
import java.util.UUID;
@SuppressWarnings("all")//镇压警告
public class IDutils {
public static String getId(){
//UUID---全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的
return UUID.randomUUID().toString().replaceAll("-","");
}
}
mybatis_utils类:
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class mybatis_utils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession () {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
新建mybatis-config.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="xxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="dao.BlogMapper"/>
</mappers>
</configuration>
注:
新建测试类:
代码如下:
package dao.user;
import dao.BlogMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Blog;
import utils.IDutils;
import utils.mybatis_utils;
import java.util.Date;
public class MyTest {
@Test
public void addInitBlog() {
SqlSession session = mybatis_utils.getSqlSession();
BlogMapper mapper = session.getMapper(BlogMapper.class);
//新建实体类,插入数据
Blog blog = new Blog();
blog.setId(IDutils.getId());
blog.setTitle("Mybatis如此简单");
blog.setAuthor("狂神说");
blog.setCreateTime(new Date());
blog.setViews(9999);
mapper.addBlog(blog);
blog.setId(IDutils.getId());
blog.setTitle("Java如此简单");
mapper.addBlog(blog);
blog.setId(IDutils.getId());
blog.setTitle("Spring如此简单");
mapper.addBlog(blog);
blog.setId(IDutils.getId());
blog.setTitle("微服务如此简单");
mapper.addBlog(blog);
session.commit();
session.close();
}
}
输出结果如下:
数据库中查询:
数据被成功插入!
测试环境搭建完成!
======================================================
以下所有的测试都是基于上述搭建好的测试环境中进行修改后测试的!
动态SQL之IF语句:
第一步:编写BlogMapper类中的方法
package dao;
import pojo.Blog;
import java.util.List;
import java.util.Map;
public interface BlogMapper {
//使用if语句查询博客
List<Blog> queryBlogIF(Map map);
}
第二步:修改BlogMapper.xml中的SQL语句:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.BlogMapper">
<select id="queryBlogIF" resultType="Blog">
SELECT * FROM BLOG where 1=1
<if test="title != null">
AND title like #{title}
</if>
</select>
</mapper>
如果有小伙伴报以下错误,请去.xml文件中的resultType是不是错写为map了,这里需要写的是返回的类型即实体类,而不是map
java.lang.ClassCastException: class java.util.HashMap cannot be cast to class pojo.Blog (java.util.HashMap is in module java.base of loader 'bootstrap'; pojo.Blog is in unnamed module of loader 'app')
第三步:测试类测试:
package dao.user;
import dao.BlogMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Blog;
import utils.mybatis_utils;
import java.util.HashMap;
import java.util.List;
public class MyTest {
@Test
public void queryBlogIF() {
SqlSession sqlSession= mybatis_utils.getSqlSession();
BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);
HashMap map=new HashMap();
List<Blog> blogList=mapper.queryBlogIF(map);
for(Blog blog:blogList){
System.out.println(blog);
}
sqlSession.close();
}
}
在上述的测试类中,我们没有传入title
,因此,会返回所有的数据
:
输出的部分结果如下所示:
传入title的值:
map.put("title","java如此简单");
输出的部分结果如下所示:
只输出**title=“java如此简单”**的那一组数据
如果我想通过 “title” 和 “author” 两个参数进行可选搜索该怎么办呢?只需要加入另一个条件即可,如下所示:
修改SQL语句为:
<select id="queryBlogIF" resultType="Blog">
SELECT * FROM BLOG where 1=1
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null">
AND author like #{author}
</if>
</select>
只传入title的值:[数据库中存在的title]
map.put("title","java如此简单");
输出的部分结果如下所示:
传入title和author的值:[数据库中存在的title和author]
map.put("author","狂神说");
map.put("title","java如此简单");
输出的部分结果如下所示:
传入title和author的值:[数据库中不存在的title或author]
map.put("author","张三");
map.put("title","java如此简单");
输出的部分结果如下所示: