mybatis动态sql中的if、where、choose、trim、foreach方法

mybatis笔记03

1.动态sql语句–》sql拼接

1.1 if方法

相当于el表达式中的if(){}语句

参数类型不同,if标签中test的参数是怎么说明的呢?

1)如果参数的类型是数字类型,只需要判断是否为null就可以了

<if test="id!=null">
	sql语句
</if>

2)如果参数的类型是字符串类型,test中的条件如下所示:

<if test="name!=null and name!=''">
	sql语句
</if>
接口中:
    /**
     * 使用if方法,并根据名字来获取数据信息
     * @param name
     * @return
     */
    public List<Account> getAllWithIf(String name);
mapper.xml中
<!--id中的getAllWithIf与接口中的方法名一致,如果不一致会报错-->
<select id="getAllWithIf" resultType="com.hong.enetity.Account">
        select * from account where 1=1
    	<!--if当中的条件均为true时可以根据name查询,如果为false,那么查询所有的信息-->
        <if test="name!=null and name!=''">
            and name like concat('%',#{name},'%')
        </if>
</select>
测试:
public class AccountTest {
    public static void main(String[] args) throws Exception{
        //读取配置文件mybatis.xml
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //chuangjianSqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //根据获取的工厂对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射获取
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
        //通过映射获取的对象调用接口中的方法
        List<Account> list = accountDao.getAllWithIf("冬");
        System.out.println(list);
}
结果:if条件中如果为false时,结果如下:

在这里插入图片描述

if条件为true时结果如下:

在这里插入图片描述

1.2 where、if方法

接口中:
/**
     * 使用where方法,根据名字和isdeleted获取用户信息
     * @param name
     * @return
     */
    public List<Account> getAllWithWhere(@Param("name") String name,@Param("isdeleted") Integer isdeleted);
映射文件中:
<select id="getAllWithWhere" resultType="com.hong.enetity.Account">
        select * from account
    	<!--where 标签相当于sql语句后边的条件语句where,where标签中的两个if标签相当与循环语句中的if(){}else{}-->
        <where>
            <if test="name!=null and name!=''">
                and name like concat('%',#{name},'%')
            </if>
            <if test="isdeleted!=null">
                and isdeleted=#{isdeleted}
            </if>
        </where>
    </select>
测试:
public class AccountTest {
    public static void main(String[] args) throws Exception{
        //读取配置文件mybatis.xml
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //chuangjianSqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //根据获取的工厂对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射获取
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
        //使用where方法
        List<Account> list = accountDao.getAllWithWhere("冬",0);
        System.out.println(list)
}        
结果:

在这里插入图片描述

1.3 使用choose、when、otherwise

​ 当使用sql语句的时候,有时不想使用所有的条件,而是从中选择需要的。使用if标签时,test中的表达式若为true。就会执行if标签中的条件。但mybatis中提供了choose方法,if标签是与(and)的关系,而choose是或(or)的关系。

​ 如果choose标签中的when标签中的test条件有一个为true就结束,但如果when中的test条件为false时,就要执行otherwise标签中的条件,就相当于Java中的switch语句,when为case,otherwise就相当于default。

接口中的方法:
/**
     * 使用choose,when,otherwise 方法,根据名字和isdeleted获取用户信息
     * @param name
     * @param isdeleted
     * @return
     */
    public List<Account> getAllWithChooseWhenAndOtherWise(@Param("name") String name,@Param("isdeleted") Integer isdeleted);
映射文件中:
<select id="getAllWithChooseWhenAndOtherWise" resultType="com.hong.enetity.Account">
        select * from account
        <where>
            <choose>
                <when test="name!=null and name!=''">
                    and name like concat('%',#{name},'%')
                </when>
                <when test="isdeleted!=null">
                    and isdeleted=#{isdeleted}
                </when>
                <otherwise>
                    and money>1000
                </otherwise>
            </choose>
        </where>
    </select>
测试:
public class AccountTest {
    public static void main(String[] args) throws Exception{
        //读取配置文件mybatis.xml
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //chuangjianSqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //根据获取的工厂对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射获取
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
		//使用choose、when、otherwise
        List<Account> list = accountDao.getAllWithChooseWhenAndOtherWise(null, 0);
        System.out.println(list);
        }
}
结果:

在这里插入图片描述

1.4 trim 方法

​ mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。

接口中的方法:
/**
     * 使用tirm方法,根据名字和isdeleted获取用户信息
     * @param name
     * @return
     */
    public List<Account> getAllWithTirm(@Param("name") String name,@Param("isdeleted") Integer isdeleted);
映射文件:
<select id="getAllWithTirm" resultType="com.hong.enetity.Account">
        select * from account
    	<!--prefix:给sql语句拼接的前缀
			prefixOverrides:去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"
			suffix:给sql语句拼接的后缀
			suffixOverrides:给sql语句拼接的后缀
			-->
        <trim prefix="where" prefixOverrides="and|or">
            <choose>
                <when test="name!=null and name!=''">
                    and name like concat('%',#{name},'%')//去除and
                </when>
                <when test="isdeleted!=null">
                    and isdeleted=#{isdeleted}
                </when>
                <otherwise>
                    and money>1000
                </otherwise>
            </choose>
        </trim>
    </select>
测试:
public class AccountTest {
    public static void main(String[] args) throws Exception{
        //读取配置文件mybatis.xml
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //chuangjianSqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //根据获取的工厂对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射获取
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
		//使用trim方法
        List<Account> list = accountDao.getAllWithTirm("冬", 0);
        System.out.println(list);
    }
}
结果:

在这里插入图片描述

1.5 foreach

作用:用于把sql语句的拼接
向sql传递数组或List,mybatis使用foreach解析,foreach参数定义如下:collection指定输入 对象中集合属性, item每个遍历生成对象中,open开始遍历时拼接的串,close结束遍历时拼接的串,separator:遍历的两个对象中需要拼接的串。

接口中的方法:
/**
     * 使用foreach方法,根据id遍历获取信息
     * @return
     */
    public List<Account> getAllWithForeach(@Param("ids") Integer[] ids);
映射文件:
<select id="getAllWithForeach" resultType="com.hong.enetity.Account">
        select * from account
        <where>
            <if test="ids!=null and ids.length>0">
                id in
                <foreach collection="ids" open="(" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>
测试:
public class AccountTest {
    public static void main(String[] args) throws Exception{
        //读取配置文件mybatis.xml
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //chuangjianSqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //根据获取的工厂对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射获取
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
		//foreach
        Integer[] ids={1,2,5,6,7,8};
        List<Account> list = accountDao.getAllWithForeach(ids);
        System.out.println(list);
    }
}
结果:

在这里插入图片描述

2.添加一个分页插件

在之前,使用的都是layui自带的那个分页,直接在实体类中加了要使用的字段。现在用了分页插件

2.1 先引入依赖

 <!--引入分页插件依赖-->
 <dependency>
     <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper</artifactId>
     <version>5.1.11</version>
 </dependency>

2.2 在mybatis.xml中使用分页插件

<!--使用分页插件-->
    <plugins>
        <!--com.github.pagehlper为PageHelper类所在的包名-->
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

2.3 测试

这里的pageInfo是一个包装类,将分页的一些方法封装起来,如果要使用的话,必须先通过创建一个pageInfo对象,再根据这个对象来调用方法。

PageInfo底层源码中的方法

在这里插入图片描述

public class AccountTest {
    public static void main(String[] args) throws Exception{
        //读取配置文件mybatis.xml
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //chuangjianSqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //根据获取的工厂对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射获取
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
        //使用分页
        PageHelper.startPage(1,2);//设置分页的条件
        //调用方法
        //foreach
        Integer[] ids={1,2,5,6,7,8};
        List<Account> list = accountDao.getAllWithForeach(ids);
        //分页的包装类,把关于分页的一些方法封装起来,需要通过创建pageInfo对象才可以调用需要的方法
        PageInfo pageInfo = new PageInfo(list);
        System.out.println("获取总页数:"+pageInfo.getPages());
        System.out.println("获取总条数:"+pageInfo.getTotal());
        System.out.println("当前显示页码:"+pageInfo.getPageNum());
        System.out.println("当前页码的数据:"+pageInfo.getList());
//        System.out.println(list);
    }
}
结果:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值