MyBatis使用@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider注解來幫助構建動態SQL語句。着四種注解都有type屬性,該屬性指定一個類;method屬性指定該類的方法,其用來提供需要執行的SQL語句。
org.apache.ibatis.SQL類常用方法:
T SELECT(String columns)。開始或追加SELECT子句。
T FROM(String table)。啟動或追加FROM子句。
T JOIN(String join)。想JOIN子句添加一個新的查詢條件。
T INNER_JOIN(String join)。內連接。
T LEFT_OUTER_JOIN(String join)。左外連接。
T RIGHT_OUTER_JOIN(String join)。右外連接。
T WHERE(String conditions)。追加一個新的WHERE子句條件。
T OR()。使用OR拆分當前where子句條件。
T AND()。使用AND拆分當前where子句條件。
T GROUP_BY(String columns)。追加一個新的group by子句元素。
T HAVING(String conditions)。追加一個新的having子句條件。
T ORDER_BY(String columns)。追加一個新的ordre by子句元素。
T INSERT_INTO(String tableName)。啟動insert語句插入到指定表。
T VALUES(String columns,String values)。追加的insert語句。
T DELETE_FROM(String table)。啟動delete語句,並指定表刪除。
T UPDATE(String table)。啟動一個update語句,並指定表更新。
T SET(Sting sets)。追加update的set列表。
示例:
/MyBatisAnnotation/src/com/web/mybatis/mapper/User3Mapper.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="com.web.mybatis.mapper.User3Mapper"> </mapper>
/MyBatisAnnotation/src/com/web/mybatis/mapper/User3Mapper.java
package com.web.mybatis.mapper; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.InsertProvider; import org.apache.ibatis.annotations.SelectProvider; import com.web.mybatis.domain.User3; public interface User3Mapper { //動態SQL查詢 @SelectProvider(type=User3DynaSqlProvider.class,method="selectWhitParam1") List<User3> selectWhitParm1(Map<String,Object> param); @SelectProvider(type=User3DynaSqlProvider.class,method="selectWhitParam2") List<User3> selectWhitParm2(User3 user); //動態插入 @InsertProvider(type=User3DynaSqlProvider.class,method="insertUser3") void insertUser3(User3 user); }
/MyBatisAnnotation/src/com/web/mybatis/mapper/User3DynaSqlProvider.java
package com.web.mybatis.mapper; import java.util.Map; import org.apache.ibatis.jdbc.SQL; import com.web.mybatis.domain.User3; public class User3DynaSqlProvider { //Map參數 public String selectWhitParam1(Map<String,Object> param) { return new SQL() { { SELECT("*"); FROM("tb_user3"); if(param.get("id") != null) { WHERE("id = #{id}"); } if(param.get("loginname") != null) { WHERE("loginname = #{loginname}"); } if(param.get("password") != null) { WHERE("password = #{password}"); } } }.toString(); } //User對象參數 public String selectWhitParam2(User3 user) { return new SQL() { { SELECT("*"); FROM("tb_user3"); if(user.getId() != null) { WHERE("id = #{id}"); } if(user.getLoginname() != null) { WHERE("loginname = #{loginname}"); } if(user.getPassword() != null) { WHERE("password = #{password}"); } } }.toString(); } //動態插入 public String insertUser3(User3 user) { return new SQL() { { INSERT_INTO("tb_user3"); if(user.getId() != null) { VALUES("id","#{id}"); } if(user.getLoginname()!=null) { VALUES("loginname","#{loginname}"); } if(user.getPassword()!=null) { VALUES("password","#{password}"); } } }.toString(); } }
/MyBatisAnnotation/src/com/web/mybatis/test/DynamiSqlTest.java
package com.web.mybatis.test; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import com.web.mybatis.domain.User3; import com.web.mybatis.factory.FKSqlSessionFactory; import com.web.mybatis.mapper.User3Mapper; public class DynamiSqlTest { //Map參數 public static void testSelectWhitParam1() { SqlSession session = FKSqlSessionFactory.getSqlSession(); User3Mapper um = session.getMapper(User3Mapper.class); Map<String,Object> map = new HashMap<String,Object>(); map.put("loginname", "tom"); map.put("password", "123456"); List<User3> list = um.selectWhitParm1(map); list.forEach(user->System.out.println(user.toString())); session.commit(); session.close(); } //User3對象參數 public static void testSelectWhitParam2() { SqlSession session = FKSqlSessionFactory.getSqlSession(); User3Mapper um = session.getMapper(User3Mapper.class); User3 user3 = new User3(); user3.setLoginname("tom"); user3.setPassword("123456"); List<User3> list = um.selectWhitParm2(user3); list.forEach(user->System.out.println(user.toString())); session.commit(); session.close(); } //動態插入 public static void testInsertUser3() { SqlSession session = FKSqlSessionFactory.getSqlSession(); User3Mapper um = session.getMapper(User3Mapper.class); User3 user3 = new User3(); user3.setId(2); user3.setLoginname("jack"); user3.setPassword("123456"); um.insertUser3(user3); session.commit(); session.close(); } public static void main(String[] args) { // testSelectWhitParam2(); testInsertUser3(); } }
以上為插入和查詢的示例,還有更新和刪除的示例將不再仔細寫例子,以下貼出更新和刪除的User3DynaSqlProvider.java中方法
//動態更新 public String updateUser3(User3 user) { return new SQL() { { UPDATE("tb_user3"); if(user.getLoginname() != null) { SET("loginname = #{loginname}"); } if(user.getPassword() != null) { SET("password = #{password}"); } WHERE("id = #{id}"); } }.toString(); } //動態刪除 public String deleteUser3(User3 user) { return new SQL() { { DELETE_FROM("tb_user3"); if(user.getId() != null) { WHERE("id = #{id}"); } if(user.getLoginname() != null) { WHERE("loginname = #{loginname}"); } if(user.getPassword() != null) { WHERE("password = #{password}"); } } }.toString(); }