mybatis--MyBatis动态SQL语句

mybatis--MyBatis动态SQL语句

mybatis 的动态sql语句是基于OGNL表达式的。可以⽅便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下⼏类:

1. if 语句 (简单的条件判断)

2. choose (when,otherwize) ,相当于java 语⾔中的 switch ,与 jstl 中的choose 很类似.

3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)

4. where (主要是⽤来简化sql语句中where条件判断的,能智能的处理 and or ,不必担⼼多余导致语法错误)

5. set (主要⽤于更新时)

6. foreach (⽤于mybatis语句查询)

1.if语句(简单的条件判断)

(1)数据库my的user表数据为:

(2)⾸先创建⼀个mybatis项⽬,mybatis_008

(3)建⽴com.zk.dao包下的IUser接⼝:

IUser.java

package com.zk.dao;

import org.apache.ibatis.annotations.Param;

import com.zk.pojo.User;

public interface IUser {

public User findUserWithNameLike(@Param("id")int id, @Param("name")String name);

}

(4)在com.zk.pojo包下建⽴User实现IUser接⼝中的⽅法,并配置UserMapper.xml

User.java

package com.zk.pojo;

public class User {

private int id;

private String name;

private String level;

private String phone;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getLevel() { return level;

}

public void setLevel(String level) {

this.level = level;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", level=" + level

+ ", phone=" + phone + "]";

}

}

UserMapper.xml

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT * FROM user

WHERE id = #{id}

AND name like #{name}

(5)配置config/configure.xml

configure.xml

"http://mybatis.org/dtd/mybatis-3-config.dtd">

(6)实现main函数

MainApp.java

package Main;

import java.io.IOException;

import java.io.Reader;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.zk.dao.IUser;

import com.zk.pojo.User;

