参照官网:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
1、数据准备(表结构以及示例数据)
2、查询结构实体类PersonInfoVo.java
public class PersonInfoVo { private int id; private String userName; private String password; private int pid; private int state; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public int getState() { return state; } public void setState(int state) { this.state = state; } }
3.1查询用户名带有er的用户信息
3.1.1编写sql映射
<?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="com.zlt.mybatis.vo.PersonInfoVo"> <select id="queryPerson" resultMap="personResultMap" parameterType="String"> select id,user_name,password,pid,state from t_user where state = 1 <if test="user_name != null"> and user_name like #{userName} </if> </select> <resultMap type="com.zlt.mybatis.vo.PersonInfoVo" id="personResultMap"> <id property="id" column="id"/> <result property="userName" column="user_name"/> <result property="password" column="password"/> <result property="pid" column="pid"/> <result property="state" column="state"/> </resultMap> </mapper>
第二种写法:bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文
<!-- 模糊查询 --> <select id="queryPerson" resultMap="personResultMap" parameterType="String"> <bind name="pattern" value="'%' + _parameter + '%'" /> select id,user_name,password,pid,state from t_user where state = 1 <if test="_parameter != null"> and user_name like #{pattern} </if> </select> <resultMap type="com.zlt.mybatis.vo.PersonInfoVo" id="personResultMap"> <id property="id" column="id"/> <result property="userName" column="user_name"/> <result property="password" column="password"/> <result property="pid" column="pid"/> <result property="state" column="state"/> </resultMap>
3.1.2、加载sql映射文件(mybatis.xml)
<mappers> <mapper resource="com/zlt/mybatis/mapping/PersonMapper.xml"/> </mappers>
3.1.3、编写单元测试
public void testQuery(){ SqlSession session = null; try{ session = sqlSessionFactory.openSession(); String statement = "com.zlt.mybatis.vo.PersonInfoVo.queryPerson"; //List<PersonInfoVo> persons = session.selectList(statement); Map<String, String> map = new HashMap<String, String>(); map.put("userName", "er"); List<PersonInfoVo> persons = session.selectList(statement,map); for(PersonInfoVo person : persons){ if(null != person) { System.out.println("id:" + person.getId() + "userName:" + person.getUserName() + "password:" + person.getPassword() + "pid:" + person.getPid() +"state:" + person.getState()); } } }finally{ if(null != session) session.close(); } }
第二种测试单元测试
public void testQuery(){ SqlSession session = null; try{ session = sqlSessionFactory.openSession(); String statement = "com.zlt.mybatis.vo.PersonInfoVo.queryPerson"; //List<PersonInfoVo> persons = session.selectList(statement); //Map<String, String> map = new HashMap<String, String>(); //map.put("userName", "er"); List<PersonInfoVo> persons = session.selectList(statement,"er"); for(PersonInfoVo person : persons){ if(null != person) { System.out.println("id:" + person.getId() + "userName:" + person.getUserName() + "password:" + person.getPassword() + "pid:" + person.getPid() +"state:" + person.getState()); } } }finally{ if(null != session) session.close(); } }
3.1.4、运行结果:
id:2userName:lisierpassword:123456pid:2state:1 id:3userName:wangerpassword:123456pid:3state:1
3.2查询用户含有"li",并且pid为2的用户信息
3.2.1编写SQL映射
<select id="queryPerson2" resultMap="personResultMap2" parameterType="String"> select id,user_name,password,pid,state from t_user where state = 1 <if test="user_name != null"> and user_name like #{userName} </if> <if test="pid != null"> and pid =#{pid} </if> </select> <resultMap type="com.zlt.mybatis.vo.PersonInfoVo" id="personResultMap2" extends="personResultMap"> </resultMap>
3.2.3加载SQL映射文件
<mappers> <mapper resource="com/zlt/mybatis/mapping/PersonMapper.xml"/> </mappers>
3.2.4编写单元测试
public void testQuery2(){ SqlSession session = null; try{ session = sqlSessionFactory.openSession(); String statement = "com.zlt.mybatis.vo.PersonInfoVo.queryPerson2"; //List<PersonInfoVo> persons = session.selectList(statement); Map<String, String> map = new HashMap<String, String>(); map.put("userName", "li"); map.put("pid", "2"); List<PersonInfoVo> persons = session.selectList(statement,map); for(PersonInfoVo person : persons){ if(null != person) { System.out.println("id:" + person.getId() + "\tuserName:" + person.getUserName() + "\tpassword:" + person.getPassword() + "\tpid:" + person.getPid() +"\tstate:" + person.getState()); } } }finally{ if(null != session) session.close(); } }
3.2.5运行结果
id:2 userName:lisier password:123456 pid:2 state:1
相关推荐
3. **动态SQL修改**:MyBatis的动态SQL功能允许我们根据参数动态地构建SQL语句。例如,我们可以根据传入的参数来决定是否在WHERE子句中添加LIKE条件。这在处理模糊查询时非常有用。在PagingByExampl.java中,可能就...
MyBatis动态SQL的强大之处在于其能够根据不同的业务场景灵活地生成SQL语句,从而提高数据库操作的效率和灵活性。通过对MyBatis动态SQL的学习和实践,开发者可以更好地应对复杂多变的应用场景,提高代码的质量和可...
Mybatis动态SQL揭秘 Mybatis中的动态SQL是一种强大的特性,它能够使我们在SQL语句中实现某些逻辑,使得我们的开发更加灵活和高效。在本篇文章中,我们将对Mybatis中的动态SQL进行详细的介绍,并提供一些实用的示例...
Mybatis 是一款流行的 Java 持久层框架,它的核心特性之一是动态 SQL。动态 SQL 允许开发者根据条件在 SQL 查询中灵活地构建不同的逻辑,极大地提高了代码的可读性和可维护性。本测试项目提供了 Mybatis 动态 SQL 的...
mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...
本资料主要围绕MyBatis的基本CRUD操作和动态SQL展开,同时包含了日志配置文件`log4j.properties`,用于帮助调试和优化应用程序的日志输出。 首先,MyBatis的核心概念是Mapper接口和XML映射文件。在创建CRUD操作时,...
mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...
在实际开发中,MyBatis动态SQL已经成为许多项目的首选技术之一。然而,随着技术的不断发展,未来可能会有更多的框架和工具涌现,提供更加高效和安全的数据库操作方式。因此,对于开发者来说,持续学习和探索新技术,...
mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...
在MyBatis框架中,动态SQL是其强大且灵活的功能之一,它允许我们在不编写大量重复的Java代码或SQL语句的情况下,根据条件构建复杂的查询。动态SQL的主要优点在于能够根据业务逻辑的变化自适应地调整SQL语句,提高了...
"MYBATIS学习资料文件"这一标题明确指出,这是一份与MyBatis相关的学习资源集合,可能包含教程、示例代码、笔记等,旨在帮助用户理解和掌握MyBatis这一流行的数据持久层框架。 【描述解读】 描述中提到“mybatis所...
MyBatis学习代码: mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in...
当然,这只是一个基础的例子,MyBatis还有许多高级特性,如动态SQL、结果映射、缓存等,可以根据实际需求进行深入学习和应用。在实际项目中,你还可以结合Spring Boot等框架,实现更便捷的自动化配置和管理。
本资源主要介绍了MyBatis动态SQL的使用。通过对MyBatis的动态SQL各个元素进行详细说明,并且有测试类帮助理解。...综上,本资源主要通过大量示例详细介绍了MyBatis各种动态SQL元素的用法,可以作为学习动态SQL的参考。
【loiane-mybatis-dynamic-sql-learn】这个文件名可能是指一个关于Loiane Gronefeld的MyBatis动态SQL学习资源。动态SQL是MyBatis的一大特色,它允许在运行时根据条件动态生成SQL语句,极大地增强了SQL的灵活性。 ...
1. **动态SQL**: 动态SQL是MyBatis的核心特性之一,它允许我们在运行时根据条件构建SQL语句。这极大地提高了代码的可读性和可维护性,避免了大量硬编码的SQL字符串。动态SQL主要通过`<if>`, `<choose>`, `<when>`, `...
mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...
【标题】"MyBatis学习笔记1" 涉及的知识点主要集中在MyBatis这一流行的持久层框架上。MyBatis是一个优秀的Java ORM(对象关系映射)框架,它允许开发者将SQL查询与Java代码分离,使得数据库操作更加灵活且易于维护。...
MyBatis 的动态 SQL 功能强大,如 `if`、`choose`(when/otherwise)、`trim`、`where`、`foreach` 等标签,可以编写出复杂的、可复用的 SQL 语句。 8. **缓存机制**: MyBatis 内置了第一级缓存(SqlSession ...
6. **动态 SQL**:MyBatis 的强大之处在于它的动态 SQL 功能,可以通过 `<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<set>`, `<foreach>` 等标签来构建灵活多变的 SQL 语句,避免了大量的字符串拼接...