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标签(初探))
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是一款开源的持久层框架,它采用了基于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语句的日志信息。通过打印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的使⽤说明
参数为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 是一款优秀的持久层框架,它支持定制化 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)标签
⼀、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;
