Sql构建

Sql构建

SQL 构建对象介绍

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

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

在这里插入图片描述

sql拼接测试:

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语句功能类对象

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

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

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

更改mapper接口方法:

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

1.2 实现动态SQL查询

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

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文件:

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

测试代码:

 @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);
        }
    }

根据名字和地址模糊查询

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

 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接口里面编写:

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

测试类编写:

 @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 编写功能类对象

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

2.2 编写mapper接口方法

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

2.3 编写测试类

 @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 编写功能类对象

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

3.2 编写mapper接口类

  //修改功能
//@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 测试运行

   @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 编写功能类

 //动态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接口方法

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

5. 删除功能的实现

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

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

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

  • method 属性:指定调用方法

定义功能类:

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

定义mapper接口方法:

 //删除功能
    //@Delete("DELETE FROM t_user WHERE id=#{id}")
    @DeleteProvider(type = ReturnSql.class , method = "getDelete")
    public abstract Integer delete(Integer id);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/39925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS:nodelet

目录 一、前言二、概念三、作用四、使用演示4.1案例简介4.2nodelet 基本使用语法4.3内置案例调用 五、nodelet实现5.1需求5.2流程5.3准备5.4创建插件类并注册插件5.5构建插件库5.6使插件可用于ROS工具链5.6.1配置xml5.6.2导出插件 5.7执行 一、前言 ROS通信是基于Node(节点)的…

SpringCloud学习路线(4)—— Nacos注册中心

一、认识和安装Nacos &#xff08;一&#xff09;概念&#xff1a; Nacos是Alibaba的产品&#xff0c;现在是SpringCloud中的一个组件&#xff0c;相较于Eureka功能更加丰富。 &#xff08;二&#xff09;下载地址&#xff1a; https://github.com/alibaba/nacos/releases &am…

UTM 4.3 发布:在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS

UTM 4.3 发布&#xff1a;在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS 在 iOS 中虚拟化 Windows、Linux 和 Unix 请访问原文链接&#xff1a;https://sysin.org/blog/utm-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

活动页服务端渲染探索

目标 通过采用在服务端渲染激励页的方式&#xff0c;降低页面加载白屏时间&#xff0c;从而提升激励 H5 渲染体验。 架构设计 前端服务框架调研选型 只对比分析以下两种方案&#xff1a; Vue3 Nuxt3 WebpackNext.js React Node.js ’Nuxt3Next.js介绍Nuxt是一个基于Vu…

navicate_windows_14

1.新建文本文档2.输入如下内容 echo off set dnInfo set dn2ShellFolder set rpHKEY_CURRENT_USER\Software\Classes\CLSID :: reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration14XCS /f %针对<strong><font color"#FF0000"…

文心一言 VS 讯飞星火 VS chatgpt (62)-- 算法导论6.5 1题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;62&#xff09;-- 算法导论6.5 1题 一、试说明 HEAP-EXTRACT-MAX在堆A(15&#xff0c;13&#xff0c;9&#xff0c;5&#xff0c;12&#xff0c;8&#xff0c;7&#xff0c;4&#xff0c;0&#xff0c;6&#xff0c;2&#xff0c…

06-C++ 基本算法 - 二分法

&#x1f4d6; 前言 在这个笔记中&#xff0c;我们将介绍二分法这种基本的算法思想&#xff0c;以及它在 C 中的应用。我们将从一个小游戏猜数字开始&#xff0c;通过这个案例来引出二分法的概念。然后我们将详细讲解什么是二分法以及它的套路和应用。最后&#xff0c;我们还会…

为什么弹性内容交付网络是决定网站性能的关键

如今的用户对于所访问网站都对网站有自己的标准&#xff0c;他们期望访问的网站性能良好&#xff0c;具有快速的页面加载时间和易于访问、新鲜且动态的内容&#xff0c;同时他们还希望享受无缝且安全的体验&#xff0c;无需停机或内容访问受到限制。比如微博等平台每次在网络热…

centos7安装 mongodb

一、rpm安装 1.1、配置MongoDB Enterprise的yum 源文件 [mongodb-enterprise] nameMongoDB Enterprise Repository baseurlhttps://repo.mongodb.com/yum/redhat/$releasever/mongodb-enterprise/3.4/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp…

