Mybatis 动态查询 -- if、choose(when、otherwise)、trim(where、set)、foreach

前文


一、环境搭建

1.1 创建数据表 Blog

  • 创建5个字段 id、title、author、create_time、views
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
  • 添加数据

1.2 创建基本 Maven 工程

  • 工程目录如下:

  • 利用 Maven 导入 jar 包

    <!--导入依赖-->
    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!--LOG4J-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

    </dependencies>

  • 编写 mybatis-config.xml 配置文件
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--configuration核心配置文件-->
<configuration>

    <!-- properties文件导入参数 -->
    <properties resource="db.properties">
        <property name="pwd" value="Kc635908933"/>
    </properties>

    <settings>
        <!-- 标准日志实现 -->
        <!-- <setting name="logImpl" value="STDOUT_LOGGING"/> -->
        <!-- 驼峰命名 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!-- 类型别名 -->
    <typeAliases>
        <!-- <typeAlias type="com.pojo.User" alias="User"/> -->
        <package name="com.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper class="com.dao.BlogMapper"></mapper>
    </mappers>
</configuration>
  • 编写 Blog.class 实体类
@Data
public class Blog {
    
    
    private String id;
    private String title;
    private String author;
    private Date create_time;
    private int views;
    
}
  • 编写实体类对应 BlogMapper接口 和 BlogMapper.xml文件

BlogMapper接口

public interface BlogMapper {
    
    

    // 插入数据
    int addBlog(Blog blog);

}

BlogMapper.xml

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.BlogMapper">

    <!-- 插入博客-->
    <insert id="addBlog" parameterType="blog">
        insert into mybatis.blog(id, title, author, create_time, views)
        values (#{id},#{title},#{author},#{create_time},#{views})
    </insert>

</mapper>

1.3 插入数据测试代码

    @Test
    public void addInitBlog(){
    
    
        SqlSession session = MybatisUtils.getSqlSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);

        Blog blog = new Blog();
        blog.setId(IDUtils.getId());
        blog.setTitle("Mybatis如此简单");
        blog.setAuthor("kc");
        blog.setCreate_time(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.close();

    }

二、动态SQL – if 语句

2.1 BlogMapper.xml 接口实现

    // 查询博客
    List<Blog> queryBlogIF(Map map);
    <!-- sql语句片段 -->
    <sql id="select-title-author">
        <if test=" title != null">
            and title = #{title}
        </if>

        <if test=" author != null">
            and auther = #{auther}
        </if>
    </sql>

    <!-- 动态查询if -->
    <select id="queryBlogIF" parameterType="Map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <include refid="select-title-author"></include>
        </where>

    </select>

2.2 测试函数

    @Test
    public void queryBlogIF(){
    
    
        SqlSession session = MybatisUtils.getSqlSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);

        Map map = new HashMap();
        map.put("title", "Java如此简单3");

        List<Blog> blogs = mapper.queryBlogIF(map);
        for (Blog blog : blogs) {
    
    
            System.out.println(blog);
        }

        session.close();
    }

三、动态SQL – choose(when、otherwise)语句

3.1 BlogMapper.xml 接口实现

    // 查询博客 Choose
    List<Blog> queryBlogChoose(Map map);
    <!-- 动态查询 choose -->
    <select id="queryBlogChoose" parameterType="Map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <choose>
                <when test="title != null">
                    title = #{title}
                </when>
                <when test="auther != null">
                    auther = #{auther}
                </when>
                <otherwise>
                    1 = 1
                </otherwise>

            </choose>
        </where>
    </select>

3.2 测试函数

    @Test
    public void queryBlogChoose(){
    
    
        SqlSession session = MybatisUtils.getSqlSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);

        Map map = new HashMap();
        map.put("title", "Java如此简单");

        List<Blog> blogs = mapper.queryBlogChoose(map);
        for (Blog blog : blogs) {
    
    
            System.out.println(blog);
        }

        session.close();
    }

四、动态SQL – trim(where、set)语句

4.1 BlogMapper.xml 接口实现

    // 更新博客 Set
    int updateBlog(Map map);
    <!-- 更新 set -->
    <update id="updateBlog" parameterType="map">
        update mybatis.blog
        <set>
            <if test="title != null">
                title = #{title},
            </if>
            <if test="author != null">
                author = #{author}
            </if>
        </set>
        where id = #{id}
    </update>

4.2 测试函数

    @Test
    public void updateBlog(){
    
    
        SqlSession session = MybatisUtils.getSqlSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);

        Map map = new HashMap();
        map.put("title", "Java如此简单3");
        map.put("author","kuangcheng2");
        map.put("id","2");

        int num = mapper.updateBlog(map);
        System.out.println(num);

        session.close();
    }

4.3 trim 函数

  • 覆盖前面的值
<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>
  • 覆盖后面的值
<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

五、动态SQL – foreach 语句

5.1 BlogMapper.xml 接口实现

    // 查询 foreach -- 1、2、3
    List<Blog> queryBlogForeach(Map map);
    <!-- 动态查询 foreach -->
    <!-- select * from mybatis.blog where 1=1 and (id=1 or id=2 or id=3) -->
    <select id="queryBlogForeach" parameterType="Map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <foreach collection="ids" item="id" open=" and (" close=")" separator=" or ">
                id = #{id}
            </foreach>
        </where>
    </select>

5.2 测试函数

    @Test
    public void queryBlogForeach(){
    
    
        SqlSession session = MybatisUtils.getSqlSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);

        Map map = new HashMap();

        ArrayList<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(2);

        map.put("ids", ids);
        List<Blog> blogs = mapper.queryBlogForeach(map);
        for (Blog blog : blogs) {
    
    
            System.out.println(blog);
        }

        session.close();
    }

六、小结

所谓的动态SQL,本质还是SQL语句 , 只是我们可以在SQL层面,去执行一个逻辑代码

动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了

建议:

现在Mysql中写出完整的SQL,再对应的去修改成为我们的动态SQL实现通用即可!

猜你喜欢

转载自blog.csdn.net/Kc635908933/article/details/113123312