实体类以及表结构

在mybatis-config.xml中注册mapper接口

--------------------------

动态查询@SelectProvider

EmployeeMapper接口

package Intefaceproxy.Dyno;

import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.SelectProvider;
import model.Employee; public interface EmployeeMapper {
//动态查询 type:指定一个类 method:使用这个类中的selectWhitParamSql方法返回的sql字符串 作为查询的语句
@SelectProvider(type=Intefaceproxy.Dyno.EmployeeDynaSqlProvider.class,method="selectWhitParamSql")
List<Employee> selectWithParam(Map<String,Object> param);
}

返回sql语句的类

package Intefaceproxy.Dyno;

import java.util.Map;

import org.apache.ibatis.jdbc.SQL;

public class EmployeeDynaSqlProvider {
//方法中的关键字是区分大小写的 SQL SELECT WHERE
//该方法会根据传递过来的map中的参数内容 动态构建sql语句
public String selectWhitParamSql(Map<String, Object> param) {
return new SQL() {
{
SELECT("*");
FROM("tb_employee");
if (param.get("id")!=null) {
WHERE("id=#{id}");
}
if(param.get("loginname")!=null) {
WHERE("loginname=#{loginname}");
}
if(param.get("password")!=null) {
WHERE("password=#{password}");
}
if(param.get("name")!=null) {
WHERE("name=#{name}");
}
if(param.get("sex")!=null) {
WHERE("sex=#{sex}");
}
if(param.get("age")!=null) {
WHERE("age=#{age}");
}
if(param.get("phone")!=null) {
WHERE("phone=#{phone}");
}
if(param.get("sal")!=null) {
WHERE("sal=#{sal}");
}
if(param.get("state")!=null) {
WHERE("state=#{state}");
}
} }.toString();
}
}

测试:

当然也可以传递employee对象

接口:

	//传递employee对象
@SelectProvider(type=Intefaceproxy.Dyno.EmployeeDynaSqlProvider.class,method="selectWhitEmployeeSql")
List<Employee>selectWithEmployee(Employee employee);

返回sql的类

//selectWhitEmployeeSql
public String selectWhitEmployeeSql(Employee employee) {
return new SQL() {
{
SELECT("*");
FROM("tb_employee");
if (employee.getId()!=null) {
WHERE("id=#{id}");
}
if(employee.getLoginname()!=null) {
WHERE("loginname=#{loginname}");
}
if(employee.getPassword()!=null) {
WHERE("password=#{password}");
}
if(employee.getName()!=null) {
WHERE("name=#{name}");
}
if(employee.getSex()!=null) {
WHERE("sex=#{sex}");
}
}
}.toString();
}

测试:

------------------------------

动态插入@InsertProvider

//动态插入
@InsertProvider(type=Intefaceproxy.Dyno.EmployeeDynaSqlProvider.class,method="insertEmployeeSql")
@Options(useGeneratedKeys=true,keyProperty="id")
int insertEmployee(Employee employee);

  

//insertEmployeeSql
public String insertEmployeeSql(Employee employee) {
return new SQL() {
{
INSERT_INTO("tb_employee");
if(employee.getLoginname()!=null) {
VALUES("loginname","#{loginname}");
}
if(employee.getPassword()!=null) {
VALUES("password", "#{password}");
}
if(employee.getName()!=null) {
VALUES("name", "#{name}");
}
if(employee.getSex()!=null) {
VALUES("sex", "#{sex}");
}
if(employee.getAge()!=null) {
VALUES("age", "#{age}");
}
if(employee.getPhone()!=null) {
VALUES("phone", "#{phone}");
}
if(employee.getSal()!=null) {
VALUES("sal", "#{sal}");
}
if(employee.getState()!=null) {
VALUES("state", "#{state}");
}
}
}.toString();
}

测试:

-------------------------

@UpdateProvider

