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);
相关推荐
Thinker QAQ13 分钟前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
袋鼠云数栈37 分钟前
让 SQL 解析不再重复造轮子:SqlParserX 正式开源
数据库·人工智能·sql·开源·数据治理
齐 飞38 分钟前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
这个DBA有点耶1 小时前
期货 CTP 系统 Oracle RAC 迁移国产库实战:读写分离架构设计与性能对标
数据库·架构·dba
你的保护色1 小时前
多AS互联BGP4综合实验设计
java
数据库安全1 小时前
AI数据访问安全 |如何控制AI访问权限,防止越权
数据库·安全
某不知名網友1 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog1 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程1 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring
java_nnnn1 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode