`

MyBatis学习6之动态sql

阅读更多

参照官网: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

 

  • 大小: 23.4 KB
分享到:
评论

相关推荐

    MyBatis学习之三动态SQL语句[借鉴].pdf

    MyBatis学习之三动态SQL语句[借鉴].pdf

    Mybatis学习笔记之动态SQL揭秘

    主要给大家介绍了关于Mybatis学习笔记之动态SQL的相关资料,小编觉得挺不错的,对大家学习或者使用Mybatis会有一定的帮助,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    什么是mybatis动态sql以及学习mybatis动态sql的意义

    mybatis动态sql

    这款插件旨在帮助Mybatis初学者生成动态SQL片段.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

    mybatis动态SQL练习 动态查询 动态修改.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

    MyBatis Dynamic SQL 动态sql案例.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

    Mybatis4 之Mybatis动态sql的实现代码

    主要介绍了Mybatis4 之Mybatis动态sql的实现代码,本文给大家提到了静态sql与动态sql有什么区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

    主要介绍了Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    MyBatis学习代码

    MyBatis学习代码: mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in...

    SSM框架的学习与应用-Java EE企业级应用开发学习记录(第三天)Mybatis的深入学习(动态sql的操作)

    本资源主要介绍了MyBatis动态SQL的使用。通过对MyBatis的动态SQL各个元素进行详细说明,并且有测试类帮助理解。...综上,本资源主要通过大量示例详细介绍了MyBatis各种动态SQL元素的用法,可以作为学习动态SQL的参考。

    mybatis sql学习

    MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突  在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不...

    MyBatis动态SQL:构建灵活查询的利器.md

    内容概要:本文介绍了MyBatis动态SQL的基本概念、常用标签和使用技巧,帮助读者了解如何...用途:通过本文的学习,读者将能够掌握MyBatis动态SQL的使用方法,提高数据库查询的效率和灵活性,优化代码质量和可维护性。

    MyBatis主配置文件

    MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习 之 二、SQL语句映射文件(1)resultMap MyBatis学习 之 二、SQL语句映射...MyBatis学习 之 三、动态SQL语句 MyBatis学习 之 四、MyBatis配置文件

    springboot集成mybatis动态sql.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

    Mybatis动态SQL高级映射.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

    动态SQL插件,提供mybatis xml SQL动态脚本添加、删除接口,达到不用重启项目,通过接口动态变更SQL的效果.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

    详解MyBatis直接执行SQL查询及数据批量插入

    主要介绍了MyBatis直接执行SQL查询及数据批量插入的相关知识,需要的朋友一起学习吧

    Mybatis中的动态SQL语句解析

    这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下  Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,...

    Mybatis学习笔记整合架构

    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将...

    MyBatis框架的Dao代理、动态SQL、配置文件的学习.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

Global site tag (gtag.js) - Google Analytics