zoukankan      html  css  js  c++  java
  • Mybatis入门笔记(6)——动态SQL

    (会用)

    if标签

    <if>标签的 test 属性中写的是对象的属性名,

    映射配置文件

    <!-- 根据用户名和性别查询 -->
    <select id="findUserByUserNameAndSex" parameterType="com.ben.domain.User" resultType="com.ben.domain.User">
        select * from user where 1=1
        <if test="username != null and username != ''">
            and username like '%${username}%'
        </if>
        <if test="sex != null and sex != ''">
            and sex = #{sex}
        </if>
    </select>
    

    持久层接口

    //根据用户名和性别查询
    List<User> findUserByUserNameAndSex(User user);
    

    测试文件

    //根据用户名和性别查询
    @Test
    public void testFindUserByUserNameAndSex(){
        User user = new User();
        user.setUsername("王");
        List<User> users = userdao.findUserByUserNameAndSex(user);
        for(User u : users) {
            System.out.println(u);
        }
    }
    

    where标签

    为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。

    作用

    1. 自动向sql语句中添加where关键字
    2. 去掉第一个条件的and关键字

    映射配置文件

    <select id="findUserByUserNameAndSex" parameterType="com.ben.domain.User" resultType="com.ben.domain.User">
            select * from user
            <where>
                <if test="username != null and username != ''">
                    and username like '%${username}%'
                </if>
                <if test="sex != null and sex != ''">
                    and sex = #{sex}
                </if>
            </where>
    
        </select>
    

    SQL语句等价于:select * from user WHERE username like '%王%'

    Sql片段

    Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。

    <!--抽取重复的语句代码片段-->
    <sql id="defaultsql">
        select * from user
    </sql>
    <!--    查询所有-->
    <select id="findAll" resultType="com.ben.domain.User">
    <include refid="defaultsql"></include>
    </select>
    
    <!-- 通过Id查询一个用户   -->
    <select id="findUserById" parameterType="Integer" resultType="com.ben.domain.User">
        <include refid="defaultsql"></include>
        where id = #{v}
    </select>
    

    foreach标签

    <foreach>标签用于遍历集合.

    属性:

    collection:代表要遍历的集合元素,注意不要写#{}

    open:语句的开始部分

    close:结束部分

    item:遍历集合的每个元素,生成的变量名

    sperator:分隔符

    举例:

    select * from user where id in(1,45,46,47,48)
    

    其对应的xml写法:

    
    <select id="findByIds" parameterType="com.ben.domain.QueryVo" resultType="com.ben.domain.User">
        select * from user
        <where>
            <if test="ids != null and ids.size() > 0">
                <foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>
    

    测试类写法:

    @Test
    public void testFindByIds(){
        QueryVo vo = new QueryVo();
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(45);
        ids.add(46);
        ids.add(47);
        ids.add(48);
        vo.setIds(ids);
        //6.执行操作
        List<User> users = userdao.findByIds(vo);
        for(User user : users) {
            System.out.println(user);
        }
    }
    

    QueryVo写法

    package com.ben.domain;
    import java.io.Serializable;
    import java.util.List;
    
    /**
     * @ClassName: QueryVo
     * @author: benjamin
     * @version: 1.0
     * @description: 查询条件对象
     * @createTime: 2019/07/15/17:35
     */
    
    public class QueryVo implements Serializable {
    
        private User user;
        private List<Integer> ids;
    
        public List<Integer> getIds() {
            return ids;
        }
    
        public void setIds(List<Integer> ids) {
            this.ids = ids;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    }
    
  • 相关阅读:
    js正则表达式大全(2)
    Magic Trackpad 2 on win10 x64
    Google 日历短信通知没有了
    Ueditor 1.4.3 jsp utf-8版Bug修复
    [转]eclipse中build workspace的相关优化
    Hello,
    EpCloud开发日志
    为服务创建安装程序
    winform 通过WCF上传Dataset数据
    opcrcw.da.dll 和.net 4.0
  • 原文地址:https://www.cnblogs.com/benjieqiang/p/11204283.html
Copyright © 2011-2022 走看看