mybatis黑马:三个标签操作:if,where,foreach

1. 配置 查询结果的列名和实体类的属性名的对应关系

  • 当User.java中的属性名和创建的User表中的列名不一致时,为了使程序不报错,要在IUserDao.xml中配置对应关系。
  • 虽然创建表的字段名与User属性名不一致,但是表字段名与column名称一致,这样就算2个名称不相同也行。
  • 一般属性名最好与表的字段名一致,避免很多麻烦。

配置如下:
在这里插入图片描述


2. if标签(if如果)

这里的resultType变成了resultMap,resultMap是上述配置 查询结果的列名和实体类的属性名的对应关系中已经配置好了,以后SQL语句的返回值类型都可以写resultMap=“userMap”,前提是已经配置好resultMap标签,如下。

 <resultMap id="userMap" type="uSeR">
 
 通过id名访问到type属性是com.jh.domain.User实体类

记住这里的and必须写

 <!--根据if标签查询:select * from user where 1=1 and username=? and sex = ?  -->
    <select id="findUserByIf" resultMap="userMap">
        select * from user where 1=1
        <if test="username!=null">
            and username=#{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </select>

3. where标签(条件)

添加where标签可以省略 if标签中 where 1=1

 <!--根据where标签查询:select * from user where 1=1 and username=? and sex = ?  -->
    <select id="findUserByWhere" resultMap="userMap">
        select * from user <!--where标签不加where 1=1-->
        <where>
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
        </where>
    </select>

4. foreach标签(同for一样)

抽取重复的SQL语句,下面的代码include标签用到
<sql id="defaultUser">
        select * from user
    </sql>
 <!-- 根据queryvo中的Id集合实现查询用户列表:foreach标签-->
    <select id="findUserInIds" resultMap="userMap" parameterType="queryVo">
        <include refid="defaultUser"></include> <!--抽取重复的SQL语句-->
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

5. 主要代码

完整的IUserDao.xml代码

<?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.jh.dao.IUserDao">

    <!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap id="userMap" type="uSeR">
        <!-- 主键字段的对应
        <id property="id" column="id"></id>
        &lt;!&ndash;非主键字段的对应&ndash;&gt;
        <result property="username" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>-->
    </resultMap>

    <!--配置查询所有-->
    <select id="findAll" resultType="uSer">
        select * from user
    </select>

    <!--保存用户:typeAliases配置别名,useR不再区分大小写-->
    <insert id="saveUser" parameterType="useR">
        <!--配置插入操作后,获取插入数据的id-->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user (username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday});
    </insert>

    <!--根据id查询用户-->
    <select id="findById" parameterType="INT" resultType="com.jh.domain.User">
        select * from user where id=#{Uid}<!--这里id命名无所谓-->
    </select>

    <!--根据名称模糊查询-->
    <select id="findByName" parameterType="string" resultType="com.jh.domain.User">
        <!--select * from user where username like #{name}-->
        select * from user where username like '%${value}%'
    </select>

    <!-- 获取用户的总记录条数 -->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>

    <!--根据if标签查询:select * from user where 1=1 and username=? and sex = ?  -->
    <select id="findUserByIf" resultMap="userMap">
        select * from user where 1=1
        <if test="username!=null">
            and username=#{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </select>

    <!--根据where标签查询:select * from user where 1=1 and username=? and sex = ?  -->
    <select id="findUserByWhere" resultMap="userMap">
        select * from user <!--where标签不加where 1=1-->
        <where>
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
        </where>
    </select>

    <!--了解的内容:抽取重复的sql语句-->
    <sql id="defaultUser">
        select * from user
    </sql>

    <!-- 根据queryvo中的Id集合实现查询用户列表:foreach标签-->
    <select id="findUserInIds" resultMap="userMap" parameterType="queryVo">
        <include refid="defaultUser"></include>
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>
</mapper>

IUserDao.java三个标签代码

public interface IUserDao {
 /**
     *根据传入参数条件:If标签
     * user查询的条件:有可能是用户名,有可能是性别,也有可能是地址,还有可能是都有
     * */
    List<User>findUserByIf(User user);
    /**
     *根据传入参数条件:where标签
     * user查询的条件:有可能是用户名,有可能是性别,也有可能是地址,还有可能是都有
     * */
    List<User>findUserByWhere(User user);
    /**
     * 根据queryvo中提供的id集合,查询用户信息:foreach标签
     * @param vo
     * @return
     */
    List<User> findUserInIds(QueryVo vo);
 }

User.java的主要代码
省略了set和get方法,toString()方法;另外,属性名与表的字段名不一致:Address Sex Birthday。

public class User implements Serializable {
    private Integer id;
    private String username;
    private String Address;
    private String Sex;
    private Date Birthday;
}

QueryVo.java

package com.jh.domain;

import java.util.List;

public class QueryVo {
    private User user;
    private List<Integer> ids;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

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

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

测试的主要代码:三个标签

/**
     * 测试If标签查询
     */
    @Test
    public void testfindUserByIf() {
        User user = new User();
        user.setUsername("老王");
        user.setSex("女");
        //5.执行查询一个方法
        List<User> users = userDao.findUserByIf(user);
        for (User u : users) {
            System.out.println(u);
        }
    }

    /**
     * 测试where标签查询
     */
    @Test
    public void testfindUserByWhere() {
        User user = new User();
        user.setUsername("老姜");
        user.setSex("女");
        //5.执行查询一个方法
        List<User> users = userDao.findUserByWhere(user);
        for (User u : users) {
            System.out.println(u);
        }
    }

    /**
     * 测试foreach标签的使用
     */
    @Test
    public void testFindInIds() {
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(41);
        list.add(42);
        list.add(43);
        vo.setIds(list);
        //5.执行查询所有方法
        List<User> users = userDao.findUserInIds(vo);
        for (User user : users) {
            System.out.println(user);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值