12.MyBatis动态SQL

动态SQL

  • Dynamic SQL, 动态SQL 不是固定写死的SQL,可以根据输入条件变化,可以参考 MyBatis 的官方文档。

<if> 相当于 if (…){…}

<choose><when><otherwise> 相当于 if…else if…else

  • 本例按照学号区间,查询student表

1.指定起止,如 begin=20190003 , end=20190006

2.只有开始,如 begin=20190003

3.只有结束,如 end=20190006

4.即没有开始,也没有结束

这种根据条件而变化的SQL,可以使用动态SQL。

1.修改mybatis-mapper.xml

<?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="af.test">

  <select id="getStudent" resultType="my.Student">
    select * from student 
    	<where>
    	   <if test="begin != null">
		    	id &gt;= #{begin}
		   </if>
      	   <if test="end != null">
		   	 	AND id &lt;= #{end}
		   </if>  	
    	</where> 
  </select>
    
</mapper>

 使用 <where> 标签,里面嵌多个<if>,这么写的时候,MyBatis会自己处理,当第一个<if>为空时,后面紧跟着的 AND 会被 MyBatis忽略。也可以这样写

select * from student where 1=1
<if …>
    AND id &gt;= #{begin}
</if>
<if test="end != null">
    AND id &lt;= #{end}
</if> 

2.在mybatis-config.xml添加此mapper

<?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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1/af_example?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="a1b2c3"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
	<mapper resource="mybatis-mapper.xml"/>
  </mappers>
</configuration>

3.注释参数进行测试

package my;

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

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Test
{
	public static void main(String[] args) throws Exception
	{
		// 创建 SqlSessionFactory
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

		try (SqlSession session = sqlSessionFactory.openSession()) {
			
			HashMap<String,Object> map = new HashMap<>();
			//map.put("begin", 20190003);
			//map.put("end", 20190006);
			
			List<Student> rows = session.selectList("af.test.getStudent", map);
			for(Student s : rows )
			{
				System.out.println(s.id + "\t," + s.name);
			}
		}
		
		System.out.println("Exit");
	}

}

4.结果略去啦,构造的SQL可以在控制台看到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值