MyBatis-模糊查询&动态SQL


title: MyBatis-模糊查询&动态SQL
tags:

  • MyBatis
  • SQL
    abbrlink: 5882fb3c
    categories: 框架
    data: 2020-06-22 10:30:21

本文讲述了模糊查询的操作方法,配置实体类全局路径方法等内容,主要对 MyBatis 的动态SQL查询方式进行了相关总结。

模糊查询

  • #{} sql语句占位符
  • ${} sql语句拼接
select * from student where name like #{data};
-- => select * from student where name like ?;
select * from student where name like '%${data}%'; 
-- => select * from student where name like '%data%';

配置实体类路径 (别名)

在全局配置文件中使用

<!--  别名设置,放在settings标签之下,environment 标签之前  -->
<typeAliases>
	<!-- 单个别名配置 -->
    <typeAlias alias="student" type="com.kawyang.entity.Student"/>
    <!--   批量别名,扫描包内所有内容,别名为类名(首字母大小写都可以)     -->
    <package name="com.kawyang.entity"/>
</typeAliases>

配置文件书写顺序
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,
objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?

动态SQL

if

通过 if 标签可以判断是否包含查询的字段

<select id="findByStudent" parameterType="student" resultType="student">
        select * from student where 1=1
        <if test="name != null and name != ''">
            and name like #{name}
        </if>
        <if test="age != -1">
            and age=#{age}
        </if>
    </select>

where

通过 where 标签可以解决以上 1=1 的多余内容

<select id="findByStudent" parameterType="student" resultType="student">
        select * from student
        <where>
	        <if test="name != null and name != ''">
	            and name like #{name}
	        </if>
	        <if test="age != -1">
	            and age=#{age}
	        </if>
        </where>
    </select>

where 会自动判断第一条判断条件,并将 and 删除

foreach

select * from student where id in (1,2,3);

后端传递的参数为 Integer 的 集合
需要对该集合进行封装

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ListIds extends Serializable{
	private List<Integer> listIds;
}

<!-- 查询所有用户在 id 的集合之中 -->
<select id="findInIds" resultType="student" parameterType="ListIds"> 
<!--select * from student where id in (1,2,3);-->
	select * from student
	<where>
		<if test="ids != null and ids.size() > 0">

			<foreach collection="student" open="id in ( " close=")" separator="," item="id" >
				#{id}
			</foreach>
	    </if>
	</where>
</select>

<select id="findByIds" resultType="com.kawyang.entity.Student" parameterType="com.kawyang.entity.ListIds">
        select * from student
        <where>
        <!-- 
			foreach 
			collection="需要遍历的元素" 
			open="元素之前的部分"
			close="之后部分" 
			separator="分割方式" 
			item="属性名" </foreach>  -->
            <foreach collection="ids"  open="id in ( " close=")" separator="," item="id" >
                #{id}
            </foreach>
        </where>
    </select>

choose

choose 标签,类似 java 中的 switch-case-default 结构。

<select id="findByStu" parameterType="com.item.entity.Student" >
    select * from student
    <where>
        <choose>
            <when test="id != 0">
                id = #{id}
            </when>
            <when test="name != null">
                name=#{name}
            </when>
        </choose>
    </where>

</select>

sql

使用 sql 标签 将 使用次数较多的sql语句用sql🏷️进行定义,使用 include🏷️引入到真正的查询语句中,使用方便。
例子:

<sql id="selectAll" >
    select * from student
</sql>

<select id="findByStudent" parameterType="com.kawyang.entity.Student" resultType="com.kawyang.entity.Student" >
--         select * from student
<include refid="selectAll"></include>
<where>
    <choose>
        <when test="id != 0">
            id=#{id}
        </when>
        <when test="name != null">
            name=#{name}
        </when>
    </choose>
</where>
</select>

注解形式使用动态SQL(待补充)

添加 <script> 标签,即可使用 xml 中形式进行配置。

    @Select("<script>" +
            "select * from student" +
            "        <where>" +
            "            <if test=\"ids != null and ids.size>0\">" +
            "                <foreach collection=\"ids\"  open=\"id in ( \" close=\")\" separator=\",\" item=\"id\" >" +
            "                    #{id}" +
            "                </foreach>" +
            "            </if>" +
            "        </where> " +
            "</script>")
    List<Student> findByIds(ListIds listIds);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值