Mybatis框架(复杂动态SQL),一对一,一对多,多对多

2023-10-26

复合条件查询(动态SQL)
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。
动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

if
choose (when, otherwise)
trim (where, set)
foreach

创建PO类 作为导航

package com.foreknow.bean;

public class UserInfo extends User {
   

}

UserQueryInfo.java

package com.foreknow.bean;

import java.util.List;

/**
 * 根据多个条件查询用户的信息
 * @author Administrator
 *
 */
public class UserQueryInfo {
   

	//传入多个id
	private List<Integer> ids;

	//在这里包装所需要的查询条件

	//用户查询条件
	private UserInfo userInfo;

	public List<Integer> getIds() {
   
		return ids;
	}

	public void setIds(List<Integer> ids) {
   
		this.ids = ids;
	}

	public UserInfo getUserInfo() {
   
		return userInfo;
	}

	public void setUserInfo(UserInfo userInfo) {
   
		this.userInfo = userInfo;
	}

	public static void main(String[] args) {
   
		
	}

	}

UserMapper.java 接口

// 用户信息综合查询
public List<UserInfo> findUserList(UserQueryInfo userQueryInfo) throws Exception;

// 用户信息综合查询总数
public int findUserCount(UserQueryInfo userQueryInfo) throws Exception;

UserMapper.xml 对应写出接口的实现类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace命名空间 ,它的作用是对SQL进行分类化管理 -->
<mapper namespace="com.foreknow.dao.UserMapper">
    <!--
    Java代码:
        public User findUserById(int id)
    
    id:唯一标识  相当于方法的名称
    parameterType:输入参数的类型  相当于方法的参数类型
    resultType:方法返回值的类型    注意:全路径(包名+类名)
    #{
   id}:相当于一个占位符
      -->
      
    <!--   所有的select标签都能引用他 -->
      <sql id="query_user_where">
          <if test="userInfo!=null">
<if test="userInfo.sex!=null and userInfo.sex!=''">
and USER .sex = #{
   userInfo.sex}   
</if>


<if test="userInfo.username!=null and userInfo.username!=''">
and USER.username LIKE '%${userInfo.username}%'
</if>

<if test="ids!=null">
<foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
<!-- 每个遍历需要拼接的串 -->
id=#{
   user_id}
</foreach>
    </if>
     </if>
      
      
      </sql>
    <select id="findUserById" parameterType="int" resultType="com.foreknow.bean.User" >
        select * from user where id=#{
   id}
    </select>
    
    <!-- public void insertUser(User user) -->
    <insert id="insertUser" parameterType="com.foreknow.bean.User">
        insert into User(username,birthday,sex,address) values(#{
   username},#{
   birthday},#{
   sex},#{
   address})
    </insert>
    <!--  
    ${
   value}表示拼接sql字符串
    -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.foreknow.bean.User">
        select * from user where username like '%${value}%'
    </select>
    
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{
   id}
    </delete>

    <update id="updateUser" parameterType="com.foreknow.bean.User">
        update user set username=#{
   username},birthday=#{
   birthday},sex=#{
   sex},address=#{
   address} where id=#{
   id}
    </update>
    
    <select id="findUserList" parameterType="com.foreknow.bean.UserQueryInfo" resultType="com.foreknow.bean.UserInfo">
    select*from user
    
  <!--   导航语音userInfo -->
    <where>
   <!--  include是包含   refid是引用   引用sql 的 ID -->
<include refid="query_user_where"></include>
    </where>
    </select >
    <!-- 查询订单关联查询用户信息,使用resultmap -->
    <select id="findOrderUser" resultType="com.foreknow.bean.OrderUserInfo">
  SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
    </select>
 <!-- 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -->   
    <!-- 查询订单关联查询用户信息,使用resultmap   association (一对一)-->
    
    <resultMap type="com.foreknow.Orders" id="OrdersUserResultMap">
    <!-- 配置映射的订单信息 -->
