第4章 动态sql和条件查询

合集下载

MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)

MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)

MyBatis动态SQL第⼀篇之实现多条件查询(if、where、trim标签)⼀、动态SQL概述以前在使⽤JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是⼀件痛苦的事情。

通常的解决⽅法是写很多的if-else条件语句对字符串进⾏拼接,并确保不能忘了空格或在字段的最后省略逗号。

MyBatis使⽤动态SQL来改善这种情形,动态SQL是基于OGNL的表达式,可⽅便我们在SQL语句中实现某些逻辑。

⽤于实现动态SQL的元素如下。

if:利⽤if实现简单的条件选择choose(when,otherwise):相当于Java中的switch语句,通常与when和otherwise搭配使⽤set:解决动态更新语句trim:可以灵活的去除多余的关键字foreach:迭代⼀个集合,通常⽤于in条件⼆、if⽤法在查询条件不是很多并且较为固定的情况下,最好的解决⽅案是采⽤多参数直接⼊参的⽅式,这样代码⽐较清晰,可读性强。

如下public interface UserMappper{public List<User> getUserList(@Param("userName") String userName,@Param("userRole") Integer roleId);}<select id="getUserList" resultMap="userList">select u.*, r.roleName from smbms_user u, smbms_role rwhere erName like connect ('%', #{userName}, '%')and erRole=#{userRole} and erRole=r.id</select>在上述代码中,参数使⽤了@Param注解,并将参数roleId重命名为userRole测试上述代码,如下在两个条件都给出的情况下,如String userName="孙"; Integer roleId=3,此时会输出正确结果;若传⼊的⽤户⾓⾊roleId为空,即只按⽤户名称进⾏模糊查询,如String userName="孙"; Integer roleId=null,此时输出的结果不满⾜需求:没有输⼊⽤户⾓⾊的情况下,只根据⽤户名称进⾏模糊查询的需求;若传⼊的⽤户⽤户名称userName为“”(空字符串),roleId有值(roleId=3),此时结果是正确的;针对上述这种某字段⽤户输⼊可能为空的情况,我们使⽤动态SQL的if元素来实现多条件查询,如下<select id="getUserList" resultMap="userList">select u.*, r.roleName from smbms_user u, smbms_role r where erRole=r.id<if test="userRole != null"> and erRole = #{userRole}</if><if test="userName != null and userName != ''"> and erName like concat('%', #{userName}, '%')</if></select>在上述代码中,利⽤if元素实现简单的条件判断,if元素的test属性表⽰进⼊if内需要满⾜的条件。

Oracle中动态SQL详解(EXECUTEIMMEDIATE)

Oracle中动态SQL详解(EXECUTEIMMEDIATE)

Oracle中动态SQL详解(EXECUTEIMMEDIATE)Oracle中动态SQL详解(EXECUTE IMMEDIATE)2017年05⽉02⽇ 18:35:48 阅读数:744 标签:更多个⼈分类:Oracle中动态SQL详解1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其⼀为前期联编(early binding),即SQL语句在程序编译期间就已经确定,⼤多数的编译情况属于这种类型;另外⼀种是后期联编(late binding),即SQL语句只有在运⾏阶段才能建⽴,例如当查询条件为⽤户输⼊时,那么Oracle的SQL引擎就⽆法在编译期对该程序语句进⾏确定,只能在⽤户输⼊⼀定的查询条件后才能提交给SQL引擎进⾏处理。

通常,静态SQL采⽤前⼀种编译⽅式,⽽动态SQL采⽤后⼀种编译⽅式。

本⽂主要就动态SQL的开发进⾏讨论,并在最后给出⼀些实际开发的技巧。

2.动态SQL程序开发 理解了动态SQL编译的原理,也就掌握了其基本的开发思想。

动态SQL既然是⼀种”不确定”的SQL,那其执⾏就有其相应的特点。

Oracle中提供了Execute immediate语句来执⾏动态SQL,语法如下:Excute immediate 动态SQL语句 using 绑定参数列表 returning into 输出参数列表;对这⼀语句作如下说明: 1)动态SQL是指DDL和不确定的DML(即带参数的DML) 2)绑定参数列表为输⼊参数列表,即其类型为in类型,在运⾏时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数⾥⾯的形式参数)进⾏绑定。

3)输出参数列表为动态SQL语句执⾏后返回的参数列表。

4)由于动态SQL是在运⾏时刻进⾏确定的,所以相对于静态⽽⾔,其更多的会损失⼀些系统性能来换取其灵活性。

为了更好的说明其开发的过程,下⾯列举⼀个实例: 设数据库的emp表,其数据为如下:ID NAME SALARY100Jacky5600101Rose3000102John4500要求: 1.创建该表并输⼊相应的数据。

