MyBatis注解-动态SQL 一个 SqlProvider的demo
Provider动态语言注解
MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建立动态语言和让MyBatis执行这些语言。
先贴上代码:这个实现了一个对teacher实体类进行动态的多条件查询
1、新建一个类 TeacherSqlProvider 这个最好这么命名比较符合规范吧
1 public class TeacherSqlProvider {
2
3
4 public String queryStudentByTeacher(Map<String,Object> map){
5 BEGIN();
6 SELECT("sname,s.sex,tname");
7 FROM("student s");
8 INNER_JOIN("teacher t on s.tid=t.tid");
9 if(map.get("sname")!=null)
10 WHERE("sname=#{sname}");
11 if(map.get("sex")!=null){
12 WHERE("t.sex=#{sex}");
13 }
14 return SQL();
15 }
16
17 }
2、在TeacherDao加入查询方法:
1 @SelectProvider(type=TeacherSqlProvider.class,method="queryStudentByTeacher")
2 public List<Map<String,Object>> queryStudentByTeacher(Map<String,Object> map);
这里注意了 我们用map来传递参数(map的key-value格式与json数据格式无缝集成),返回的类型也必须是map
3、在JUnit中测试
1 @Test
2 public void testMap(){
3 Map<String,Object> map = new HashMap<String,Object>();
4 map.put("sname", "小明");
5 map.put("sex", "男");
6 List<Map<String,Object>> res = session.getMapper(StudentDao.class).queryScoreByStudent(map);
7 System.out.println(res);
8 }
下面说说@InsertProvider 直接贴上代码吧
1 public String save3(final Demo demo){
2 return new SQL(){{
3 INSERT_INTO("demo");
4 //多个写法.
5 INTO_COLUMNS("name","email");
6 INTO_VALUES("#{name}","#{email}");
7
8 //条件写法.
9 // if(demo.getName() != null){
10 // VALUES("name","#{name}");
11 // }
12 // if(demo.getEmail() != null){
13 // VALUES("email","#{email}");
14 // }
15
16 }}.toString();
17 }
1 @InsertProvider(type=DemoSqlProvider.class,method="save3")
2 @Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true)
3 public void save3(Demo demo);
@UpdateProvider
1 public String update2(final Demo demo){
2 return new SQL(){{
3 UPDATE("demo");
4
5 //条件写法.
6 if(demo.getName() != null){
7 SET("name=#{name}");
8 }
9 if(demo.getEmail() != null){
10 SET("email=#{email}");
11 }
12 WHERE("id=#{id}");
13 }}.toString();
14 }
1 @UpdateProvider(type=DemoSqlProvider.class,method="update2")
2 public int update2(Demo demo);
@DeleteProvider
1 public String delete2(){
2 return new SQL(){{
3 DELETE_FROM("demo");
4 WHERE("id=#{id}");
5 }}.toString();
6 }
1 @UpdateProvider(type=DemoSqlProvider.class,method="delete2")
2 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版本导致的,升级版本即可。
1 <dependency>
2 <groupId>com.github.pagehelper</groupId>
3 <artifactId>pagehelper</artifactId>
4 <version>4.2.1</version>
5 </dependency>
MyBatis注解-动态SQL 一个 SqlProvider的demo的更多相关文章
- mybatis注解动态sql
@Insert("INSERT INTO user (name, age, gender, experience) VALUES (<a href="http://www.o ...
- 4.Spring注解+SpringMVC注解+MyBatis注解(动态sql)
1.创建如图所示项目结构 2.在项目的
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- Java-MyBatis:MyBatis 3 动态 SQL
ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...
- 一分钟带你了解下MyBatis的动态SQL!
MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- mybatis 使用动态SQL
RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- 使用Mybatis实现动态SQL(一)
使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面: *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...
随机推荐
- HQL知识点一
Hive创表语法 create [external] table [if not exists] [db_name.]table_name (col1_name data_type,col2_name ...
- 上传文件代码报错,java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
2018-09-11 11:11:08.235 ERROR 14352 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : ...
- jmeter 上传附件脚本报Non HTTP response code: java.io.FileNotFoundException
如果上传附件报如下错误,就需要把附件放到和脚本同一路径下就解决了
- 百战程序员——EL、JSTL
1.EL表达式可以操作作用域中的属性,也可以操作普通的局部变量.对吗? 不对 El表达式一般支持作用域(application.session.request.pagecontext)中的属性.EL变 ...
- Java第五周总结
Java抽象类与接口的区别 很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看 ...
- delphi的流操作的语法
Delphi在这两方面都做的相当出色.在Delphi的早期版本Turbo Pascal 中就曾有流(Stream).群(Collection)和资源(Resource)等专门用于对象式数据管理的类.在 ...
- 【转载】 spring事物配置,声明式事务管理和基于@Transactional注解的使用
https://blog.csdn.net/bao19901210/article/details/41724355
- Eclipse导入已有的项目后项目报错的解决办法
第一种:jsp报错 选择windows-->preference-->列表找到Validation-->点击Disable All ->> Apply ->> ...
- 【步步为营 Entity Framework+Reporting service开发】-(2) Code Fir
也许有人问,为什么要用EF创建爱你数据表,code first好处是什么? 使用EF创建数据库/表,只需要设计简单的C#类,再表内容变化的时候他会自动更新数据库结构,并且保留原有数据. EF很强大,支 ...
- c/c++的常用函数和STL使用
一个超好用的c++网站:http://www.cplusplus.com/reference/string/string/erase/ 一.函数头中包含的函数 1.qsort函数对数组.结构体等进行排 ...