public class MainApp {

private static SqlSessionFactory sqlsessionfactory;

private static Reader reader;

static{

try {

reader=Resources.getResourceAsReader("config/configure.xml");

sqlsessionfactory=new SqlSessionFactoryBuilder().build(reader);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public SqlSessionFactory getSqlSessionFactory()

{

return sqlsessionfactory;

}

public static void main(String[]args)

{

select(1,"c");

}

public static void select(int id,String name){

//获取session连接

SqlSession session=sqlsessionfactory.openSession();

//获取mapper

IUser usermap=session.getMapper(IUser.class);

//selectAllUser();

User user = usermap.findUserWithNameLike(id, name);

//执⾏查询

System.out.println(user.toString());

session.commit();

//selectAllUser();

}

}

Main执⾏结果如下:

2. where (主要是⽤来简化sql语句中where条件判断的,能智能的处理 and or ,不必担⼼多余导致语法错误)

(1) UserMapper.xml

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT * FROM user

id like #{id}

AND name like #{name}

运⾏结果如下:

3. choose (when,otherwize) ,相当于java 语⾔中的 switch ,与 jstl 中的choose 很类似.

同样原始的数据库,仅更改pojo层的UserMapper.xml,如下所⽰:

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT * FROM user where

合集下载

mybatis动态sql之遍历集合(学习foreach标签(初探))

mybatis动态sql之遍历集合(学习foreach标签(初探))

mybatis动态sql之遍历集合(学习foreach标签(初探))

EmployeeMapperDynamicSql.java

package com.gong.mybatis.mapper;

import java.util.List;

import java.util.Map;

import org.apache.ibatis.annotations.MapKey;

import org.apache.ibatis.annotations.Param;

import com.gong.mybatis.bean.Employee;

public interface EmployeeMapperDynamicSql {

public List getEmpByConditionIf(Employee employee);

public List getEmpByForeach(@Param("ids") List ids);

}

EmployeeMapperDynamicSql.xml

PUBLIC "-////DTD Mapper 3.0//EN"

"/dtd/mybatis-3-mapper.dtd">

select * from tbl_employee

id=#{id}

last_name like #{lastName}

email=#{email}

select * from tbl_employee where id in

#{item_id}

说明:

item:集合中元素迭代时的别名,该参数为必选。

index:在list和数组中,index是元素的序号,在map中,index是元素的key,item是元素的value,该参数可选

open:foreach代码的开始符号,⼀般是(和close=")"合⽤。常⽤在in(),values()时。该参数可选

mybatis中if的用法

mybatis中if的用法

mybatis中if的用法

MyBatis是一款开源的持久层框架,它采用了基于XML或注解的方式来配置SQL语句,而且支持动态SQL,极大地简化了SQL的编写和维护。其中,if标签也是动态SQL非常重要的一部分,它能够根据条件动态地拼接SQL语句,大大增强了框架的灵活性和可扩展性。

一、if标签的基本语法

在MyBatis中,if标签通常用于动态拼接SQL语句,在XML配置文件中,它的基本语法如下:

```

SELECT * FROM user WHERE 1=1

AND id = #{id}

AND name = #{name}

```

从上面的例子中可以看到,if标签的test属性指定了一个条件表达式,当该条件表达式成立时,if标签中的SQL语句才会被执行。如果条件表达式不成立,则if标签中的SQL语句会被忽略。

在上述例子中,if标签分别判断了id和name是否为null,如果不为null,则拼接相应的SQL语句。

除了上面的基本语法外,if标签还有很多用法,下面我们将逐一介绍。

1. if-else用法

if-else用法和Java中的if-else语句类似,如果符合条件,执行其中一个分支;如果不符合条件,执行另一个分支。 在上述例子中,如果id和name都为null,就会执行if标签的第三个分支,即AND

age > 18。需要注意的是,这里使用了>来代替大于号>,因为在XML中,大于号会被解析成标签。

if-elseif-else用法和Java中的if-else if语句类似,可以根据多个条件来动态拼接SQL语句。

在上述例子中,if标签按照age的大小判断了多个分支,如果符合其中某一个分支,就执行相应的SQL语句。需要注意的是,test属性的表达式可以使用and, or, not等逻辑运算符来组合。

mybatis日志打印sql语句

mybatis日志打印sql语句

mybatis日志打印sql语句

MyBatis是一个开源的持久层框架,它提供了很多方便的功能,其中之一就是可以打印SQL语句的日志信息。通过打印SQL语句的日志,我们可以更加方便地进行调试和优化。下面列举了10个关于MyBatis日志打印SQL语句的例子。

1. 打印查询语句的日志信息

在MyBatis的配置文件中,我们可以通过设置logging属性来控制是否打印SQL语句的日志信息。如果设置为DEBUG级别,那么就会打印查询语句的日志信息,例如:

DEBUG [main] - ==> Preparing: SELECT * FROM users

WHERE id = ?

DEBUG [main] - ==> Parameters: 1(Integer)

这里的"Preparing"表示正在准备执行的SQL语句,"Parameters"表示SQL语句的参数。

2. 打印更新语句的日志信息

除了查询语句,MyBatis还可以打印更新语句的日志信息。例如,当执行更新语句时,会输出类似以下的日志信息:

DEBUG [main] - ==> Preparing: UPDATE users SET name = ? WHERE id = ?

DEBUG [main] - ==> Parameters: John(String), 1(Integer)

这里的"Preparing"表示正在准备执行的SQL语句,"Parameters"表示SQL语句的参数。

3. 打印插入语句的日志信息

在执行插入语句时,MyBatis会打印插入语句的日志信息。例如:

DEBUG [main] - ==> Preparing: INSERT INTO users (id, name)

VALUES (?, ?)

DEBUG [main] - ==> Parameters: 1(Integer), John(String)

mybatis的动态sql之iftest的使用说明

mybatis的动态sql之iftest的使用说明

mybatis的动态sql之iftest的使⽤说明

参数为String,if test读取该参数代码

SELECT MAX(DEPART_ID) FROM T_P_DEPART

AND DEPART_PID = #{departId,jdbcType=VARCHAR}

AND DEPART_PID IS NULL

参数为pojo , if test读取该参数代码

select * from shop

shop.shopname like '%${shopCustomer.shopname}%'

AND shop.shopname is null

补充:关于mybatis中 if test的条件怎么写

1.mybatis 中 的 if test写法

1.1官⽅⽂档上对于if是这么写的

AND title like #{title}

参考官⽅⽂档:

实际项⽬中会有这种情况: 页⾯上title字段输⼊某个值进⾏查询,⼿动将输⼊框中的值删除,然后再次查询,发现结果不正确,究其

原因是应为title传⼊了空串" " 这样在mybatis配置⽂件中就会⽤空串进⾏查询,导致出现错误结果

1.2建议写法

AND title like #{title}

2.使⽤mybatis 做修改时将字段置空

if中如果传⼊的参数如果为空,那么将不会执⾏if中的语句

解决办法:

update table

full_name = null,

full_name = #{companyOrg.fullName},

level = null,

level = null,

level = #{companyOrg.level},

where 1=1 and id =#{companyOrg.id}

以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。

mybatis group by if用法

mybatis group by if用法

mybatis group by if用法

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在

MyBatis 中,group by 子句经常用于对数据进行分组,而 if 语句则用于动态生成 SQL。下面我将详细介绍 MyBatis 中如何使用 group by 与 if 结合来动态生成 SQL。

使用 元素动态添加 group by 子句

在 MyBatis 的 XML 映射文件中,你可以使用 元素来根据条件动态添加 group

by 子句。例如,假设你有一个查询需要根据用户的输入动态地按某个字段进行分组,你可以这样做:

xml

SELECT column1, column2, SUM(column3)

FROM your_table

GROUP BY ${groupByColumn}

在这个例子中,groupByColumn 是传入查询的一个参数。如果 groupByColumn 不为空,MyBatis 将会添加 GROUP BY 子句并按照 groupByColumn 的值进行分组。

注意安全性

使用 ${} 插入字段名或表名时要特别小心,因为这可能会导致 SQL 注入。确保传入的字段名或表名是安全的,或者通过某种方式进行了验证和清理。

结合 , ,

你还可以使用 , , 和 元素来创建更复杂的条件逻辑,以决定是否需要添加 group by 子句,以及按哪个字段进行分组。

总的来说,MyBatis 提供了强大的动态 SQL 生成功能,使得你可以根据应用的需求灵

活地构建 SQL 查询。

MyBatis(五)动态SQL之choose(when、otherwise)标签

MyBatis(五)动态SQL之choose(when、otherwise)标签

MyBatis(五)动态SQL之choose(when、otherwise)标签

⼀、choose 标签

choose 主要⽤于分⽀判断,类似于 java 中带了 break的 switch...case,只会满⾜所有分⽀中的⼀个。 语法格式:

通过test表达式拼接SQL

当when都不符合条件,就会选择otherwise拼接SQL

标签说明:

:选择某⼀个 when 或 otherwise 拼接 SQL:通过 test 表达式拼接 SQL;:当 when 都不符合条件,就会选择 otherwise 拼接 SQL

注意: 只会往 SQL 语句中添加⼀个条件(相当于带了break的 switch...case)。

⼆、代码⽰例

1、在接⼝中声明⽅法

public List getEmpsByConditionChoose(Employee employee);

2、在对应的 xml 中进⾏配置

select * from tbl_employee

id=#{id}

last_name like #{lastName}

email=#{email}

gender = 0

3、运⾏SQL语句

select * from tbl_employee where id=?

当第⼀个 when 成⽴时,后⾯的就不再进⾏拼接

select * from tbl_employee where gender=0

当前⾯的 when 都不成⽴时,就会拼接 otherwise 中的语句。

三、使⽤ choose 实现添加

添加员⼯时,如果性别为'男',设置为'男',如果为'⼥',设置为'⼥',其他信息设置为'不详'

在接⼝中声明⽅法:

//添加员⼯信息,设置性别public void insertEmpByConditionChoose(Employee employee);

在对应的 xml 中配置:

MyBatis(五)动态SQL之trim标签

MyBatis(五)动态SQL之trim标签

⼀、trim 标签

语法:

:截取并拼接

属性说明:

trim 标签⽤于截取并拼接,即可以在条件判断完的 SQL 语句前后,添加或者去掉指定的字符。prefix:(添加前缀)trim标签体中是整个字符串拼串后的结果,是给拼串后的整个字符串加⼀个前缀suffix:(添加后缀)suffix给拼串后的整个字符串加⼀个后缀prefixOverrides:前缀覆盖: 去掉整个字符串前⾯多余的字符(去掉前缀)suffixOverrides:后缀覆盖:去掉整个字符串后⾯多余的字符(去掉后缀)

trim ⽤于⾃定义字符串的截取规则,后⾯多出的 and 或者 or 使⽤ where 标签不能解决。

⼆、trim 标签的使⽤

1、在接⼝中声明⽅法

public List getEmpsByConditionTrim(Employee employee);

2、在对应的 xml 中配置

select * from tbl_employee

id=#{id} and

last_name like #{lastName} and

email = #{email} and

gender = #{gender}

三、细节

对于上⼀节的多条件的查询,可以使⽤ if 和 where 标签进⾏查询。

这时把 and 关键字放在了条件的后⾯,⼜会出现什么问题呢?

执⾏的 SQL 语句:

select * from tbl_employee

id=#{id} and

last_name like #{lastName} and

email = #{email} and

gender = #{gender}

这时把 and 关键字放在了条件的后⾯,如果缺少最后⼀个条件,⼜会出现什么问题呢?

执⾏的 SQL 语句:

select * from tbl_employee where id=? and email=? and

mybatis eqifpresent 意思-概述说明以及解释

mybatis eqifpresent 意思-概述说明以及解释

1.引言

1.1 概述

在编写本文之前,我们需要先了解一下MyBatis和eqifpresent的基本概念。

MyBatis是一个开源的持久层框架,它为Java提供了一种优雅的方式来操作数据库。通过使用MyBatis,我们可以很方便地执行SQL语句,并将结果封装成Java对象,从而简化了数据库操作的编写和管理。

而eqifpresent则是MyBatis提供的一种非常有用的动态SQL语句的标签。它的作用是在SQL语句中根据条件的存在与否进行判断和选择,从而动态地生成不同的SQL语句。

简单来说,eqifpresent的含义就是"如果条件存在,则执行某个SQL片段;否则不执行"。这个时候,我们可以根据不同的需求来编写不同的SQL语句,从而灵活地满足各种查询场景。

eqifpresent标签的使用方法非常简单,只需要将需要动态生成的SQL语句包裹在eqifpresent标签内部即可。通过设置eqifpresent标签的test属性来判断条件是否满足,从而决定是否执行包裹的SQL语句。

总之,MyBatis和eqifpresent作为一种非常方便的持久层框架和一种有用的动态SQL标签,能够大大简化我们的数据库操作和SQL语句的编写。在接下来的正文中,我们将详细介绍MyBatis的概念和作用,以及eqifpresent标签的使用方法。请继续阅读下一节。

1.2 文章结构

本文将分为三个主要部分来讨论mybatis eqifpresent的意义和用法。以下是文章的结构安排:

第一部分是引言。在引言部分,我们将对本文要讨论的主题进行一个概述,介绍mybatis eqifpresent的背景和基本概念。同时,我们还会介绍本文的结构和目的,以帮助读者更好地理解和阅读本文。

第二部分是正文。正文部分将更详细地探讨mybatis的概念和作用,以及eqifpresent的含义和使用方法。我们将从介绍mybatis的基本原理和使用场景开始,然后深入研究eqifpresent注解在mybatis中的作用和优势,包括如何正确地使用eqifpresent进行条件判断和动态 SQL 语句的生成。此外,我们还将通过具体的示例代码和实际应用案例来展示eqifpresent的实际用法和效果。

Tk.mybatis零sql语句实现动态sql查询的方法(4种)

Tk.mybatis零sql语句实现动态sql查询的⽅法(4种)⽬录实现⽅式:

⽅式⼀:使⽤Example实现

⽅式⼆:使⽤example.createCriteria实现

⽅式三:使⽤Example.builder实现

⽅式四:使⽤weekendSqls实现

有时候,查询数据需要根据条件使⽤动态查询,这时候需要使⽤动态sql,通常我们会⾃⼰写动态sql来实现,⽐如:

SELECT id, name, score FROM tbl_student

score > #{score}

AND name LIKE #{pattern}

ORDER BY score DESc

这个sql是查询成绩⼤于90并且名字包含“i”的学⽣信息。但是有时候⼜加了⼀个条件,⼜要去改sql,改⼊参,有没有⼀种

⽅式可以将写动态sql像写代码⼀样实现呢?如果你有这个想法,推荐你了解⼀下Tk.mybatis。

关于Tk.mybatis的介绍以及如何配置,本⽂暂不介绍,不了解的请⾃⾏百度,本⽂只介绍如何基于tk.mybatis实现不写sql

语句也能实现动态sql查询。

实现⽅式:

1. 使⽤Example实现

2. 使⽤Example.createCriteria

3. 使⽤Example.builder实现

4. 使⽤WeekendSqls实现

⽅式⼀:使⽤Example实现

/**

* 第⼀种:使⽤example查询

*/

@Test

public void testSelectByExample() {

Example example = new Example(Student.class);

// 设置查询列

example.selectProperties("id","name","score");

// 动态sql

example.and()

.andGreaterThan("score",90)

.andLike("name", "%i%");

MyBatis的9种动态标签详解

MyBatis的9种动态标签详解⽬录前⾔动态标签⽤法1.if

2.choose、when、otherwise3.where4.set5.trim6.foreach7.bind

前⾔

MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind;

其执⾏原理为,使⽤OGNL从SQL参数对象中计算表达式的值,根据表达式的值动态拼接SQL,以此来完成动态SQL的功能。

动态标签⽤法

1.if

If : 当参数满⾜条件才会执⾏某个条件

SELECT FROM tab_stu stu WHERE age = 20

AND name like #{name}

2.choose、when、otherwise

choose、when、otherwise : choose标签是按顺序判断其内部when标签中的test条件是否成⽴,如果有⼀个成⽴,则choose

结束;如果所有的when条件都不满⾜时,则执⾏otherwise中的SQL。类似于java的switch语句。

SELECT FROM tab_stu stu WHERE age = #{age}

AND name like #{name}

AND class like #{class}

AND class = 1

3.where

SELECT FROM tab_stu stu WHERE

age = #{age}

AND name= #{name}

AND class = #{class}

当第⼀个if不满或第⼀第⼆第三个if都不满⾜,会出现以下情况

SELECT FROM tab_stu stu WHERE AND name = "⼩⽶" AND class ="1班”;

SELECT FROM tab_stu stu WHERE;

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档