mybatis注解开发-动态SQL
实体类以及表结构

在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的更多相关文章
- MyBatis注解及动态Sql
一.注解实现MyBatis配置 java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换M ...
- MyBatis注解配置动态SQL
MySQL创建表 DROP TABLE IF EXISTS `tb_employee`; CREATE TABLE `tb_employee` ( `id` int(11) NOT NULL AUTO ...
- MyBatis 注解使用动态SQL
使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能 ...
- SpringBoot使用Mybatis注解开发教程-分页-动态sql
代码示例可以参考个人GitHub项目kingboy-springboot-data 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframe ...
- Mybatis之注解实现动态sql
通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...
- Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化
知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...
- 【MyBatis】MyBatis 注解开发
MyBatis 注解开发 文章源码 环境搭建 Mybatis 也可以使用注解开发方式,这样就可以减少编写 Mapper 映射文件. 常用注解说明: @Insert 实现新增 @Update 实现更新 ...
- 【java框架】MyBatis(7)--MyBatis注解开发
1.MyBatis注解开发 1.1.Lombok的基本使用 Lombok是SpringBoot2.1.X版本与IDEA官方支持的一个插件,它是为简化POJO类中繁杂重复代码:geter/setter/ ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
随机推荐
- [LeetCode] Unique Binary Search Tree
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- [转载]目标检测的图像特征提取之(一)HOG特征(zouxy09@qq.com)
1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的 ...
- JSP-Runood:JSP 客户端请求
ylbtech-JSP-Runood:JSP 客户端请求 1.返回顶部 1. JSP 客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息 ...
- bzoj1877 晨跑(费用流)
1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2138 Solved: 1145 Description Elax ...
- bzoj2730矿场搭建(Tarjan割点)
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1771 Solved: 835[Submit][Statu ...
- 【洛谷1654/BZOJ4318】OSU!(期望DP)
题目: 洛谷1654 分析: 本人数学菜得要命,这题看了一整天才看明白-- 先说说什么是"期望".不太严谨地说,若离散型随机变量(可以看作"事件")\(X\)取 ...
- ACM_圆的面积
圆的面积 Time Limit: 2000/1000ms (Java/Others) Problem Description: AB是圆O的一条直径,CD.EF是两条垂直于AB的弦,并且以CD为直径的 ...
- 协程概念,原理及实现(c++和node.js实现)
协程 什么是协程 wikipedia 的定义: 协程是一个无优先级的子程序调度组件,允许子程序在特点的地方挂起恢复. 线程包含于进程,协程包含于线程.只要内存足够,一个线程中可以有任意多个协程,但某一 ...
- java学习笔记_序列化
如果父类没有实现Serializable接口,子类实现了Serializable接口,那么子类是可以序列化的. 但是如果想要反序列化,那么就需要父类支持默认构造函数. 因为在反序列化的过程中不会调用子 ...
- Android 基础知识图谱
四大组件 Activity Service BroadcastReceiver ContentProvider Application 常用组件 Fragment RecyclerView WebVi ...