使用mybatis提供的各种标签方法实现动态拼接Sql。这里演示where标签和if标签实现使用姓名的模糊查询和性别查询用户列表,当用户没有选择姓名以及性别时查询出所有的记录。
1.需求:
使用姓名的模糊查询和性别查询用户列表,当用户没有选择姓名以及性别时查询出所有的记录。
2.在UserMapper接口中定义方法:
public List<User> findUserByNameAndSex(User user);
3.在UserMapper.xml中进行配置:
- <?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接口代理实现编写规则:
- 1.映射文件中namespace要等于接口的全路径
- 2.通过sql语句实现数据库的操作
- 3.映射文件中sql语句id要等与于接口的方法名称
- 4.映射文件中传入参数类型要等于接口方法的传入参数类型
- 5.映射文件中返回结果集类型要等于接口方法的返回值类型
- -->
- <mapper namespace="com.huida.mapper.UserMapper">
- <select id="findUserByNameAndSex" parameterType="com.huida.po.User" resultType="com.huida.po.User">
- <!-- select * from user where 1=1 and username like "%${username}%" and sex=#{sex} -->
- select * from user
- <!-- where标签有两个作用:
- 1.替代where关键字
- 2.会去掉第一个条件的and关键字,会自动加上1=1永真条件,也就是放当后面的条件为null时,执行永真条件
- -->
- <where>
- <if test="username!=null and username!=''">
- and username like "%${username}%"
- </if>
- <if test="sex!=null and sex!=''">
- and sex=#{sex}
- </if>
- </where>
- </select>
- </mapper>
我们为了实现当用户名以及性别都为null时,查询到用户列表中的所有记录,所以sql语句写为:
select * from user where 1=1 and username like "%${username}%" and sex=#{sex}
这里面有一个1=1的永真判断条件用于实现当后面的两个条件均为空时执行永真条件而不会报错。
where标签有两个作用:
1.替代where关键字
2.会去掉第一个条件的and关键字,会自动加上1=1永真条件,也就是放当后面的条件为null时,执行永真条件。
在if标签中注意要做不等于空字符串校验。
4.测试代码:
- package com.huida.test;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.List;
- import javax.management.Query;
- 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 org.junit.Before;
- import org.junit.Test;
- import org.omg.PortableInterceptor.USER_EXCEPTION;
- import com.huida.mapper.UserMapper;
- import com.huida.po.User;
- import com.huida.vo.QueryVo;
- public class UserMapperTest {
- private SqlSessionFactory factory=null;
- @Before
- public void init() throws Exception{
- //通过流将核心配置文件读取进来
- InputStream inputStream=Resources.getResourceAsStream("config/SqlMapConfig.xml");
- //通过核心配置文件输入流来创建工厂
- factory=new SqlSessionFactoryBuilder().build(inputStream);
- }
- @Test
- public void testfindUserByNameAndSex(){
- //创建SqlSession
- SqlSession openSession=factory.openSession();
- //通过会话的getMapper方法来实例化接口(实现类的对象)
- UserMapper userMapper=openSession.getMapper(UserMapper.class);//参数放接口的字节码文件
- User user=new User();
- user.setSex("2");
- user.setUsername("aa");
- List<User> list=userMapper.findUserByNameAndSex(user);
- System.out.println(list);
- }
- }
使用mybatis提供的各种标签方法实现动态拼接Sql。这里演示where标签和if标签实现使用姓名的模糊查询和性别查询用户列表,当用户没有选择姓名以及性别时查询出所有的记录。的更多相关文章
- 使用mybatis提供的各种标签方法实现动态拼接Sql。使用foreach标签实现遍历查询。比如实现select * from user where id in(1,10,24)这条sql查询语句。
向sql传递数组或List,mybatis使用foreach解析,如下: 需求: 传入多个id查询用户信息,用下边的sql实现: select * from user where id in(1,10 ...
- 使用mybatis提供的各种标签方法实现动态拼接Sql。使用sql片段提取重复的标签内容
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下: <select id="findUserByNameAndSex" par ...
- mybatis if test 相等的情况怎样动态拼接sql
今天程序须要依据前台的传过来的状态推断在数据库里是取 where a>b 还是 a<b 还是 a=0 的情况 搞了一下午最后试了下 在if 里面拼接 #{status}=#{statu ...
- mybatis使用注解替代xml配置,动态生成Sql
mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...
- Mybatis笔记 - SQL标签方法
Mpper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一.内容标签 1.NamePlac ...
- Mybatis总结一之SQL标签方法
---恢复内容开始--- 定义:mapper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. ...
- Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器
关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...
- 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)
此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...
- 查询拼接SQL语句,多条件模糊查询
多条件查询,使用StringBuilder拼接SQL语句,效果如下: 当点击按钮时代码如下: private void button1_Click(object sender, EventArgs e ...
随机推荐
- Linux udhcp client (udhcpc) get IP at anytime
/*************************************************************************************** * Linux udh ...
- [QT]QPixmap图片缩放和QLabel 的图片自适应效果对比
图片大小为600x600 效果图: ui->label->setScaledContents(true); ...
- RabbitMQ引入
引入MQ话题 可能很多人有疑惑:MQ到底是什么?哪些场景下要使用MQ? 前段时间安装了RabbitMQ,现在就记录下自己的学习心得吧.首先看段程序: class Program { static vo ...
- vue-cli 本地开发mock数据使用方法
vue-cli 中可以通过配置 proxyTable 解决开发环境的跨域问题,具体可以参考这篇文章: Vue-cli proxyTable 解决开发环境的跨域问题 如果后端接口尚未开发完成,前端开发一 ...
- python中多进程+协程的使用以及为什么要用它
前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...
- bzoj2330糖果
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束裸题.练习用spfa判正环(一个点入队超过n次). 据说有1e5个点连成一条链 ...
- Form中的keypress事件不能用
Form中的keypress事件不能用 编写人:CC阿爸 2015-4-8 近期在修改系统时,想给一画面增加一个组合键功能,但在form_keypress事件中加入代码,但无论如何也不能触发该动作. ...
- Python 定期检查Build_setting的编译情况
#!/usr/bin/python #_*_ coding:utf-8 _*_ import time from email.MIMEText import MIMEText from email.M ...
- Java通过匿名类来实现回调函数
在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2() ...
- 黄聪:wordpress向mysql字段中保存html代码(使用add_option()方法),然后无法显示出问题
你可以把" 引号去掉了再进库,或者使用 stripslashes_deep() <?php $str = "Is your name O\'reilly?"; // ...