MyBatis动态拼接sql/构造器

141 阅读2分钟

动态sql拼接

MyBatis框架的动态sql技术是一种根据特定条件动态拼接SQL语句的功能,主要用于解决拼接sql语句字符串时的痛点问题.如在使用购物网站时对商品属性进行筛选,因为商品属性有多重条件,并且可以对多条件进行灵活选择,如果使用传统的方式查询,在拼接sql的时候会造成一系列的问题.

if标签(常用于sql语句条件判断)

  • 在UserMapper.xml配置文件下添加.
  • 注意:在查询中 select标签下必须添加resultType="实体类路径".

if标签介绍

如果条件成立就附加<if></if>之间的[sql语句],如果条件不成立就不附加<if></if>之间的sql语句。书写格式为:<if test="表达式">sql语句</if>
复制代码
<select id="selectByMoney" resultType="demo01.entity.User">
    select * from t_user
    <where>
        <if test="money != null and money != '' ">
            and money>1000
        </if>
    </where>
</select>
复制代码

foreach标签

foreach介绍

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有item,indexopen,separator,close。
复制代码
  • item表示中每一个元素进行迭代时的别名.
  • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置.
  • open表示该语句以什么开始.
  • separator表示在每次进行迭代之间以什么符号作为分隔符.
  • close表示以什么结束.
<select id="selectByUserIDs" resultType="demo01.entity.User">
    select * from t_user
    <where>
        <foreach collection="ids" open="and id in (" item="id" separator="," close=")">
            #{id}
        </foreach>
    </where>
</select>
复制代码

sql标签(简化sql语句重复编写问题)

mybatis的`<sql>` 标签一般是用来封装sql语句、或者复用语句的,然后用`<include>`标签来调用
复制代码
<sql id="sql_temp">
    select id ,user_name, passwd, money from t_user
 </sql>
复制代码
<select id="login" resultType="demo01.entity.User">
    <include refid="sql_temp"></include> where user_name=#{userName} and passwd=#{passwd}
</select>
复制代码

构造器

1.QueryWrapper

继承了AbstractWrapper ,自身属性内的entity实体类可作为where条件,可以通过 new QueryWrapper().lambda() 方法获取到 LambdaQueryWrapper

实例化抽象类接口UserDao

@Autowired(required = false)
private UserDao dao;
复制代码

条件查询

/**
 * 条件查询
 * @return
 */
@RequestMapping("/hhhhh")
public List<User> t1(){
    // 创建条件构造器对象
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // select * from t_user user_name='111'
    queryWrapper.eq("user_name","Lily");
    // select * from t_user where user_name='Lily' and money between 0 and 70
    queryWrapper.between("money",0,70);
    // 调用MyBatis自带的查询方法
    List<User> users = dao.selectList(queryWrapper);
    return users;
}
复制代码

image.png

模糊查询

/**
 * 模糊查询
 * @return
 */
@RequestMapping("/selectLike")
public List<User> nameLike(){
    // 创建构造器对象
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 模糊查询 like为整体模糊查询 likeleft左模糊
    queryWrapper.like("user_name","L");
    List<User> list = dao.selectList(queryWrapper);
    return list;
}
复制代码

image.png

排序

/**
 * asc升序
 * @return
 */
@RequestMapping("/orderByMoney")
public List<User> order(){
    // 创建条件构造器对象
    QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
    // select * from t_user order by money asc
    queryWrapper.orderByAsc("money");   // 按money升序
    List<User> list = dao.selectList(queryWrapper);
    return list;
}
复制代码

image.png

子查询

 /**
  * 子查询
  * @return
  */
 @RequestMapping("/inSqlDemo")
public List<User> selectByChild(){
     QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper.inSql("id","select id from t_user where money between 100 and 2000");
    List<User> list = dao.selectList(queryWrapper);
    return list;
}
复制代码

image.png

2.UpdateWrapper

继承了AbstractWrapper ,自身属性内的entity实体类可作为where条件,可以通过 new UpdateWrapper().lambda() 方法获取到 LambdaQueryWrapper

作者:一舟_
链接:juejin.cn/post/716648…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。