Mybatis学习笔记七 动态查询语句

动态sql查询语句

1、动态sql査询介绍:

动态sql是Mybatis框架中极其强大的一项功能。在实际的软件开发中,经常有这样的一个霈求场录:査询某一张表中的数据记录时,査询的条件有很多个,但査询的条件个数不确定。

a、在jdbc中要实现条件个数不确定的查询非常麻烦,常用的一种思路是:先通过if语句判断某一个条件是否存在,然后通过字符 串中的方法来拼接sql语句

b、在Mybatis中有很多非常实用的标签,例如可以通过if标签来实现sql语句的动态査询


实例

工程目录:

        

mybatis.xml

没有做任何改变,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 
		注释快捷键:ctrl+shift+/
		default与id值保持一致
	 -->
	 <environments default="mysql">
	 	<!-- 
	 		environment代表的是环境
	 	 -->
	 	<environment id="mysql">
	 		<!-- 
	 			transactionManager:代表的是数据库的事务
	 			type:值统一使用JDBC
	 		 -->
	 		<transactionManager type="JDBC"></transactionManager>
	 		<!-- 
	 			dataSource:代表的是数据源,数据源中需要配置driver、url、username、password等信息
	 			type:POOLED
	 		 -->
	 		<dataSource type="POOLED">
	 			<!-- 配置数据库驱动 -->
	 			<property name="driver" value="com.mysql.jdbc.Driver"/>
	 			<!-- 配置url -->
	 			<property name="url" value="jdbc:mysql://localhost:3306/spriing_book"/>
	 			<!-- 配置用户名 -->
	 			<property name="username" value="root"/>
	 			<!-- 配置密码 -->
	 			<property name="password" value="123"/>
	 		</dataSource>
	 	</environment>
	 </environments>
	 <!-- 
	 	可以通过mapper标签将主配置文件Mybatis.xml与局部配置文件关联起来
	 		resource:局部配置文件的路径
	 	
	  -->
	 <mappers>
	 	<mapper resource="cn/java/dao/impl/ComputerDaoImpl.xml"/>
	 </mappers>
</configuration>

Computer.java

也未做任何改变

package cn.java.entity;

public class Computer {
	private String isbn;
	private String book_name;
	private String price;
	public String getIsbn() {
		return isbn;
	}
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
	public String getBook_name() {
		return book_name;
	}
	public void setBook_name(String book_name) {
		this.book_name = book_name;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Computer [isbn=" + isbn + ", book_name=" + book_name + ", price=" + price + "]";
	}
	
}

局部配置文件

ComputerDaoImpl.xml


注意:为了避免sql语句传入参数为空,这样设置sql 语句:

select * from book where 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是局部配置文件中的根标签,类似于html文件中的html标签
		namespace:代表的是唯一的表示符,其值与某一个dao层类的路径保持一致
 -->
<mapper namespace="cn.java.dao.impl.ComputerDaoImpl">
	<!--
	 动态查询语句
	
	 -->
	 <select id="dynamicSelect" parameterType="Map" resultType="Map">
	 	select * from book where 1=1
	 	<!-- 当这个sql语句一个数据都不带的时候,就会默认去查询所有的数据 -->
	 	<if test="isbn!=unll">
	 		and isbn=#{isbn}
	 	</if>
	 	
	 	<if test="book_name!=null">
	 		and book_name=#{book_name}
	 	</if>
	 	
	 	<if test="price!=null">
	 		and price=#{price}
	 	</if>
	 </select>
	 
</mapper>
测试方法
ComputerDaoImpl.java

package cn.java.dao.impl;

import static org.hamcrest.CoreMatchers.nullValue;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.xml.bind.annotation.XmlTransient;

import org.apache.ibatis.annotations.One;
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 cn.java.entity.Computer;

public class ComputerDaoImpl {
	private static SqlSession session=null;
	@Before
	public void init(){
		try {
			SqlSessionFactoryBuilder sfb=new SqlSessionFactoryBuilder();
			InputStream ins=Resources.getResourceAsStream("mybatis.xml");
			SqlSessionFactory ssf= sfb.build(ins);
			session=ssf.openSession();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void dynamicSelect() throws IOException{	
		//封装参数
		Map<String , Object> parameterMap=new HashMap<String , Object>();
		//parameterMap.put("isbn", "1001");
		parameterMap.put("book_name", "Oracle");
		List<Map<String, Object>> resultLists=session.selectList("cn.java.dao.impl.ComputerDaoImpl.dynamicSelect", parameterMap);
		for (Map<String, Object> map : resultLists) {
			System.out.println(map);
		}
	}
	
}

动态sql查询在实际的使用中非常广。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不染心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值