- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java的MyBatis框架中对数据库进行动态SQL查询的教程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
其实MyBatis具有的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用 JDBC 或其他 相似框架的经验,你就明白要动态的串联 SQL 字符串在一起是十分纠结的,确保不能忘了空格或在列表的最后省略逗号。Mybatis中的动态 SQL 可以彻底处理这种痛苦。对于动态SQL,最通俗简单的方法就是我们自己在硬编码的时候赋予各种动态行为的判断,而在Mybatis中,用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。动态 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本处理器相似。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 我们常用的几个节点元素有if,choose(when, otherwise),trim(where, if),foreach。真正使用下来我感觉有点像XSLT(文章后面会顺带提一下~)的用法。 (1)if 的用法 。
在ViisitMapper的分页配置中,如果pageIndex>-1 and pageSize>-1的时候就加入相应的分页SQL,否则就不添加(默认取全部),如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
select
id
=
"getListByPagenate"
parameterType
=
"PagenateArgs"
resultType
=
"Visitor"
>
select * from (
<
include
refid
=
"getListSql"
/> <
include
refid
=
"orderBySql"
/>
) t
<!-- #{}表示参数化输出,${}表示直接输出不进行任何转义操作,自己进行转移 -->
<
if
test="pageStart>-1 and pageSize>-1">
limit #{pageStart}, #{pageSize}
</
if
>
</
select
>
<
sql
id
=
"getListSql"
>
select * from Visitor where
status>0
</
sql
>
<
sql
id
=
"orderBySql"
>
order by ${orderFieldStr} ${orderDirectionStr}
</
sql
>
|
因为我们的参数pageIndex与pageSize都是int值所以可以这样直接判断,如果是对象实例我们可以利用null判断来进行一些动态逻辑的控制,具体实际开发中就要看业务需求了。这里我认为要注意的是别十分顺手的吧and写成&&,这个在配置中不会被识别~.
(2)choose (when, otherwise)的用法 。
choose when 主要在多个条件的情况下只满足其中一个条件的应用场景中使用,例如这里就构建一个query条件,分别传递id,name与createTime。假设我们查询Visitor表时,如果VisitorId有值则,使用Id查询,如果VisitorName有值则采用VisitName查询,如下,还是在david.mybatis.demo.IVisitorOperation接口类中添加List<Visitor> getListChooseWhenDemo(BasicQueryArgs args)方法。在VisitorMapper中添加相应的的select节点配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package
david.mybatis.demo;
import
java.util.List;
import
david.mybatis.model.BasicQueryArgs;
import
david.mybatis.model.PagenateArgs;
import
david.mybatis.model.Visitor;
import
david.mybatis.model.VisitorWithRn;
public
interface
IVisitorOperation {
/*
* 添加访问者
*/
public int add(Visitor visitor);
/*
* 删除访问者
*/
public int delete(int id);
/*
* 更新访问者
*/
public int update(Visitor visitor);
/*
* 查询访问者
*/
public Visitor query(int id);
/*
* 查询List
*/
public List<Visitor> getList();
/*
* 分页查询List
*/
public List<Visitor> getListByPagenate(PagenateArgs args);
/*
* 分页查询List(包含Rownum)
*/
public List<VisitorWithRn> getListByPagenateWithRn(PagenateArgs args);
/*
* 基础查询
*/
public Visitor basicQuery(int id);
/*
* 动态条件查询(choose,when)实例
*/
public List<Visitor> getListChooseWhenDemo(BasicQueryArgs args);
/*
* 动态条件查询(where,if)实例
*/
public List<Visitor> getListWhereDemo(BasicQueryArgs args);
/*
* 动态查询(foreach)实例
*/
public
List<Visitor> getListForeachDemo(List<Integer> ids);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?
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">
<
mapper
namespace
=
"david.mybatis.demo.IVisitorOperation"
>
<
resultMap
type
=
"Visitor"
id
=
"visitorRs"
>
<
id
column
=
"Id"
property
=
"id"
/>
<
result
column
=
"Name"
property
=
"name"
/>
<
result
column
=
"Email"
property
=
"email"
/>
<
result
column
=
"Status"
property
=
"status"
/>
<
result
column
=
"CreateTime"
property
=
"createTime"
/>
</
resultMap
>
<
sql
id
=
"getListSqlConditions"
>
select * from Visitor
</
sql
>
<!-- 满足其中一个条件时候用choose when操作 -->
<
select
id
=
"getListChooseWhenDemo"
resultMap
=
"visitorRs"
parameterType
=
"BasicQueryArgs"
>
<
include
refid
=
"getListSqlConditions"
/>
<
where
>
<
if
test="queryStatus>0">
status=#{queryStatus}
</
if
>
<
choose
>
<
when
test
=
"queryId!=0"
>
and id=#{queryId}
</
when
>
<
when
test
=
"queryName!=null"
>
and name like #{queryName}
</
when
>
<
otherwise
>
and createTime>= #{queryTime}
</
otherwise
>
</
choose
>
</
where
>
</
select
>
</
mapper
>
|
(3)where if (trim)的用法 。
where关键词的好处是在于,如果有相应的过滤条件的话,它知道在适当的时候插入where关键词。而且它也知道在何时该去掉相应的AND与OR的连接符,主要应对如下情景 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<
select
id
=
"findActiveBlogLike"
resultType
=
"Blog"
>
SELECT * FROM BLOG
WHERE
<
if
test
=
"state != null"
>
state = #{state}
</
if
>
<
if
test
=
"title != null"
>
AND title like #{title}
</
if
>
<
if
test
=
"author != null and author.name != null"
>
AND author_name like #{author.name}
</
if
>
</
select
>
|
不会因为所有条件不满足变为 。
1
2
3
4
5
|
<
select
id
=
"findActiveBlogLike"
resultType
=
"Blog"
>
SELECT * FROM BLOG
WHERE
</
select
>
|
或者因为没有满足第一个条件,单单满足后面的条件变成 。
1
2
3
4
5
6
|
<
select
id
=
"findActiveBlogLike"
resultType
=
"Blog"
>
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle'
</
select
>
|
所以针对这种我们可以在建立choose when条件示例,同样在IVisitorOperation接口类中加入相应的方法public List<Visitor> getListWhereDemo(BasicQueryArgs args),把VisitorMapper配置文件中的相对应配置加上去如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<?
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">
<
mapper
namespace
=
"david.mybatis.demo.IVisitorOperation"
>
<
sql
id
=
"getListSqlConditions"
>
select * from Visitor
</
sql
>
<!-- 满足条件的都加上去操作 -->
<
select
id
=
"getListWhereDemo"
resultMap
=
"visitorRs"
parameterType
=
"BasicQueryArgs"
>
<
include
refid
=
"getListSqlConditions"
/>
<
where
>
<
if
test="queryStatus>0">
status>0
</
if
>
<
if
test="queryId>0">
and id=#{queryId}
</
if
>
<
if
test
=
"queryName!=null"
>
and name like=#{queryName}
</
if
>
<
if
test
=
"queryTime!=null"
>
and createTime>=#{queryTime}
</
if
>
</
where
>
<!--
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="queryStatus>0">
status>0
</if>
<if test="queryId>0">
and id=#{queryId}
</if>
<if test="queryName!=null">
and name like=#{queryName}
</if>
<if test="queryTime!=null">
and createTime>=#{queryTime}
</if>
</trim>
-->
</
select
>
</
mapper
>
|
(4)foreach的用法 。
在常用的动态SQL中我们有个业务场景是要where id in 一大串的ID,像这种情况我们就可以用到foreach啦,不必自己辛辛苦苦去拼接Id字符串啦。同样的步骤还是在IVisitorOperation接口类中加入相应的方法public List<Visitor> getListForeachDemo(List<Integer> ids),然后再对应的Mapper文件中配置上相应的节点元素信息,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?
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">
<
mapper
namespace
=
"david.mybatis.demo.IVisitorOperation"
>
<
sql
id
=
"getListSqlConditions"
>
select * from Visitor
</
sql
>
<!-- Foreach循环条件 -->
<
select
id
=
"getListForeachDemo"
resultMap
=
"visitorRs"
>
<
include
refid
=
"getListSqlConditions"
/>
where status>0 and id in
<
foreach
collection
=
"list"
item
=
"item"
index
=
"index"
open
=
"("
separator
=
","
close
=
")"
>
${item}
</
foreach
>
</
select
>
</
mapper
>
|
最后你只需要在DemoRun中建立相应的测试方法,Mybatis里面的动态SQL也就完成啦,下面测试用的DemoRun方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/*
* 动态查询foreach实例
*/
public static void getListForeachDemo(List<Integer> ids) {
SqlSession session = MybatisUtils.getSqlSession();
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
List<Visitor> ls = vOperation.getListForeachDemo(ids);
for (Visitor visitor : ls) {
System.out.println(visitor);
}
}
/*
* 动态查询where if实例
*/
public static void getListWhereCondition(int id, String name, Date createTime) {
name = name == "" ? null : name;
SqlSession session = MybatisUtils.getSqlSession();
BasicQueryArgs args = new BasicQueryArgs(id, name, createTime);
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
List<Visitor> ls = vOperation.getListWhereDemo(args);
if (ls.size() == 0)
System.out.println("查无匹配!");
else {
for (Visitor visitor : ls) {
System.out.println(visitor);
}
}
}
/*
* 动态查询choose when实例
*/
public
static
void
getListChooseWhenDemo(
int
id, String name, Date createTime) {
name = name ==
""
?
null
: name;
SqlSession session = MybatisUtils.getSqlSession();
BasicQueryArgs args =
new
BasicQueryArgs(id, name, createTime);
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.
class
);
List<Visitor> ls = vOperation.getListChooseWhenDemo(args);
if
(ls.size() ==
0
)
System.out.println(
"查无匹配!"
);
else
{
for
(Visitor visitor : ls) {
System.out.println(visitor);
}
}
}
|
PS:关于OGNL OGNL 是 Object-Graph Navigation Language 的缩写,从语言角度来说:它是一个功能强大的表达式语言,用来获取和设置 java 对象的属性 , 它旨在提供一个更高抽象度语法来对 java 对象图进行导航,OGNL 在许多的地方都有应用,例如: 作为 GUI 元素(textfield,combobox, 等)到模型对象的绑定语言。 数据库表到 Swing 的 TableModel 的数据源语言。 web 组件和后台 Model 对象的绑定语言 (WebOGNL,Tapestry,WebWork,WebObjects) 。 作为 Jakarata Commons BeanUtils 或者 JSTL 的表达式语言的一个更具表达力的替代语言。 另外,java 中很多可以做的事情,也可以使用 OGNL 来完成,例如:列表映射和选择。 对于开发者来说,使用 OGNL,可以用简洁的语法来完成对 java 对象的导航。通常来说: 通过一个“路径”来完成对象信息的导航,这个“路径”可以是到 java bean 的某个属性,或者集合中的某个索引的对象,等等,而不是直接使用 get 或者 set 方法来完成.
最后此篇关于Java的MyBatis框架中对数据库进行动态SQL查询的教程的文章就讲到这里了,如果你想了解更多关于Java的MyBatis框架中对数据库进行动态SQL查询的教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1.概述 转载:MyBatis 二级缓存全详解 上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存,什么是 SqlSession 级别的缓存呢?一级缓存的本质
1.概述 转载:核心配置综述之StatementHandler 2.MyBatis 四大组件之StatementHandler StatementHandler 是四大组件中最重要的一个对象,负责操作
1.概述 转载:MyBatis 启动流程 MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。My
1.概述 转载:MyBatis 基础搭建及架构概述 2.MyBatis 是什么? MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。MyBatis消除了大部分JDBC的样板代码、
1.概述 转载:核心配置综述之 ParameterHandler MyBatis 四大核心组件我们已经了解到了两种,一个是 Executor ,它是MyBatis 解析SQL请求首先会经过的第一道关卡
1.概述 转载:核心配置综述之 ResultSetHandler 我们之前介绍过了MyBatis 四大核心配置之 Executor、StatementHandler、 ParameterHandler
如果我使用mybatis,我可以很容易地得到更新的行数,就像 update table set desc = 'xxx' where name = ? 但是,如果我想获取更新的行数,而不是计数,我该如
如何在MyBatis 3中使用小于等于 SELECT * FROM( SELECT * FROM TABLE1 WHERE COL1 =#{COL1,jdbc
我将 mybatis3.0.6 与 java 一起使用 哪个性能更好? [select id="getData" parameterType="Integer" resultType="Integer
我无法在 mybatis 中使用动态排序类型创建 SQL,如下例 select user_profile.user_profile_id, user_profile.first_name
这是一个流行的例子。 insert into ACCOUNT ( ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL )values (
我下载了MyBatis,文件夹中有一个mybatis-3.0.4-javadoc.jar,我解压并打开它,但它几乎是空的。 哪里可以找到MyBatis的API文档? 最佳答案 http://repo1
我正在尝试为 ArrayList 编写类型处理程序,但这给了我错误,任何人都可以帮助我。 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其检索为 ArrayList。 packa
目录 依赖 配置 CodeGenerator mybatis-plus-generator + clickhouse 自动生成代码 依赖
目录 三者实现对比 使用fluent mybatis 来实现上面的功能 换成mybatis原生实现效果 换成mybatis plus
例如,我有查询从员工中选择 ID、姓名、年龄、地址,而不是拥有员工对象列表。我希望有一个 map 列表,如 list{ map{ ("id", 123), ("name","jac
我在使 MyBatis (3.4.6) 工作时遇到一些麻烦。 我已将 mybatis-config.xml 文件放置在项目的 src/main/resources 文件夹中,但是当我运行单元测试时,出
我现在使用 Mybatis 和 spring-boot。我没有添加mybatis-config.xml。我根据说明通过 application.properties 为数据源和 mybatis 进行所
这是我的第一篇文章,用我糟糕的英语...... 我使用的是MyBatis3.0 在查询中,我使用 SqlBuilder 的方法如下: public class DataStatisticSqlBuil
主题:MyBatis:Boolean Paraeter:MyBatis 正在使用 Getter 内容: 大家好, 我一直在寻找解决我近乎简单的 MyBatis 问题的方法: 给定代码(仅必要部分):
我是一名优秀的程序员,十分优秀!