Mybatis之動態構建SQL語句


 今天一個新同事問我,我知道如何利用XML的方式來構建動態SQL,可是Mybatis是否能夠利用注解完成動態SQL的構建呢?!!答案是肯定的,MyBatis 提供了注解,@InsertProvider,@UpdateProvider,@DeleteProvider 和@SelectProvider,來幫助構建動態 SQL 語句,然后讓MyBatis 執行這些 SQL 語句。

1.@InsertProvider

1.1簡單示例使用

 

創建一個 TutorDynaSqlProvider.java 類,以及 findTutorByIdSql()方法

package com.test.myBatisTest;

import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider {
public String findTutorByIdSql(int tutorId) {
return "SELECT TUTOR_ID AS tutorId, NAME, EMAIL FROM TUTORS WHERE TUTOR_ID=" + tutorId;
}
}

 在 TutorMapper.java 接口中創建一個映射語句

@SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByIdSql")
Tutor findTutorById(int tutorId);

  1.2動態構建SQL語句

使用SQL類來構建動態SQL如下所示

import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider {
	public String findTutorByIdSql(final int tutorId) {
		return new SQL() {
			{
				SELECT("tutor_id as tutorId, name, email");
				FROM("tutors");
				WHERE("tutor_id=" + tutorId);
			}
		}.toString();
	}
}

  SQL 工具類會處理以合適的空格前綴和后綴來構造 SQL 語句。可以接受的參數類型無參數和映射器 Mapper 接口的方法以及同類型的參數 java.util.Map。 如果映射器 Mapper 接口有多個輸入參數,我們可以使用參數類型為 java.util.Map 的方法作為 SQL provider 方法。然后映射器 Mapper 接口方法所有的輸入參數將會被放到 map 中,以 param1,param2 等等作為 key,將輸入參數按

序作為 value。 你也可以使用 0,1,2 等作為 key 值來取的輸入參數。如下所示

 

 

	@SelectProvider(type = TutorDynaSqlProvider.class, method = "findTutorByNameAndEmailSql")
	Tutor findTutorByNameAndEmail(String name, String email);
	public String findTutorByNameAndEmailSql(Map<String, Object> map) {
		String name = (String) map.get("param1");
		String email = (String) map.get("param2");
		// you can also get those values using 0,1 keys
		// String name = (String) map.get("0");
		// String email = (String) map.get("1");
		return new SQL() {
			{
				SELECT("tutor_id as tutorId, name, email");
				FROM("tutors");
				WHERE("name=#{name} AND email=#{email}");
			}
		}.toString();
	}

 

  

 

1.3 SQL 工具類也提供了其他的方法來表示 JOINS,ORDER_BY,GROUP_BY 等等。

 

package com.test.myBatisTest;

import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider {
	public String selectTutorById() {
		return new SQL() {
			{
				SELECT("t.tutor_id, t.name as tutor_name, email");
				SELECT("a.addr_id, street, city, state, zip, country");
				SELECT("course_id, c.name as course_name, description,start_date, end_date");
				FROM("TUTORS t");
				LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id");
				LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id");
				WHERE("t.TUTOR_ID = #{id}");
			}
		}.toString();
	}
}

  2 使用@InsertProvider 注解創建動態的 INSERT 語句

package com.test.myBatisTest;

import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider {
	public String insertTutor(final Tutor tutor) {
		return new SQL() {
			{
				INSERT_INTO("TUTORS");
				if (tutor.getName() != null) {
					VALUES("NAME", "#{name}");
				}
				if (tutor.getEmail() != null) {
					VALUES("EMAIL", "#{email}");
				}
			}
		}.toString();
	}
}

public interface TutorMapper {
	@InsertProvider(type = TutorDynaSqlProvider.class, method = "insertTutor")
	@Options(useGeneratedKeys = true, keyProperty = "tutorId")
	int insertTutor(Tutor tutor);
}

  3.@UpdateProvider

package com.test.myBatisTest;

import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider {
	public String updateTutor(final Tutor tutor) {
		return new SQL() {
			{
				UPDATE("TUTORS");
				if (tutor.getName() != null) {
					SET("NAME = #{name}");
				}
				if (tutor.getEmail() != null) {
					SET("EMAIL = #{email}");
				}
				WHERE("TUTOR_ID = #{tutorId}");
			}
		}.toString();
	}
}

public interface TutorMapper {
	@UpdateProvider(type = TutorDynaSqlProvider.class, method = "updateTutor")
	int updateTutor(Tutor tutor);
}

  4.使用@DeleteProvider 注解創建動態地 DELETE 語句 

package com.test.myBatisTest;

import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.jdbc.SQL;

public class TutorDynaSqlProvider {
	public String deleteTutor(int tutorId) {
		return new SQL() {
			{
				DELETE_FROM("TUTORS");
				WHERE("TUTOR_ID = #{tutorId}");
			}
		}.toString();
	}
}

public interface TutorMapper {
	@DeleteProvider(type = TutorDynaSqlProvider.class, method = "deleteTutor")
	int deleteTutor(int tutorId);
}

  以上就是使用注解的方式來動態的構建SQL,可以說和XML方式有很大的不同,但是功能上面似乎沒有XML方式的強大,我個人更喜歡使用XML的方式來構建,同時對參數進行各種操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM