mybatis之动态SQL测试环境的搭建以及if语句的使用~

简介: 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 comm

注:在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&amp;useUnicode=true&amp;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.u

第三步:测试类测试:

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如此简单");

输出的部分结果如下所示:

相关文章
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
8月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
475 18
|
12月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1563 0
|
8月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
305 0
|
11月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1036 5
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
SQL XML Java
九、MyBatis动态SQL
九、MyBatis动态SQL
227 2
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
1753 6
|
SQL XML Java
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
427 0