sql 动态参数条件查询写法

sql 动态参数条件查询写法

在SQL中,动态参数条件查询通常使用参数化查询或绑定变量来实现。

这样可以避免SQL注入攻击,并提高查询性能。

以下是一个使用参数化查询的示例,假设我们有一个名为"users"的表,其中包含"username"和"age"两列,我们要根据用户输入的参数查询特定年龄的用户:
```sql
DECLARE @age INT = 25; -- 动态参数
SELECT * FROM users WHERE age = @age;
```
在上面的示例中,我们使用DECLARE语句声明了一个名为"@age"的变量,并将其初始化为25。

然后,在WHERE子句中使用该变量来筛选出年龄等于25的用户。

另一种方法是使用绑定变量,示例如下:
```sql
DECLARE @age INT; -- 动态参数
SET @age = 25; -- 设置动态参数的值
SELECT * FROM users WHERE age = @age;
```
在这个示例中,我们首先声明了一个变量"@age",然后使用SET 语句将其初始化为25。

与上一个示例不同的是,我们没有在WHERE 子句中直接使用变量,而是使用了绑定变量的语法(@age)。

这样,当执行查询时,数据库将使用变量的实际值(25)来执行查询。

无论是使用参数化查询还是绑定变量,都可以有效地避免SQL注入攻击,并提高查询性能。

在实际应用中,可以根据具体的数据库系统和编程语言选择适合的方法。

学习SQL数据库查询和操作的基本语法

学习SQL数据库查询和操作的基本语法

学习SQL数据库查询和操作的基本语法第一章:SQL数据库概述SQL(Structured Query Language)是用于管理关系型数据库的标准化语言。

它允许用户定义、操作和控制数据库的数据。

SQL 的出现极大地简化了数据库的操作,成为大多数数据库系统的标配。

关系数据库是指由表(table)组成的数据库,它的基本单位是行(row)和列(column)。

在SQL中,我们通过表来组织和存储数据,并通过SQL查询语句来操作和获取数据。

第二章:创建和使用数据库在SQL中,我们可以使用CREATE DATABASE语句来创建一个数据库。

例如,我们可以创建一个名为"mydatabase"的数据库:CREATE DATABASE mydatabase;创建数据库之后,我们可以使用USE语句来选择要使用的数据库:USE mydatabase;这样,我们就可以开始在这个数据库中进行操作。

第三章:创建和使用表在SQL中,我们可以使用CREATE TABLE语句来创建一个表。

例如,我们可以创建一个名为"employees"的表:CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,salary DECIMAL(10, 2));在上述示例中,employees表包含四个列:id、name、age和salary。

其中,id列被定义为主键,name列被定义为不可为空。

要插入数据到这个表中,我们可以使用INSERT INTO语句。

例如:INSERT INTO employees (id, name, age, salary)VALUES (1, 'John', 30, 5000.00);这样,就可以在employees表中插入一条数据。

第四章:查询数据在SQL中,我们可以使用SELECT语句来从表中获取数据。

SQL动态查询语句大全

SQL动态查询语句大全

