有勇气的牛排博客
☰

javaWeb MyBatis(六)动态sql where foreach sql片段

有勇气的牛排 1759 Java 2021-10-22 11:38:14

知止自律打卡-微信小程序APP
一款微信自律打卡小程序,支持自定义打卡项目、习惯记录、项目日记、专注计时与数据统计。自律打卡、学习打卡、读书打卡、健身打卡、运动打卡、减肥打卡、戒色打卡、养生打卡、戒烟、戒酒、戒熬夜等多种场景。万能打卡模板自由创建。可自定义每日打卡目标,记录习惯连续天数,可视化追踪成长进度。
了解产品详情 →
微信搜索「知止自律打卡」
知止自律打卡微信小程序

1 案例

传递pojo综合查询用户信息

2 UserMapper.xml

<!-- 传递pojo综合查询用户信息 -->
< select id="findUserList" parameterType="UserBean" resultType="UserBean">
    select * from user where 1=1
    < if test="id!=null and id!=''">
        and id=#{id}
    < /if>
    < if test="username!=null and username!=''">
        and username like "%#{username}%"
    < /if>
< /select>

3 UserMapper.java

package net920vip.mapper;

import net920vip.bean.UserBean;

import java.util.List;

/**
 * 接口文件 对应UserMapper.xml文件
 * 用户管理mapper
 * */
public interface UserMapper {

    // 根据id查询user
    public UserBean findUserById(int id) throws Exception;
    // 根据用户名模糊查询
    public List<UserBean> findUserByUsername(String username)throws Exception;
    // 新增user 返回类型 int或void均可
    public int insertUser(UserBean user) throws Exception;
    // 新增user 返回类型 int或void均可
    public int updateUserById(UserBean user) throws Exception;
    // 根据user删除user
    public int deleteUserById(int id) throws Exception;
    // 传递pojo综合查询用户信息
    public List<UserBean> findUserList(UserBean USER) throws Exception;

}

4 Test.java

// 使用sql片段,综合查询测试
List<UserBean> userList = userMapper.findUserList(null);
// 查询所有
//System.out.println(userList.toString());

//
UserBean user = new UserBean();
user.setId(10);
List<UserBean> userList1 = userMapper.findUserList(user);
System.out.println(userList1.toString());

5 加入where对UserMapper.xml升级

sql只接收一个数组参数,这时sql解析参数的明湖曾mybatis固定为array,如果数组是通过一个pojo传递到sql则参数的名称为poji中的属性名。

<!-- 传递pojo综合查询用户信息 -->
<!--< select id="findUserList" parameterType="UserBean" resultType="UserBean">-->
<!--    select * from user where 1=1-->
<!--    < if test="id!=null and id!=''">-->
<!--        and id=#{id}-->
<!--    < /if>-->
<!--    < if test="username!=null and username!=''">-->
<!--        and username like "%#{username}%"-->
<!--    < /if>-->
<!--</ select>-->

<select id="findUserList" parameterType="UserBean" resultType="UserBean">
    select * from user
    < where>
        < if test="id!=null and id!=''">
            and id=#{id}
        < /if>
        < if test="username!=null and username!=''">
            and username like "%#{username}%"
        < /if>
    </ where>
< /select>

6 foreach

向sql传递数组或List,mybatis使用foreach解析,如下

UserMapper.xml

<select id="selectUserByIds" parameterType="java.util.List" resultType="UserBean">
    select * from user
    <where>
        <if test="list != null">
            <foreach collection="list" item="id" open="and id in(" separator="," close=")">
                #{id}
            </foreach>
        </if>
    </where>
</select>

如果数组中是简单类型,则写为#{item},不用通过ognl获取对象属性值了

接口:UserMapper.java

package net920vip.mapper;

import net920vip.bean.UserBean;

import java.util.List;

/**
 * 接口文件 对应UserMapper.xml文件
 * 用户管理mapper
 * */
public interface UserMapper {

    // 批量根据ids查询
    public List<UserBean> selectUserByIds(List<Integer> list) throws Exception;

}

Test.java

// 使用foreach动态sql,批量查询  传空 null:查询所有
ArrayList<Integer> list = new ArrayList<>();

// list.add(1);
// list.add(10);
// List<UserBean> users = userMapper.selectUserByIds(list);

List<UserBean> users = userMapper.selectUserByIds(Arrays.asList(1,10));
System.out.println(users.toString());

7 sql片段

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

<!-- 抽取模板-->
<sql id="query_user_sql">
    <if test="id!=null and id!=''">
        and id=#{id}
    </if>
    <if test="username!=null and username!=''">
        and username like "%#{username}%"
    </if>
</sql>

<!-- 传递pojo综合查询用户信息 -->
<select id="findUserList" parameterType="UserBean" resultType="UserBean">
    select * from user
    <where>
        <!--            <if test="id!=null and id!=''">-->
        <!--                and id=#{id}-->
        <!--            </if>-->
        <!--            <if test="username!=null and username!=''">-->
        <!--                and username like "%#{username}%"-->
        <!--            </if>-->
        <include refid="query_user_sql"/>
    </where>
</select>

注意:如果引用其他mapper.xml的片段,则在引用时需要加上namspace,如下

<include refid="namespace.sql片段id"/>

gitee地址:https://gitee.com/net920vip/mybatis-demo01.git

标签:

×
×