Sql构建

Sql构建

SQL 构建对象介绍

  • 之前通过注解开发时,相关 SQL 语句都是直接拼写的,一些关键字写起来比较麻烦、而且容易出错

  • MyBatis 提供了 org.apache.ibatis.jdbc.SQL 功能类,专门用于构建 SQL 语句

sql拼接测试:

java 复制代码
public class SqlTest {
    public static void main(String[] args) {
        String sql = getSql();
        System.out.println(sql);
    }
​
    public static String getSql(){
        String sql =new SQL(){
            {
            SELECT("*");
            FROM("student");
            }
        }.toString();
        return sql;
    }
}

1. 查询功能的实现

  • 定义功能类并提供获取查询的 SQL 语句的方法

  • @SelectProvider:生成查询用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

1.1 构建成SQL语句功能类对象

java 复制代码
public class ReturnSql {
    //定义方法,返回查询的sql语句
    public String getSelectAll(){

        return new SQL(){
            {
                SELECT("*");

                FROM("t_user");
            }
        }.toString();
    }
}

更改mapper接口方法:

java 复制代码
public interface UserMapper {
   // @Select("select * from t_user")
    @SelectProvider(type = ReturnSql.class,method = "getSelectAll")
    public List<User> selectAll();
}

1.2 实现动态SQL查询

根据id和名字查询用户信息:

java 复制代码
public String getFindUser(User user){
        return new SQL() {
            {
            SELECT("*");
            FROM("t_user");
            if(user.getId()!=0){
                WHERE("id=#{id}");
            }
                if (user.getUsername()!=null && user.getUsername()!=""){
                    AND().WHERE("username =#{username}");
                }
        }
        }.toString();
    }

mapper文件:

java 复制代码
@SelectProvider(type = ReturnSql.class,method = "getFindUser")
    public List<User> findColl(User user);

测试代码:

java 复制代码
 @Test
    public  void test02(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setId(4);
        user.setUsername("小马");
        List<User> coll = mapper.findColl(user);
        for (User user1 : coll) {
            System.out.println(user1);
        }
    }

根据名字和地址模糊查询

功能类对象里面编写方法:

java 复制代码
 public String getLikeUser(User user){
        return new SQL() {
            {
               SELECT("*");
               FROM("t_user").WHERE("1=1");
          if (user.getUsername()!=null && user.getUsername()!=""){
          AND().WHERE("username like concat('%',#{username},'%')");
​
                }
                if(user.getAddress()!=null && user.getAddress()!=""){
             AND().WHERE("address like concat('%',#{address},'%')");
                }
            }
        }.toString();
    }

mapper接口里面编写:

java 复制代码
 @SelectProvider(type = ReturnSql.class,method = "getLikeUser")
    public List<User> findLike(User user);

测试类编写:

java 复制代码
 @Test
    public  void test02(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setUsername("小");
        user.setAddress("郑");
        List<User> coll = mapper.findLike(user);
        for (User user1 : coll) {
            System.out.println(user1);
        }
    }

2. 新增功能的实现

  • 定义功能类并提供获取新增的 SQL 语句的方法

  • @InsertProvider:生成新增用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

2.1 编写功能类对象

java 复制代码
 //定义方法,返回新增的sql语句
    public String getInsert(User user) {
        return new SQL() {
            {
                INSERT_INTO("t_user");
                INTO_VALUES("#{id},#{username},#{sex},#{address},#{birthday}");
            }
        }.toString();
    }

2.2 编写mapper接口方法

java 复制代码
 //@Insert("INSERT INTO user VALUES (#{id},#{username},#{sex},#{address},#{birthday})")
    @InsertProvider(type = ReturnSql.class,method = "getInsert")
    public Integer insert(User user);

2.3 编写测试类

java 复制代码
 @Test
    public void test03(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
       // user.setId();
        user.setUsername("李名");
        user.setAddress("新乡");
        user.setSex("男");
        user.setBirthday(Date.valueOf("2022-09-08"));
        Integer insert = mapper.insert(user);
        System.out.println(insert);
    }

3. 修改功能的实现

  • 定义功能类并提供获取修改的 SQL 语句的方法

  • @UpdateProvider:生成修改用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

代码实现:

3.1 编写功能类对象

java 复制代码
 //定义方法,返回修改的sql语句
    public String getUpdate(User user) {
        return new SQL() {
            {
                UPDATE("t_user");
                SET("username=#{username}","sex=#{sex}");
                WHERE("id=#{id}");
            }
        }.toString();
    }

3.2 编写mapper接口类

java 复制代码
  //修改功能
//@Update("UPDATE student SET  username=#{username},sex=#{sex} where id=#{id}")
 @UpdateProvider(type = ReturnSql.class , method = "getUpdate")
 public abstract Integer update(User user);

3.3 测试运行

java 复制代码
   @Test
    public void test03(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setId(9);
        user.setUsername("李明");
        user.setAddress("新乡");
        user.setSex("男");
        user.setBirthday(Date.valueOf("2022-09-08"));
        Integer update = mapper.update(user);
        System.out.println(update);
    }

4. 动态sql实现修改模式

4.1 编写功能类

java 复制代码
 //动态sql实现修改
    public String doUpdate(User user){
        return  new SQL(){
            {
                UPDATE("t_user");
                if(user.getUsername()!=null){
                    SET("username=#{username}");
                }
                if (user.getSex()!=null){
                    SET("sex=#{sex}");
                }
                if(user.getAddress()!=null){
                    SET("address=#{address}");
                }
                if (user.getId()!=null){
                    WHERE("id=#{id}");
                }
            }
        }.toString();
    }

4.2 编写mapper接口方法

java 复制代码
@UpdateProvider(type = ReturnSql.class , method = "doUpdate")
 public abstract Integer update(User user);

5. 删除功能的实现

  • 定义功能类并提供获取删除的 SQL 语句的方法

  • @DeleteProvider:生成删除用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

定义功能类:

java 复制代码
 //定义方法,返回删除的sql语句
    public String getDelete(Integer id) {
        return new SQL() {
            {
                DELETE_FROM("t_user");
                WHERE("id=#{id}");
            }
        }.toString();
    }

定义mapper接口方法:

java 复制代码
 //删除功能
    //@Delete("DELETE FROM t_user WHERE id=#{id}")
    @DeleteProvider(type = ReturnSql.class , method = "getDelete")
    public abstract Integer delete(Integer id);
相关推荐
全靠bug跑6 小时前
Spring Cache 实战:核心注解详解与缓存过期时间配置
java·redis·springcache
聆风吟º6 小时前
【数据结构手札】空间复杂度详解:概念 | 习题
java·数据结构·算法
档案宝档案管理7 小时前
档案宝自动化档案管理,从采集、整理到归档、利用,一步到位
大数据·数据库·人工智能·档案·档案管理
计算机程序设计小李同学7 小时前
基于SpringBoot的个性化穿搭推荐及交流平台
java·spring boot·后端
是一个Bug7 小时前
50道核心JVM面试题
java·开发语言·面试
朱朱没烦恼yeye7 小时前
java基础学习
java·python·学习
她和夏天一样热7 小时前
【观后感】Java线程池实现原理及其在美团业务中的实践
java·开发语言·jvm
C_心欲无痕7 小时前
浏览器缓存: IndexDB
前端·数据库·缓存·oracle
lkbhua莱克瓦247 小时前
进阶-索引3-性能分析
开发语言·数据库·笔记·mysql·索引·性能分析
郑州光合科技余经理7 小时前
技术架构:上门服务APP海外版源码部署
java·大数据·开发语言·前端·架构·uni-app·php