使用 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. 什么是XML? 什么是DTD?

    XML XML称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的. W3C ...

  2. C#LeetCode刷题-几何

    几何篇 # 题名 刷题 通过率 难度 587 安装栅栏   21.5% 困难 892 三维形体的表面积 C#LeetCode刷题之#892-三维形体的表面积(Surface Area of 3D Sh ...

  3. [持续更新]——关于C++的一些可能会常用的函数

    写在前面 这些函数都是我和朋友一点一点写出来的,可能部分代码会有点雷同,但大部分代码都是自我总结出来的.目前包含的函数功能分别是: 1.设置控制台颜色 2.设置控制台光标位置 3.隐藏控制台光标 4. ...

  4. angular schametics 使用记录

    什么是 schametics Schematics是Angular团队发布的一个代码生成工具.它提供了API,可以操作文件并在Angular项目中添加新的依赖项,ng cli 创建模板就是用它. 它也 ...

  5. Scala中的Map集合

    1. Map集合 1.1 Scala中的Map介绍 Scala中的Map 和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的Map是有序的,可变的M ...

  6. 【踩坑笔记】layui之单选和复选框不显示

    直接上代码,下面前端页面代码,使用layui框架: <div class="layui-form-item">      <div class="lay ...

  7. Java中实现对集合中对象按中文首字母排序

    有一个person对象如下: public class Person { private String id;private String nam; } 一个list集合如下: List<Emp ...

  8. WordCount of Software Engineering

    1.Github项目地址:https://github.com/BayardM/WordCount 2.PSP表格(before): PSP2.1 Personal Software Process ...

  9. python列表表达式

    [expression for i in iterable if condition] expression 就是对每一个元素的具体操作表达式;iterable是某个可迭代对象,如列表,元组或字符串等 ...

  10. 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别

    目录 前言 适配过程中遇到的坑 xtrabackup 2.4和8.0区别 问题定位 坑一:MySQL 8.0 + Semi-Sync 重建问题 坑二:MySQL 8.0 + Group-Replica ...