MyBatis 作为⼀个“半⾃动化”的 ORM 框架,需要开发者⼿动定义 SQL 语句。

  在业务需求⽐较复杂的情 况下,⼿动拼接 SQL 语句的⼯作量会⾮常⼤,为了适⽤于不同的业务需求,往往需要做很多重复性的⼯作,这种⼯作对于开发者来讲⽐较耗费时间,同时也容易出错。

  此时可以使用MyBatis框架提供的动态拼接SQL,不同条件查询时,可以复用同一条SQL语句。

示例:定义一个方法,通过某些(部分)属性来查询User对象

1、定义实体类User

package com.sunjian.entity;

import java.util.List;

/**
 * @author sunjian
 * @date 2020/3/22 9:59
 */
public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private List<Integer> ids;

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

2、创建UserRepositoryDynamicSQL接口

package com.sunjian.repository;

import com.sunjian.entity.User;

import java.util.List;

/**
 * @author sunjian
 * @date 2020/3/22 10:44
 */
public interface UserRepositoryDynamicSQL {
    public User findUserByUser(User user);
    public void updateUser(User user);
    public List<User> findAllByUser(User user);
}

3、创建UserRepositoryDynamicSQL.xml文件,编写查询SQL

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sunjian.repository.UserRepositoryDynamicSQL">
    <!-- if -->
    <!--<select id="findUserByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User">-->
    <!--select * from t_user-->
    <!--<where>-->
    <!--<if test="id != null">-->
    <!--id = #{id}-->
    <!--</if>-->
    <!--<if test="username != null">-->
    <!--and username = #{username}-->
    <!--</if>-->
    <!--<if test="password != null">-->
    <!--and password = #{password}-->
    <!--</if>-->
    <!--<if test="age != null">-->
    <!--and age = #{age}-->
    <!--</if>-->
    <!--</where>-->
    <!--</select>-->

    <!-- choose when -->
    <!--<select id="findUserByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User">-->
    <!--select * from t_user-->
    <!--<where>-->
    <!--<choose>-->
    <!--<when test="id != null">-->
    <!--id = #{id}-->
    <!--</when>-->
    <!--<when test="username != null">-->
    <!--and username = #{username}-->
    <!--</when>-->
    <!--<when test="password != null">-->
    <!--and password = #{password}-->
    <!--</when>-->
    <!--<when test="age != null">-->
    <!--and age = #{age}-->
    <!--</when>-->
    <!--</choose>-->
    <!--</where>-->
    <!--</select>-->

    <!-- trim  -->
    <select id="findUserByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User">
        select * from t_user
        <trim prefix="where" prefixOverrides="and">
            <if test="id != null">
                id = #{id}
            </if>
            <if test="username != null">
                and username = #{username}
            </if>
            <if test="password != null">
                and password = #{password}
            </if>
            <if test="age != null">
                and age = #{age}
            </if>
        </trim>
    </select>

    <!-- set -->
    <update id="updateUser" parameterType="com.sunjian.entity.User">
        update t_user
        <set>
            <if test="id != null">
                id = #{id},
            </if>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
            <if test="age != null">
                age = #{age}
            </if>
        </set>
        where id = #{id}
    </update>

    <!-- foreach -->
    <select id="findAllByUser" parameterType="com.sunjian.entity.User" resultType="com.sunjian.entity.User">
        select * from t_user
        <where>
            <foreach collection="ids" item="id" open="id in (" close=")" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

</mapper>

4、创建全局config.xml,注册UserRepository.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!-- 打印SQL语句 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 开启延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"></setting>
    </settings>

    <!-- 配置 MyBatis 数据源 -->
    <environments default="development">
        <environment id="development">
            <!-- JDBC事务管理 -->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 注册 -->
    <mappers>

        <mapper resource="com/sunjian/repository/UserRepositoryDynamicSQL.xml"></mapper>

    </mappers>

</configuration>

5、创建测试类,执行查询

package com.sunjian.test;

import com.sunjian.entity.Order;
import com.sunjian.entity.User;
import com.sunjian.repository.OrderRepository;
import com.sunjian.repository.UserRepositoryDynamicSQL;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @author sunjian
 * @date 2020/3/22 10:20
 */