//动态更新
@UpdateProvider(type=Intefaceproxy.Dyno.EmployeeDynaSqlProvider.class,method="updateEmployeeSql")
void updateEmployee(Employee employee);
//updateEmployeeSql
public String updateEmployeeSql(Employee employee) {
return new SQL() {
{
UPDATE("tb_employee");
if(employee.getLoginname()!=null) {
SET("loginname=#{loginname}");
}
if(employee.getPassword()!=null) {
SET("password=#{password}");
}
if(employee.getName()!=null) {
SET("name=#{name}");
}
if(employee.getSex()!=null) {
SET("sex=#{sex}");
}
if(employee.getAge()!=null) {
SET("age=#{age}");
}
if(employee.getPhone()!=null) {
SET("phone=#{phone}");
}
if(employee.getSal()!=null) {
SET("sal=#{sal}");
}
if(employee.getState()!=null) {
SET("state=#{state}");
}
WHERE("id=#{id}");
}
}.toString();
}

测试:

----------------------------

@DeleteProvider

	//动态删除
@DeleteProvider(type=Intefaceproxy.Dyno.EmployeeDynaSqlProvider.class,method="deleteEmployeeSql")
void deleteEmployee(Employee employee);

 

	//deleteEmployeeSql
public String deleteEmployeeSql(Employee employee) {
return new SQL() {
{
DELETE_FROM("tb_employee");
if(employee.getLoginname()!=null) {
WHERE("loginname=#{loginname}");
}
if(employee.getPassword()!=null) {
WHERE("password=#{password}");
}
if(employee.getName()!=null) {
WHERE("name=#{name}");
}
}
}.toString();
}

 测试:

 

----------------------------------

mybatis注解开发-动态SQL的更多相关文章

  1. MyBatis注解及动态Sql

    一.注解实现MyBatis配置 java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换M ...

  2. MyBatis注解配置动态SQL

    MySQL创建表 DROP TABLE IF EXISTS `tb_employee`; CREATE TABLE `tb_employee` ( `id` int(11) NOT NULL AUTO ...

  3. MyBatis 注解使用动态SQL

    使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能 ...

  4. SpringBoot使用Mybatis注解开发教程-分页-动态sql

    代码示例可以参考个人GitHub项目kingboy-springboot-data 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframe ...

  5. Mybatis之注解实现动态sql

    通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...

  6. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

  7. 【MyBatis】MyBatis 注解开发

    MyBatis 注解开发 文章源码 环境搭建 Mybatis 也可以使用注解开发方式,这样就可以减少编写 Mapper 映射文件. 常用注解说明: @Insert 实现新增 @Update 实现更新 ...

  8. 【java框架】MyBatis(7)--MyBatis注解开发

    1.MyBatis注解开发 1.1.Lombok的基本使用 Lombok是SpringBoot2.1.X版本与IDEA官方支持的一个插件,它是为简化POJO类中繁杂重复代码:geter/setter/ ...

  9. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

随机推荐

  1. Sort List 典型链表

    https://leetcode.com/problems/sort-list/ Sort a linked list in O(n log n) time using constant space ...

  2. java线程系列---Runnable和Thread的区别 (转载)

    转自:http://blog.csdn.net/wwww1988600/article/details/7309070 在java中可有两种方式实现多线程,一种是继承 Thread类,一种是实现Run ...

  3. flux,redux,vuex状态集管理工具之间的区别

    一:redux和flux的区别 1)redux是flux中的一个实现 2))在redux中我们只能定义一个store,在flux中我们可以定义多个 3)在redux中,store和dispatch都放 ...

  4. codevs2503失恋28天......(背包dp)

    503 失恋28天-缝补礼物  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold   题目描述 Description 话说上回他给女孩送了n件礼物,由于是廉价的所以 ...

  5. hdu2029

    http://acm.hdu.edu.cn/showproblem.php?pid=2029 #include<stdio.h> #include<string.h> #inc ...

  6. flask中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...

  7. nginx深入

    1.编译安装配置完成 /opt/nginx11/html/index.html 这是网页的首页文件 2. nginx.conf主配置文件学习 ############################# ...

  8. Spring AOP(aspect oriented programming) 转载

    1.面向切面的基本原理 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 01.什么是面向切面编程 横切关注点:影响应用多处的功能 ...

  9. ubuntu 安装redis以及phpredis

    一.安装redis 1. 去百度搜索 redis,然后去靠谱的地方下载最新的redisxxx.tar.gz 2. 解压后,sudo make 3. sudo make install 4. //安装完 ...

  10. 去除IOS苹果手机自带按钮样式的问题~

    input[type="button"], input[type="submit"], input[type="reset"] { -web ...