MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建立动态语言和让MyBatis执行这些语言。
先贴上代码:这个实现了一个对teacher实体类进行动态的多条件查询
1、新建一个类 TeacherSqlProvider 这个最好这么命名比较符合规范吧
public class TeacherSqlProvider {
public String queryStudentByTeacher(Map<String,Object> map){
BEGIN();
SELECT("sname,s.sex,tname");
FROM("student s");
INNER_JOIN("teacher t on s.tid=t.tid");
if(map.get("sname")!=null)
WHERE("sname=#{sname}");
if(map.get("sex")!=null){
WHERE("t.sex=#{sex}");
}
return SQL();
}
}
2、在TeacherDao加入查询方法:
@SelectProvider(type=TeacherSqlProvider.class,method="queryStudentByTeacher")
public List<Map<String,Object>> queryStudentByTeacher(Map<String,Object> map);
这里注意了 我们用map来传递参数(map的key-value格式与json数据格式无缝集成),返回的类型也必须是map
3、在JUnit中测试
@Test
public void testMap(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("sname", "小明");
map.put("sex", "男");
List<Map<String,Object>> res = session.getMapper(StudentDao.class).queryScoreByStudent(map);
System.out.println(res);
}
下面说说@InsertProvider 直接贴上代码吧
public String save3(final Demo demo){
return new SQL(){{
INSERT_INTO("demo");
//多个写法.
INTO_COLUMNS("name","email");
INTO_VALUES("#{name}","#{email}");
//条件写法.
// if(demo.getName() != null){
// VALUES("name","#{name}");
// }
// if(demo.getEmail() != null){
// VALUES("email","#{email}");
// }
}}.toString();
}
@InsertProvider(type=DemoSqlProvider.class,method="save3")
@Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true)
public void save3(Demo demo);
@UpdateProvider
public String update2(final Demo demo){
return new SQL(){{
UPDATE("demo");
//条件写法.
if(demo.getName() != null){
SET("name=#{name}");
}
if(demo.getEmail() != null){
SET("email=#{email}");
}
WHERE("id=#{id}");
}}.toString();
}
@UpdateProvider(type=DemoSqlProvider.class,method="update2")
public int update2(Demo demo);
@DeleteProvider
public String delete2(){
return new SQL(){{
DELETE_FROM("demo");
WHERE("id=#{id}");
}}.toString();
}
@UpdateProvider(type=DemoSqlProvider.class,method="delete2")
public int delete2(int id);
sql_@SelectProvider及使用注意:
项目中使用了PageHelper 进行分页,与@@SelectProvider这个注解不能一起使用。。
nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'providerTakesParameterObject' in 'class org.apache.ibatis.builder.annotation.ProviderSqlSource'
出现以上问题,是由于我们使用的PageHelper版本导致的,升级版本即可。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.1</version>
</dependency>