IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 动态 SQL -> 正文阅读

[大数据]动态 SQL

动态 SQL

动态 SQL 是 MyBatis 的强?特性之?。如果你使?过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接

SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后?个列名的逗号。利?动态 SQL,可以彻底摆脱这种痛苦。

使?动态 SQL 并??件易事,但借助可?于任何 SQL 映射语句中的强?的动态 SQL 语?,MyBatis 显著地提升了这?特性的易?性。

如果你之前?过 JSTL 或任何基于类 XML 语?的?本处理器,你对动态 SQL 元素可能会感觉似曾相识。在

MyBatis 之前的版本中,需要花时间了解?量的元素。借助功能强?的基于 OGNL 的表达式,MyBatis 3 替换了之前的?部分元素,??精简了元素种类,现在要学习的元素种类?原来的?半还要少。

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

2.1 动态 SQL if标签

我们根据实体类的不同取值,使?不同的 SQL 语句来进?查询。?如在 id 如果不为空时可以根据 id 查询,如果 username 不同空时还要加??户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

2.1.1 持久层 Dao 接?

/**

\* 根据?户信息,查询?户列表

\* @param user

\* @return

*/

List<User> findByUser(User user);

2.1.2 持久层 Dao 映射配置

<select id="findByUser" resultType="com.soft.domain.User"

parameterType="com.soft.domain.User">

 select * from user where 1=1

 <if test="username!=null and username != '' ">

 and username like #{username}

 </if>

 <if test="address != null and username != ''">

 and address like #{address}

 </if>

 </select>

注意:<if>标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使? OGNL 表达式的写法。

另外要注意 where 1=1 的作?~

2.1.3****测试的代码

@Test

 public void testFindByUser() {

 User u = new User();

 u.setUsername("%王%");

 u.setAddress("%北京%");

//6.执?操作

 List<User> users = userDao.findByUser(u);

 for(User user : users) {

 System.out.println(user);

 } }

2.2 动态 SQL ****标签

为了简化上? where 1=1 的条件拼装,我们可以采?标签来简化开发。

2.2.1 持久层 Dao 映射配置

<select id="findByUser" resultType="com.soft.domain.User"

parameterType="com.soft.domain.User">

 select * from user

 <where>

 <if test="username!=null and username != '' ">

 and username like #{username}

 </if>

 <if test="address != null and username != ''">

 and address like #{address}

 </if>

 </where>

</select>

where****的好处可以?动过滤第?个and关键字,不要再写sql语句不?再写where

2.3 动态标签之<foreach标签

2.3.1 需求

传?多个 id 查询?户信息,?下边两个 sql 实现:

SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)

SELECT * FROM USERS WHERE username LIKE '%张%' AND id IN (10,89,16)

这样我们在进?范围查询时,就要将?个集合中的值,作为参数动态添加进来。

这样我们将如何进?参数的传递?

2.3.1.1 QueryVo 中加??个 List 集合?于封装参数

public class QueryVo {

 private List<Integer> ids;

 public List<Integer> getIds() {

 return ids;

 }

 public void setIds(List<Integer> ids) {

 this.ids = ids;

 }

}

2.3.2 持久层 Dao 接?

/**

\* 根据id集合查询?户

\* @param vo

\* @return

*/

List<User> findUserInIds(QueryVo vo); 

2.3.3 持久层 Dao 映射配置



<select id="findUserInIds" resultType="com.soft.domain.User"

parameterType="com.soft.domain.QueryVo">

-- select * from user where id in(50,51,53,54);

 select * from USER

 <where>

 <if test="ids != null and ids.size() > 0">

 <foreach collection="ids" item="uid" separator="," open="id in("

close=")">

 \#{uid}

 </foreach>

 </if>

 </where>

 </select> 
<foreach>标签?于遍历集合,它的属性:

collection:代表要遍历的集合元素,注意编写时不要写#{}

open:代表语句的开始部分

close:代表结束部分

item:代表遍历集合的每个元素,?成的变量名

sperator:代表分隔符

2.3.3.1 编写测试?法

@Test

 public void testFindUserInIds(){

 QueryVo queryVo = new QueryVo();

 List<Integer> ids = new ArrayList<Integer>();

 ids.add(50);

 ids.add(51);

 ids.add(53);

 ids.add(54);

 queryVo.setIds(ids);

 List<User> userInIds = userDao.findUserInIds(queryVo);

 for (User userInId : userInIds) {

 System.out.println(userInId);

 }

 }

2.4 Mybatis 中简化编写的 SQL ?段

Sql 中可将重复的 sql 提取出来,使?时? include 引?即可,最终达到 sql 重?的?的。

2.4.1 定义代码?段

select * from user

<sql id="userSQL">

 select * from user

 </sql>

引?代码?段*

<select id="findByUser" resultType="com.soft.domain.User"

parameterType="com.soft.domain.User">

-- select * from user

 <include refid="userSQL"></include>

 <where>

 <if test="username!=null and username != '' ">

 and username like #{username}

 </if>

 <if test="address != null and username != ''">

 and address like #{address}

 </if>

 </where>

 </select>
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章           查看所有文章
加:2021-09-03 11:59:18  更:2021-09-03 12:01:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:06:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码