<!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
column:订单信息的唯 一标识 列
property:订单信息的唯 一标识 列所映射到Orders中哪个属性
  -->
  <id column="id" property="id"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis框架(复杂动态SQL),一对一,一对多,多对多 的相关文章

  • sql 查询不适用于 order by

    这是我原来有效的查询 Select FROM story st sentences s speaker sp WHERE st lesson id 1 AND st speaker id sp speaker id AND st sente
  • 按日期顺序排列的 T-SQL 查询组(间隙和孤岛)

    我有一个这样的示例表 CREATE TABLE Aggregate vKey INT dKey INT StartTrip DATETIME EndTrip DATETIME Distance INT 像这样的一些样本数据 INSERT I
  • 增加 SQL 命令的命令超时

    我有一个小问题 希望有人能给我一些建议 我正在运行一个 SQL 命令 但由于数据量很大 该命令似乎需要大约 2 分钟才能返回数据 但默认的连接时间是 30 秒 我如何增加这个时间 并将其应用到这个命令 public static DataT
  • 如何从单行创建多行 - 规范化表

    我对 SQL 很陌生 并试图弄清楚这一点 我有一个名为 BUDGET 的表 其中包含一年中每个月的 12 列 显示该月的预算余额 所以表格看起来像这样 Department Year Month1 Month2 Month12 ABCD 2
  • EntityFramework 6 AddOrUpdate 不适用于复合或复合主键

    这个问题是我周末的噩梦 我有一张桌子AddOrUpdate无法正常工作 它不断添加但从不更新 我想做的就是当我使用以下命令将新实体添加到表中时AddOrUpdate我想要它检查AppointmentId and CompletionCode
  • 如何使用 ORACLE SQL 从 XML 中单独提取可重复的 json 节点值?

    我有以下 XML 我想提取 json 参数 serviceNumber 的值分别地我尝试使用 EXTRACT 函数 但我得到了连接的结果 但我希望将它们分开
  • 获取标签包含 GROUP_CONCAT 字段的所有文章

    我有一张桌子articles 其他tags 第三个称为article tags 我想生成一个页面 其中列出特定标签的所有文章 我的查询如下所示 SELECT headline GROUP CONCAT tags tag name AS al
  • 查找分区内最大的连续数字组

    我有以下按player id 和match date 排序的数据 我想找出连续运行次数最多的记录组 从2014 04 03到2014 04 12连续3次运行4次 player id match date runs 1 2014 04 01
  • 实体框架中的级联更新

    我有以下涉及 2 个类的场景 public class Parent Key public int Id get set Other properties here public virtual IList
  • 发生错误:“无法调用 nvarchar 上的方法。”

    我编写了一个查询来查找与特定问题相关的答案 但在运行此代码时收到此错误 无法调用 nvarchar 上的方法 select Posts Id as Answer ParentId as question User DisplayName a
  • 适用于 Web 照片库的正确 NoSQL 数据架构

    我正在寻找为照片库的 NoSQL 存储构建合适的数据结构 在我的网络应用程序中 一张照片可以是一个或多个相册的一部分 我有使用 MySQL 的经验 但几乎没有使用键值存储的经验 使用 MySQL 我将设置 3 个表 如下所示 photos
  • mysql非空字段计数

    我想计算 mysql 中特定字段集有多少字段为空 我找到了一些示例 但它们都遍历整个表 基本上我有8个字段 listing photo 1 到listing photo 8 我想知道其中有多少个被填充 I tried result mysq
  • Android SQLite 列.....不是唯一的

    我在 Android 上使用 SQLite 并收到此错误 02 11 18 05 37 224 E SQLiteDatabase 26583 android database sqlite SQLiteConstraintException
  • 使用动态 SQL 检索表结构

    我正在迁移数据库 并尝试将表结构信息检索到单个行项目中以进行机器处理 由于技术原因 现有的迁移工具无法使用 必须采用这种方式处理 我已在多个表上成功运行以下查询 SELECT LISTAGG column name data type da
  • 如何使用 CodeIgniter 计算 MySQL 中给定行之前的行数?

    简单来说 如何计算某一行之前有多少行 我使用的是增量 ID 但行是随机删除的 因此仅检查 ID 是行不通的 比如说 如果我有 30 行 并且我根据名称 或任何实际内容 选择了一行 那么在该行之前有多少行 它可以是 16 1 12 或任何值
  • 操作数类型冲突:uniqueidentifier 与 int 不兼容

    当我尝试创建下面的存储过程时 出现以下错误 操作数类型冲突 uniqueidentifier 与 int 不兼容 我不清楚是什么原因导致了这个错误 UserID 实际上是我所有表中的一个 int 有人可以告诉我我做错了什么吗 create
  • 如何将 SELECT...INTO 与 JOIN 一起使用?

    我有以下示例代码 DECLARE myRow table rowtype myVar table2 column type BEGIN SELECT table col1 table col3 table col4 table2 colum
  • 没有 if 条件(动态查询)或乱码的Where子句中的PreparedStatement“为null”

    假设我有这样的查询 SELECT FROM CUSTOMERS WHERE CUSTOMER ID 使用PreparedStatement 我可以绑定变量 pstmt setString 1 custID 但是 我无法通过以下绑定获得正确的
  • SQL原型设计:面对使用varchar(N)静默截断数据——有更好的选择吗? (天数据)

    情况 varchar 20 好像默默地截断在 Teradata 和not当遇到长度超过 20 个字符的字符串时扩展或抱怨 这有点令人惊讶 因为我预计列会自动扩展以适应更大的字符串 例如 30 个字符 或者如果更大的字符串会抛出错误遇到字符串
  • 如何找到与日期范围最重叠的时间段

    假设您有一个包含标识符 开始时间和结束时间的表 这些开始和结束时间可以是任意时间长度 开始时间始终早于结束时间 假设没有空值 什么样的查询会告诉我最 流行 的时间 即每行中的两个范围与大多数其他行重叠的位置 它的实际应用是它是一个记录用户登