学习SQL应知道的动态SQL语句基本语法1 、普通SQL语句可以用Exec执行eg: Select * from tableNameExec('select * from tableName')Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N2、字段名,表名,数据库名之类作为变量时,必须用动态SQLeg:declare @fname varchar(20)set @fname = 'FiledName'Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。

Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格当然将字符串改成变量的形式也可declare @fname varchar(20)set @fname = 'FiledName' --设置字段名declare @s varchar(1000)set @s = 'select ' + @fname + ' from tableName'Exec(@s) -- 成功exec sp_executesql @s -- 此句会报错declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)set @s = 'select ' + @fname + ' from tableName'Exec(@s) -- 成功exec sp_executesql @s -- 此句正确3、输出参数declare @num int,@sqls nvarchar(4000)set @sqls='select count(*) from tableName'exec(@sqls)--如何将exec执行结果放入变量中?declare @num int,@sqls nvarchar(4000)set @sqls='select @a=count(*) from tableName 'exec sp_executesql @sqls,N'@a int output',@num outputselect @num此外,如果想要在SQL语句字符串中使用单引号'' 可以使用''''SQL Server数据库中经常用到的identity列发布时间:2008.03.24 04:59来源:赛迪网作者:Alice【赛迪网-IT技术报道】SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便。

sql数据库查询语句基本语法

sql数据库查询语句基本语法

sql数据库查询语句基本语法摘要:1.SQL数据库查询语句基本概念2.SELECT语句的结构3.数据表的操作4.条件查询5.排序和分组6.聚合函数和窗口函数7.连接和子查询8.存储过程和触发器9.实践案例与总结正文:一、SQL数据库查询语句基本概念SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准化语言。

它主要用于查询、插入、更新和删除数据库中的数据,还可以用于创建和管理数据库表、视图、索引等。

二、SELECT语句的结构SQL查询语句的核心是SELECT语句,其基本结构如下:1.SELECT 列名1,列名2,...2.FROM 数据表名3.WHERE 条件(可选)4.GROUP BY 列名(可选)5.HAVING 条件(可选)6.ORDER BY 列名(可选)7.LIMIT 分页大小(可选)三、数据表的操作在SQL中,可以使用CREATE、ALTER、DROP等语句对数据表进行创建、修改和删除操作。

1.创建数据表:CREATE TABLE 数据表名(列名1 数据类型,列名2 数据类型,...);2.修改数据表:ALTER TABLE 数据表名ADD 列名数据类型;3.删除数据表:DROP TABLE 数据表名;四、条件查询在SQL查询中,可以使用WHERE子句添加条件,对数据进行筛选。

例如:SELECT * FROM 数据表名WHERE 列名1 = 值1 AND 列名2 = 值2;五、排序和分组可以使用ORDER BY和GROUP BY子句对查询结果进行排序和分组。

例如:1.排序:SELECT * FROM 数据表名ORDER BY 列名1 ASC,列名2 DESC;2.分组:SELECT 列名1,COUNT(*) FROM 数据表名GROUP BY 列名1;六、聚合函数和窗口函数SQL支持聚合函数(如SUM、AVG、MAX、MIN、COUNT等)和窗口函数(如ROW_NUMBER、RANK、DENSE_RANK、CUME_DIST、PERCENT_RANK等)。

mybatis——动态sql之if条件判断各种使用方式

mybatis——动态sql之if条件判断各种使用方式

mybatis——动态sql之if条件判断各种使⽤⽅式点滴记载,点滴进步,愿⾃⼰更上⼀层楼。

⽤mybatis执⾏数据库操作仅仅能看到执⾏结果,如果想看到执⾏的sql语句怎么办。

查阅mybatis官⽅⽂档找到了解决⽅法。

配置什么的很简单,⽤的log4j打印,当然参照官⽅⽂档还有好⼏种⽅法,具体⾃弄。

这⾥仅作记录只⽤。

配置很简单,将log4j架包加⼊到classpath⾥。

maven配置。

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>⾮maven项⽬只需要将jar添加到项⽬中即可。

log4j.properties添加到source根⽬录。

# Global logging configurationlog4j.rootLogger=ERROR, stdout# MyBatis logging configuration...#.soft.test.dao=DEBUGlog4j.logger.dynamic=DEBUG#.mybatis.example.BlogMapper=TRACE# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%5p [%t] - %m%n其中关键的地⽅是log4j.logger.dynamic=DEBUGlog4j.logger是固定的,dynamic为你的mapper.xml的namespace如果我的xml中的namespace为dynamic<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,跟java的package类似,避免sql id重复,有了这个命名空间,别的xml中的sql的id可以跟这个重复,并且 namespace不能省略,不能为空,不⽤接⼝开发,此处可以随意写--><mapper namespace="dynamic"><resultMap id="userMap" type="er"><id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/><result column="create_date" property="createDate"/></resultMap><!--if 标签使⽤类似html的C标签的if --><select id="selectUseIf" parameterType="er" resultMap="userMap">select * from t_user where<if test="id != null and id != ''">id=#{id}</if><if test="username != null and username != ''">and username like concat('%',#{username},'%')</if><if test="password != null and password != ''">and password=#{password}</if></select></mapper>配置完成。

《数据库技术与应用》第4章 习题答案

《数据库技术与应用》第4章 习题答案

《数据库技术与应用》第4章习题答案《数据库技术与应用》第4章习题答案第4章关系数据库标准语言sql1.试述关系数据库标准语言sql的特点。

求解:sql语言是一种功能强大、通用性好又简单易学的语言,主要特点包括:综合统一:sql语言将数据定义语言ddl、数据压低语言dml、数据掌控语言dcl的功能集于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。

高度非过程化:用sql语言展开数据操作方式只要明确提出“搞什么”,而无须阐明“怎么做”。

面向子集操作方式:sql使用子集操作方式方式。

不仅查阅的结果可以就是元组的子集,而且一次插入、更新、删除操作的对象也可以是元组的集合。

积极支持关系数据库的三级模式结构:外模式对应于视图(view),模式对应于基本表中,内模式对应于存储文件。

简约易学,有效率功能强大:sql语言简约,只有少量关键字,语法直观。

sql的采用方式非常灵活,可以直接通过sql实现人机交互,还可以将sql语句嵌入到其他高级语言程序中来使用。

2.概述sql的基本功能。

解:sql语言就是一种综合的、通用型的、功能强大的关系数据库语言,集数据查阅(dataquery)、数据压低(datamanipulation)、数据定义(datadefinition)和数据掌控(datacontrol)功能于一体。

数据定义功能。

主要用于定义、删除和修改关系数据库中的对象,数据库对象主要包括基本表、视图等。

数据查阅功能。

运用select语句去同时实现查阅数据的功能。

数据压低功能。

主要用作减少、删掉和修正数据库中的数据。

数据掌控功能。

主要用以掌控用户对数据库的操作方式权限,包含数据库安全掌控和事物管理两部分。

3.什么是基本表?什么是视图?两者的区别和联系是什么?解:基本集是本身单一制存有的表中,在sql中一个关系就对应一个表中。

企图从一个或几个基本表中求出的表中。

企图本身不单一制存储在数据库中,就是一个虚表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
INSERT INTO `items` VALUES ('2', '笔记本', '6000.0', '笔记本性能 好,质量好!!!!!', null, '2015-02-09 13:22:57');
INSERT INTO `items` VALUES ('3', '背包', '200.0', '名牌背包,容量 大质量好!!!!', null, '2015-02-06 13:23:02');
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
MyBatis
商品表插入数据:
INSERT INTO `items` VALUES ('1', '台式机', '3000.0', '该电脑质量 非常好!!!!', null, '2015-02-03 13:22:53');
</if> </sql>
MyBatis
配置解析: collection: 指定集合属性, 这里就是 ids。 item: 遍历生成的单个对象,自定义名称 open: 开始遍历时拼接的 sql 串。 close: 结束遍历时拼接的 sql 串。 separator: 遍历的对象中需要拼接的 sql 串
<select id=“findUserList” parameterType=“UserQueryVo” resultType=“User”>
select * from user <where> <!-- where 可以自动去掉第一个 and -->
<if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="ername!=null and ername!=''"> and ername like #{ername} </if>
动态sql和条件查询
MyBatis
4.1 动态sql
MyBatis
4.1.1 动态sql
动态 sql 是 mybatis 中的一个核心, 那么什么是 动态 sql?举个例子:
select * from user where user.sex = #{user.sex} and ername like #{ername}
如果 user 是 null 怎么办? 或者 user.sex 或者 ername 为 null 呢? 所以更严谨的做法应该 是在执行这个语句之前要先进行判断才对, 确保都 不为空,那么我们再去查询。 这就涉及到了 mybatis 中的动态 sql 了。
MyBatis
UserMapper.xml中:
MyBatis
订单表插入数据:
INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);
ername!=''"> and ername like #{ername}
</if> </if> </sql>
MyBatis
UserMapper.xml中:
<select id="findUserList" parameterType="UserQueryVo" resultType="User">
MyBatis
4.2 条件查询
MyBatis
表之间的关系图
MyBatis
商品表(items):
CREATE TABLE `items` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(32) NOT NULL COMMENT '商品名称', `price` FLOAT(10,1) NOT NULL COMMENT '商品定价', `detail` TEXT COMMENT '商品描述', `pic` VARCHAR(64) DEFAULT NULL COMMENT '商品图片', `createtime` DATETIME NOT NULL COMMENT '生产日期', PRIMARY KEY (`id`)
MyBatis
用户表(user):
CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` date default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</if> </where> </select>
MyBatis
4.1.2 sql片段
如果好几个 statement 都需要进行判断, 而且动态
sql 部分都一样, 这就会导致一些代码的重复
<sql id="query_user_where"> <if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="ername!=null and
向sql传入数组或者list
SELECT * FROM USER WHERE id=1 OR id=12 OR id=17 SELECT * FROM USER WHERE id IN(1,12,17)
UserQueryVo中:
//传入多个 id private List<Integer> ids;
MyBatis
订单表(orders):
CREATE TABLE `orders` ( `id` int(11) NOT NULL auto_increment, `user_id` int(11) NOT NULL COMMENT '下单用户id', `number` varchar(32) NOT NULL COMMENT '订单号', `createtime` datetime NOT NULL COMMENT '创建订单时间', `note` varchar(100) default NULL COMMENT '备注', PRIMARY KEY (`id`), KEY `FK_orders_1` (`user_id`), CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);
MyBatis
订单明细表(orders):
CREATE TABLE `orderdetail` ( `id` int(11) NOT NULL auto_increment, `orders_id` int(11) NOT NULL COMMENT '订单id', `items_id` int(11) NOT NULL COMMENT '商品id', `items_num` int(11) default NULL COMMENT '商品购买数量', PRIMARY KEY (`id`), KEY `FK_orderdetail_1` (`orders_id`), KEY `FK_orderdetail_2` (`items_id`), CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
相关文档
最新文档