public class TestDynamicSQL {
    public static void main(String[] args) {

        // Mapper 代理实现自定义接口
        InputStream inputStream = User.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取接口的处理对象
        UserRepositoryDynamicSQL userRepositoryDynamicSQL = sqlSession.getMapper(UserRepositoryDynamicSQL.class);
        User user = new User();
        user.setUsername("张三");
        user.setPassword("321");
        User user1 = userRepositoryDynamicSQL.findUserByUser(user);
        System.out.println(user1);

        User u = new User();
        u.setId(2);
        u.setUsername("张三三");
        u.setPassword("123");
        userRepositoryDynamicSQL.updateUser(u);
        sqlSession.commit();
        User user2 = userRepositoryDynamicSQL.findUserByUser(u);
        System.out.println(user2);

        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(6);
        User u2 = new User();
        u2.setIds(list);
        List<User> users = userRepositoryDynamicSQL.findAllByUser(u2);
        for(User us:users){
            System.out.println(us);
        }
    }

}
Opening JDBC Connection
Created connection 1846406218.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6e0dec4a]
==>  Preparing: select * from t_user where age = ?
==> Parameters: 33(Integer)
<==    Columns: id, username, password, age
<==        Row: 2, 张三三, 123, 33
<==      Total: 1
User{id=2, name='张三三', password='123', age=33}
==>  Preparing: update t_user SET id = ?, username = ?, password = ? where id = ?
==> Parameters: 2(Integer), 张三三(String), 123(String), 2(Integer)
<==    Updates: 1
Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6e0dec4a]
==>  Preparing: select * from t_user where id = ? and username = ? and password = ?
==> Parameters: 2(Integer), 张三三(String), 123(String)
<==    Columns: id, username, password, age
<==        Row: 2, 张三三, 123, 33
<==      Total: 1
User{id=2, name='张三三', password='123', age=33}
==>  Preparing: select * from t_user WHERE id in ( ? , ? , ? )
==> Parameters: 1(Integer), 2(Integer), 6(Integer)
<==    Columns: id, username, password, age
<==        Row: 1, 张, 123, 88
<==        Row: 2, 张三三, 123, 33
<==        Row: 6, 张三, 123, 19
<==      Total: 3
User{id=1, name='张', password='123', age=88}
User{id=2, name='张三三', password='123', age=33}
User{id=6, name='张三', password='123', age=19}

OK.

MyBatis框架——动态SQL的更多相关文章

  1. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  2. java Mybatis框架动态SQL

    1.if+where <select id="getgoods" resultType="Goods" > select * from goods ...

  3. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  4. mybatis中的.xml文件总结——mybatis的动态sql

    resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...

  5. MyBatis的动态SQL详解-各种标签使用

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...

  6. Java-MyBatis:MyBatis 3 动态 SQL

    ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...

  7. JavaWeb_(Mybatis框架)动态sql_七

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  8. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  9. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

随机推荐

  1. POJ 2226 Muddy Fields 二分图(难点在于建图)

    题意:给定一个矩阵和它的N行M列,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在板不跨越草,用一些木板盖住这些有水的地方,问至少需要几块板子? 思路:首先想到如果没有不准跨越草的条件则跟 ...

  2. 提高你css技能的css开发技巧

    好久没整理博客了 进来啰嗦两句   继续抄别人的博客 一.resize实现图片对比 resize的语法如下: resize:none | both | horizontal | vertical 案例 ...

  3. 转:zabbix 更改maps图标

    更改Zabbix map图标 Zabbix的maps用来图形化显示监控设备的拓扑图,并且以不同的标记显示故障事件,通过该图表很直观的显示设备的整体情况.系统默认的图标比较简陋,如图十一所示.通过更改系 ...

  4. 编程语言十万个为什么之java web的基础概念

    1.什么是JAVA Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, Ja ...

  5. 添砖加瓦:snappy无损压缩算法

    一.简介 Snappy(旧称:Zippy)是Google基于LZ77的思路用C++语言编写的快速数据压缩与解压程序库,并在2011年开源.其目标并非最大压缩率或与其他压缩程序的兼容性,而是非常高的速度 ...

  6. HTC“卖身”:那些辉煌、落寞与终结

    9月21日,HTC董事会决议通过与谷歌签订合作协议书.前者专注Pixel手机设计研发人才加入谷歌,HTC知识产权非专属授权予Google使用,交易作价11亿美元.事实上,这与微软收购诺基亚不同,并非是 ...

  7. Ubuntu日常使用总结

    Contents 使用了将近一年的Ubuntu,感觉不用windows也可以处理日常的事务.并且我相信只要合理利用Ubuntu,一定可以取代你手中的Windows.我不是说Ubuntu有多么好,只是从 ...

  8. git基本命令(二)

    忽略文件      git可以将用户指定的文件或者目录排除在版本之外,它会检查代码仓库目录下是否存在名为.gitignore文件,如果存在就会一行一行读取这个文件的内容,会将每一行指定的文件或目录排除 ...

  9. 【HI AI:人机协同 赋能未来系列】计算机是最好的左脑

    AI:人机协同 赋能未来系列]计算机是最好的左脑"> 编者按: 计算机领域的热点总是在不断更替,从大数据到云计算再到人工智能,这些热点的背后离不开专家学者们在这些领域一点一滴聚沙成塔的 ...

  10. C++走向远洋——62(项目二1、类模板)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...