【Python爬虫+可视化案例】采集电商网站商品数据信息,并可视化分析

爬虫可视化案例 &#xff1a;苏宁易购 案例所需要掌握的知识点&#xff1a; selenium的使用html标签数据解析方法 需要准备的环境&#xff1a; python 3.8pycharm 2022专业版selenium python里面的第三方库 可以用来操作浏览器 爬虫代码展示 所需模块 【代码领取 请看文末…

开发工具篇第二十六讲:使用IDEA进行本地调试和远程调试

开发工具篇第二十六讲&#xff1a;使用IDEA进行本地调试和远程调试 Debug用来追踪代码的运行流程&#xff0c;通常在程序运行过程中出现异常&#xff0c;启用Debug模式可以分析定位异常发生的位置&#xff0c;以及在运行过程中参数的变化&#xff1b;并且在实际的排错过程中&am…

C++-string类的模拟实现

本博客基于C官方文档当中给出的string类当中的主要功能实现&#xff0c;来作为参照&#xff0c;简单模拟实现 My-string 。 对于C当中的string类的介绍&#xff0c;在之前的几篇博客当中有说明&#xff0c;如有问题&#xff0c;请参照一下两个博客文章进行参考&#xff1a; (2…

使用 Pytest 运行 yaml 文件来驱动 Appium 自动化测试

目录 前言&#xff1a; 获取 yaml 文件 YamlTest 测试类 Appium 初始化 Pytest 测试类 自定义 runtest demo&#xff1a; 自定义错误输出 Yaml 使用方式规则 前言&#xff1a; 使用Pytest来运行yaml文件来驱动Appium自动化测试是一种方便且灵活的方法。通过将测试数据…

CSS 渐变边框及动画

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 用 CSS 实现渐变边框及动画&#xff0c;下面对关键点进行解释说明&#xff0c;查看完整代码及预览效果请 点击这里。 简单说明原理&#xff1a;使用伪元素 ::before 绘制一个渐变色&#xff0c;然后使用伪元素 ::after 绘…

【数据结构】二叉树详解(2)

⭐️ 前言 ✨ 往期文章链接&#xff1a;二叉树的概念性质 上一篇我们讲了二叉树的结构定义&#xff0c;以及前序/中序/后序的递归遍历&#xff0c;还有一些二叉树的接口实现&#xff0c;本篇我们补充一个二叉树的接口 BinaryTreeDepth。✨上一篇文章链接&#xff1a;二叉树详…

【原创】实现ChatGPT中Transformer模型之Encoder-Decoder

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 Transformer Block &#xff08;通用块&#xff09;实现 看以上整个链路图&#xff0c;其实我们可以很清晰看到这心其实在Encoder环节里面主要是有几个大环节&#xff0c;每一层主要的核心作用如下&#xff1a; Multi-he…

出租屋智能电表系统

随着科技的不断发展&#xff0c;智能化逐渐成为人们生活中不可或缺的一部分。在房屋租赁市场中&#xff0c;智能电表系统成为越来越多出租屋的标配&#xff0c;为房东和租户带来了便捷和安全。本文将从以下几个方面介绍出租屋智能电表系统的特点和优势。 一、出租屋智能电表系统…

第二十一章:CCNet:Criss-Cross Attention for Semantic Segmentation ——用于语义分割的交叉注意力

0.摘要 全图像依赖关系为视觉理解问题提供了有用的上下文信息。在这项工作中&#xff0c;我们提出了一种称为Criss-Cross Network&#xff08;CCNet&#xff09;的方法&#xff0c;以更有效和高效的方式获取这种上下文信息。具体而言&#xff0c;对于每个像素&#xff0c;CCNet…

Linux 系统编程-开发环境(二)

目录 7 压缩包管理 7.1 tar 7.2 rar 7.3 zip 8 进程管理 8.1 who 8.2 ps 8.3 jobs 8.4 fg 8.5 bg 8.6 kill 8.7 env 8.8 top 9 用户管理 9.1 创建用户 9.2 设置用户组 9.3 设置密码 9.4 切换用户 9.5 root用户 9.6 删除用户 10 网络管理 10.1 i…

Word之解决中文和英文混写导致字间距增大的问题(六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…