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(); }