Mybatis之常用动态Sql语句

数据库结构、实体类

java 复制代码
public class Youth {

    private Integer id;
    private String username;
    private Date birthday;
    private Character sex;
    private String address;
    private Integer age;


    public Youth(Integer id, String username, Date birthday, Character sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Youth() {
    }

    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 Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Character getSex() {
        return sex;
    }

    public void setSex(Character sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Youth{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex=" + sex +
                ", address='" + address + '\'' +
                ", age=" + age +
                '}';
    }
}

where-if

where-if多用于查询含有某个特征语句上 如果 where标签内的条件成立 它会自动去掉条件语句开头多余的 and 或者 or

它会通过判断是否符合test中的属性来进行选择性执行 会将满足此条件的内置语句进行嵌入到sql语句中进行执行

在接口文件中写入

java 复制代码
List<Youth> getYouthBywhereif(Youth youth);

在映射文件中写入

java 复制代码
<select id="getYouthBywhereif" resultType="youth">
        select * from youth
        <where>
            <if test=" username != null and username !='' ">
                and username = #{username}
            </if>
            <if test="birthday != null">
                and birthday = #{birthday}
            </if>
            <if test="sex!=null and sex!=''"  >
                and sex= #{sex}
            </if>
            <if test="address!=null and address!=''">
                and address = #{address}
            </if>
            <if test="age!=null">
                and age = #{age}
            </if>
        </where>
    </select>

测试类中写入

java 复制代码
@Test
    public void getYouthBywhereifTest(){
        Youth youth = new Youth();
        youth.setSex('男');
        youth.setAddress("北京");
        List<Youth> youths = youthMapper.getYouthBywhereif(youth);
        for(Youth y:youths){
            System.out.println(y);
        }
    }

执行结果为

set-if

set-if多用于选择性修改操作上 它会自动去掉条件语句结尾多余的 ,

在映射文件中写入

java 复制代码
<update id="updateYouthBysetif" parameterType="youth">
        update youth
        <set>
            <if test="username!=null and username!=''">
                username = #{username},
            </if>
            <if test="birthday!=null">
                birthday =#{birthday},
            </if>
            <if test="sex!=null and sex!=''">
                sex = #{sex},
            </if>
            <if test="address!=null and address!=''">
                address=#{address},
            </if>
            <if test="age!=null">
                age = #{age}
            </if>
        </set>
        <where>
            id=#{id}
        </where>
    </update>

在测试类中写入

java 复制代码
@Test
    public void updateYouthBysetifTest(){
        Youth youth = new Youth(4,"张三", new Date(2019 - 1900,10 - 1,9),'男',"北京");
        int i = youthMapper.updateYouthBysetif(youth);
        if(i>0)
            System.out.println("修改成功");
        else
            System.out.println("修改失败");
    }

执行结果为

特别须知

  1. 在test中非字符串类型 不可使用 属性 != ' '
  2. 建议将实体类的属性使用包装类进行修饰 因为非包装类不能使用 类似于age != null 的格式
相关推荐
lifewange28 分钟前
Redis 集合(Set)运算完全指南
数据库·chrome·redis
TDengine (老段)36 分钟前
TDengine RAFT共识协议 — 选举、日志复制、快照与仲裁
android·大数据·数据库·物联网·架构·时序数据库·tdengine
Full Stack Developme1 小时前
Spring Boot 事务管理完整教程
java·数据库·spring boot
m0_702036533 小时前
mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑
jvm·数据库·python
qxwlcsdn3 小时前
如何用 IndexedDB 存储从 API 获取的超大列表并实现二级索引
jvm·数据库·python
phltxy4 小时前
Redis 主从复制
java·数据库·redis
2301_809244534 小时前
C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】
jvm·数据库·python
知识汲取者4 小时前
巨量引擎营销 API 完整文档
开发语言·数据库·python
j7~5 小时前
【MYSQL】在Centos7和ubuntu22.04环境下安装
数据库·c++·mysql·ubuntu·centos
环流_5 小时前
redis:持久化rdb
java·数据库·redis