随机推荐

  • keepalived 实现双机热备

    文章目录 一 说明 二 概念解释 三 环境准备 四 操作过程 五 验证 一 说明 我们经常听说 nginx keepalived 双机热备 其实在这里 双机热备有两种思路 一是只利用 keepalived 实现两个节点的故障切换 当主节点挂
  • 章节二:Vue.js的安装和配置

    2 1 下载和安装Vue js 要下载和安装Vue js 你有几个选项可供选择 通过CDN 在HTML文件中引入Vue js的CDN链接 然后直接使用Vue全局变量 使用包管理器 使用npm或yarn等包管理器 在项目中安装Vue js 下
  • 一文搞懂IP基础以及子网划分!!!!!

    1 什么是IP地址 IP地址 Internet Protocol Address 互联网国际地址 是一种在Internet上的给主机编址的方式 它主要是为互联网上的每一个网络和每一台主机分配一个逻辑地址 以此来屏蔽物理地址的差异 IP地址就
  • Reactjs鼠标滚轮监听

    1 添加相应的react所需的包及插件 npm install react s npm install react dom s 2 鼠标滚轮事件及引用子组件的滚轮处理事件 handleWheel function event 判断鼠标滚轮的
  • JavaBean配置

    在JSP内嵌入大量的Java代码可能会造成维护不方便 为此最好的方就是把JSP代码和Java代码分开 将JSP中的Java代码移植到Java类中 这些可能用到的类就是JavaBean JavaBean实现步骤如下 1 在src中新建一个be
  • 微型计算机上的南桥芯片功能,微型计算机主板上安装的主要部件

    如下 1 芯片组 芯片组是构成主板电路的核心 决定了主板的级别和档次 北桥芯片是主板上最重要的芯片 主要负责与CPU 内存 显卡进行通讯 南桥芯片负责连接硬盘 USB 接口 PCI 接口等其他接口 南桥芯片和北桥芯片之间也有联系 2 存储控
  • 洋桃电子STM32物联网入门30步笔记三、CubeMX图形化编程、设置开发板上的IO口

    此文档作为对杨桃电子视频的整理 B站链接 第四集 一 开启RCC的外部时钟 包括外部高速时钟HSE和外部低速时钟LSE 时钟配置三个选项的含义 选择禁用的话就只能使用内部时钟 旁路时钟源一般是有源晶振 晶体与陶瓷振荡器一般是无源晶振 二 开
  • 利用JS获取IE客户端IP及MAC的实现

    在做B S结构的系统时 我们常常需要获取客户端的一些信息 如IP和MAC 以结合身份验证 在ASP NET中 要获取服务器端的MAC很容易 但是要获取客户端的MAC的地址确要花费一翻心思 通常的做法是调用Win32API或直接调用nbtst
  • MySQL技术内幕InnoDB存储引擎 学习笔记 第六章 锁

    锁是数据库系统区别于文件系统的一个关键特性 锁机制用于管理对共享资源的并发访问 InnoDB引擎会对表数据上锁以提供数据的完整性和一致性 除此之外 还会对数据库内部其他多个地方使用锁 从而保证对多种不同资源提供并发访问 如增删改LRU列表中
  • 基于Centos7+pycharm搭建python获取爬虫小项目

    一 安装python环境 网上教程查阅 安装成功后运行 python 查看版本 python V 二 安装pycharm 应在步骤一完成后进行 到pycharm官网下载最新版本 下载链接 https www jetbrains com py
  • 详解 Springboot 中使用 Aop

    一 什么是 Aop AOP Aspect Oriented Programming 意为面向切面编程 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 AOP的编程思想是把对类对象的横切问题点 从
  • CentOS 修改时间

    Centos系统时间分为系统时间和硬件时间 二者必须都修改 重启系统才会永久生效 查询时间常用命令 date date R date z hwclock r 一 修改时区 修改时区 ln sf usr share zoneinfo Asia
  • XMind思维导图的结构逻辑该如何体现?3个功能完美体现!

    假设你在玩 模拟城市 但你必须使用以下工具来构建城市 中心主题 城市中心 关键思想 主要道路 次要的思想 次要的道路 标志 地标图片 那么你要怎么安排才能让城市结构附有逻辑性 让城市的规划更加合理 这就是我们将要讨论的问题 同样在我们的思维
  • 初始化列表的特性和构造函数的工作原理

    对于构造函数我们一直有个误区 就是构造函数用于初始化成员变量创建对象 实际上并不是这样的 真正的初始化并不是在构造函数中完成的 而是在初始化列表中完成的 构造函数中的实际上是赋值操作 要了解构造函数的工作原理 得先了解什么是初始化列表 初始
  • 快速达成目标的12种方

    2006 05 04 16 20 15 快速达成目标的12种方法 告诉自己你能主宰命运只有确立了前进的目标 一个人才会最大可能地发挥自己的潜力 主宰自己的命运 在你身上拥有钻石宝藏 美国宾夕法尼亚州著名学府坦普尔大学创始人康惠尔 在演讲中
  • 在superset中快速制作报表或仪表盘

    在中小型企业 当下需要快速迭代 快速了解运营效果的业务 急需一款开源 好用 能快速迭代生产的报表系统 老板很关心 BI工程师很关心 同时系统开发人员也同样关心 一个好的技术选型往往能够帮助公司减少很多成本 并且也不用BI或软件开发同事为了快
  • FRP运行过程中发现的安全漏洞,没有办法修复

    最近经常发送frp搭建外网访问内网不稳定 经过多次排查发现一个可怕的漏洞 这些 goroutines 结束之前正在等待一个 channel 关闭 而这个 channel 永远不会关闭 一个常见的死锁问题 这个进程毫无任何理由吃掉了 90 的
  • Hive Order By、Sort By、Distrbute By、Cluster By区别

    1 Order By 全局排序 只有一个Reducer 2 Sort By 分区内有序 3 Distrbute By 类似MR中Partition 进行分区 结合sort by使用 4 Cluster By 当Distribute by和S
  • XXX packages are looking for funding run `npm fund` for details解决方法

    今天用VScode导入一个vue项目 实现npm install 安装依赖遇到了一些小问题 搞了好久才终于搞好了 下面来直接进入主题 当在终端执行npm install时出现这种情况 然后我们再执行npm update 接下来我们执行npm
  • Mybatis框架(复杂动态SQL),一对一,一对多,多对多

    复合条件查询 动态SQL MyBatis 的强大特性之一便是它的动态 SQL 如果你有使用 JDBC 或其它类似框架的经验 你就能体会到根据不同条件拼接 SQL 语句的痛苦 例如拼接时要确保不能忘记添加必要的空格 还要注意去掉列表最后一个列