当前位置: 代码迷 >> 综合 >> mybatis动态sql中的if、where、choose、trim、foreach方法
  详细解决方案

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

热度:78   发布时间:2023-11-29 14:35:44.0

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.xmlReader 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.xmlReader 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.xmlReader reader = Resources.getResourceAsReader("mybatis.xml");//chuangjianSqlSessionFactory工厂SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//根据获取的工厂对象SqlSession sqlSession = sqlSessionFactory.openSession();//通过映射获取AccountDao accountDao = sqlSession.getMapper(AccountDao.class);//使用choose、when、otherwiseList<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.xmlReader 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.xmlReader reader = Resources.getResourceAsReader("mybatis.xml");//chuangjianSqlSessionFactory工厂SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//根据获取的工厂对象SqlSession sqlSession = sqlSessionFactory.openSession();//通过映射获取AccountDao accountDao = sqlSession.getMapper(AccountDao.class);//foreachInteger[] 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.xmlReader 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);//设置分页的条件//调用方法//foreachInteger[] 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);}
}

结果:

在这里插入图片描述

  相关解决方案