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);
相关推荐
雨中飘荡的记忆几秒前
保证金系统入门到实战
java·后端
Nyarlathotep01139 分钟前
Java内存模型
java
IvorySQL25 分钟前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData2 小时前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
暮色妖娆丶4 小时前
不过是吃了几年互联网红利罢了,我高估了自己
java·后端·面试
NE_STOP5 小时前
MyBatis-参数处理与查询结果映射
java
狂奔小菜鸡5 小时前
Day40 | Java中的ReadWriteLock读写锁
java·后端·java ee
IvorySQL6 小时前
PostgreSQL 技术日报 (3月5日)|规划器控制力升级,内核能力再进阶
数据库·postgresql·开源
SimonKing7 小时前
JetBrains 用户狂喜!这个 AI 插件让 IDE 原地进化成「智能编码助手」
java·后端·程序员