1. 程式人生 > 其它 >Mybatis 動態查詢 -- if、choose(when、otherwise)、trim(where、set)、foreach

Mybatis 動態查詢 -- if、choose(when、otherwise)、trim(where、set)、foreach

技術標籤:Mybatismybatismysql

前文


文章目錄

一、環境搭建

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實現通用即可!