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简单的介绍了输入映射和输 ...
随机推荐
- js如何获取某id的子标签
思路:根据id获取父对象,然后使用childNodes获取所有子对象数组,关键代码: document.getElementById(div_id).childNodes; // 子对象数组 实例 ...
- 【SCOI 2011】 糖果
[题目链接] 点击打开链接 [算法] 当x = 1时,连边(a,b,0)和(b,a,0) 当x = 2时,连边(a,b,1) 当x = 3时,连边(b,a,0) 当x = 4时,连边(b,a,1) 当 ...
- B1299 [LLH邀请赛]巧克力棒 博弈论
这个题一看就是nim游戏的变形.每次先手取出巧克力就是新建一个nim,但假如先手取一个为0的而且无论后手怎么取剩下的都无法为零就行了.然后用dfs跑. 题干: Description TBL和X用巧克 ...
- Java Swing Action 动作
Swing包提供了一种非常实用的机制来封装命令,并将它们连接到多个事件源,这就是Action接口.一个动作是一个封装下列内容的对象: × 命令的说明(一个文本字符串和一个可选图标): × 执行命令所需 ...
- MSP430:中断简介
(5).中断应用程序举例(外部中断): void interrupt_initial() { P1DIR&=~BIT7; //P1.7为输入 P1IE|=0x80; //P ...
- 自定义Git(转载)
转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137621280731 ...
- Linux 命令多到记不住?这个开源项目帮你一网打尽!
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 最近发现了一个 ...
- 关于二分查找 使用 lower_bound
在寻找单调递增最长自序列 , 的时候能不能确认出来哪个是单调递增最长自序列 ? 我的想法是 if(location>=num) dp[location]=b; 这样的 , 基于http:// ...
- 51nod1565 FFT
思路: 显然拆位FFT 不解释 //By SiriusRen #include <bits/stdc++.h> using namespace std; ; ); ,L,S,T,k,sa[ ...
- PKUSC2017 游记 密码:blog密码
退役之前,写点破事乐呵乐呵 省选滚大粗 报了PKU和THU的SC 果然THU直接审核不通过... 于是就来到了PKU 滚粗狗就又续命几天. Day1 上午考数学 喜闻乐见啥都不会 出来一对题 ...