动态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查询在实际的使用中非常广。