使用 if where foreach标签对映射配置文件中sql语句进行动态配置

1、首先在dao接口中设置两个查询方法

 package sun.dao;

 import sun.domain.QueryObj;
import sun.domain.User; import java.util.List; public interface UserDao { /**
* 根据已有条件进行查询(if where)
*/
List<User> findUserByCondition(User user); /**
* 根据集合中的id进行查询(if where foreach)
*/
List<User> findUserByList(QueryObj qobj);
}

2、配置映射配置文件(使用if where foreach三种标签)

 <?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="sun.dao.UserDao">
<resultMap id="userMap" type="sun.domain.User">
<!--主键字段对应-->
<id property="user_id" column="id"></id>
<!--非主键关系对应-->
<result property="user_name" column="username"></result>
<result property="user_birthday" column="birthday"></result>
<result property="user_address" column="address"></result>
<result property="user_sex" column="sex"></result>
</resultMap> <!--公共sql语句抽取-->
<sql id="defaultSelect">
select * from user
</sql> <!--根据条件进行查询-->
<select id="findUserByCondition" resultMap="userMap" parameterType="user">
<include refid="defaultSelect"></include>
<where>
<if test="user_name!=null">
and username=#{user_name}
</if>
<if test="user_sex!=null">
and sex=#{user_sex}
</if>
</where>
</select>
<!--根据id列表进行查询-->
<select id="findUserByList" parameterType="queryobj" resultMap="userMap">
<include refid="defaultSelect"></include>
<where>
<if test="ids!=null and ids.size()>0">
<foreach collection="ids" open="id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
</mapper>

在映射配置文件中可以使用sql标签对常用的sql语句进行抽取,在操作标签内如果需要使用该sql语句可使用include标签进行导入即可。

(注意:使用sql语句进行抽取时,sql语句后面不要添加分号,否则会导致在操作标签内引用后拼接sql字符串时造成错误)

如果在该段代码中有关于parameterType未使用全限定类名的疑惑请参考Mybatis项目构建和CURD操作博客最下面的properties标签和typeAliases标签的使用

3、测试类中进行测试

 package sun.test;

 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.After;
import org.junit.Before;
import org.junit.Test;
import sun.dao.UserDao;
import sun.domain.QueryObj;
import sun.domain.User; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; public class MybatisTest { private InputStream in;
private SqlSession sqlSession;
private UserDao userDao; @Before
public void init() throws IOException {
// 读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 使用工厂生产sqlsession对象
sqlSession = factory.openSession();
// 使用sqlsession创建UserDao接口代理对象
userDao = sqlSession.getMapper(UserDao.class);
} @After
public void destory() throws IOException {
sqlSession.commit();
sqlSession.close();
in.close();
} @Test
public void conditionTest(){
User user = new User();
user.setUser_name("kelvin");
user.setUser_sex("女");
List<User> users = userDao.findUserByCondition(user);
for (User user1 : users) {
System.out.println(user1);
}
} @Test
public void ids(){
QueryObj queryObj = new QueryObj();
ArrayList<Integer> ids = new ArrayList<Integer>();
ids.add(51);
ids.add(52);
ids.add(53);
queryObj.setIds(ids);
List<User> users = userDao.findUserByList(queryObj);
for (User user : users) {
System.out.println(user);
} }
}

测试结果如下:

Mybatis动态SQL配置的更多相关文章

  1. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  2. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  3. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  4. mybatis动态sql中的两个内置参数(_parameter和_databaseId)

    mybatis动态sql中的两个内置参数(_parameter和_databaseId)   <!-- mybatis动态sql的两个内置参数           不只是方法传递过来的参数可以被 ...

  5. mybatis动态sql和分页

    mybatis动态sql foreach BookMapper.xml <select id="selectBooksIn" resultType="com.lin ...

  6. Mybatis动态sql及分页、特殊符号

    目的: mybatis动态sql(案例:万能查询) 查询返回结果集的处理 mybatis的分页运用 mybatis的特殊符号 mybatis动态sql(案例:万能查询) 根据id查询 模糊查询 (参数 ...

  7. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  8. 【MyBatis】MyBatis 动态 SQL

    MyBatis 动态SQL if 可以根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分. 持久层 DAO 接口: pub ...

  9. mybatis动态sql以及分页

    1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 1.mybatis动态sql If.trim.foreach If 标签判断某一字段是否为空 &l ...

随机推荐

  1. Vue视图渲染原理解析,从构建VNode到生成真实节点树

    前言 在 Vue 核心中除了响应式原理外,视图渲染也是重中之重.我们都知道每次更新数据,都会走视图渲染的逻辑,而这当中牵扯的逻辑也是十分繁琐. 本文主要解析的是初始化视图渲染流程,你将会了解到从挂载组 ...

  2. 使用halo搭建自己的博客并配置https域名访问

    首先进行java配置 # 1. 下载jdk [下载地址](https://www.oracle.com/cn/java/technologies/javase-downloads.html) - 一定 ...

  3. python设计模式之责任链模式

    python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...

  4. JavaScript在HTML中的基础用法总结

    网页主要由三部分组成,分别为html.CSS和Javascript.如果说HTML是肉身,CSS是皮相,那Javascript就是灵魂.因此,三者的联系与融合则至关重要.本文就来为大家讲解一下Java ...

  5. 019-链接 使用name属性

    路由设置: (r'/', index.IndexHandler), tornado.web.url(r'/lj', index.LJHandler, {"word3":" ...

  6. Magento 2 Factory Objects

    In object oriented programming, a factory method is a method that’s used to instantiate an object. F ...

  7. idea git拉取、合并、处理冲突、提交代码具体操作

    早在两个月前我还在用eclipse开发,并且也发布的一些eclipse git的相关操作(操作都是本人亲自实践过的),但由于项目团队要求,开发工具统一用idea,实在不得已而为之切换了开发工具, 初次 ...

  8. 用python实现实时监控网卡流量

    很多时候,我们是需要查看服务器的网卡当前跑了多大流量,但对于网卡流量的查询,在linux下似乎没有像top那样的原生命令.虽然top功能很强大,可以实时查看cpu.内存.进程的动态,但是却没有对网卡流 ...

  9. 个人项目作业WC(JAVA)

    GitHub地址:https://github.com/1666403186/WC 一.题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行单元测试.回归 ...

  10. virtualenv最佳实战

    一 系统环境 windows 10 64-bit 安装python 2.7.18 和python 3.8两个版本 二 安装 默认会把virtualenv安装到系统默认python版本中 pip ins ...