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();
	}

 测试:

 

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

原文地址:https://www.cnblogs.com/Joke-Jay/p/8524722.html

时间: 2024-10-07 06:44:23

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

MyBatis注解及动态Sql

一.注解实现MyBatis配置 java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换Mapper配置文件. package com.lhf.dao; import com.lhf.entity.User; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert;

MyBatis 注解使用动态SQL

使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能直接使用动态的SQL,需要在其前后加入 <script> @Select("<script> " + "SELECT id, name, email,password " + "FROM user " + " <

Mybatis使用之动态SQL语句

Mybatis使用之动态SQL语句 一:简介 Mybatis动态SQL语句可帮助我们根据需要动态拼接SQL语句.主要在配置文件中使用<where> <if><choose><when><otherwise> <set> <trim><foreach>标签来实现. 二:具体使用方式 2.1 where 2.1.1 功能 语句的作用主要是简化SQL语句中where中的条件判断,where元素的作用是会在写入wher

mybatis注解开发,动态sql

在利用mybatis注解开始时,如果没有用到动态sql时,可以直接写 @Select("select * from order") List<XlSubOrder> getAllSubOrder(); 但是若果用到了动态sql就不能再像上面那样写了,应该写成 @Select("<script>" + "SELECT * FROM main_order left outer join sub_order on main_order.o

mybatis入门基础----动态SQL

原文:http://www.cnblogs.com/selene/p/4613035.html 阅读目录 一:动态SQL 二:SQL片段 三:foreach 回到顶部 一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态sql,对查询条件进行判断,如果输入参数不为空才进行查询拼接. 1.3.UserMapper.xml 1 <!-- 用户信息综合查询

mybatis注解开发

MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置.MyBatis提供的一些基本注解如下表所示. 注解 目标 相应的XML 描述 @CacheNamespace 类 <cache> 为给定的命名空间(比如类)配置缓存.属性: implemetation,eviction, flushInterval , size 和 readWrite . @CacheNamespaceRef 类 <cacheRef> 参照另外一个命名空间的缓存来使用. 属性:val

mybatis 详解------动态SQL

目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,otherwise) 语句 5.动态SQL:trim 语句 6.动态SQL: SQL 片段 7.动态SQL: foreach 语句 8.总结 前面几篇博客我们通过实例讲解了用mybatis对一张表进行的CRUD操作,但是我们发现写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不

mybatis入门-2 动态sql

MyBatis 的强大特性之一便是它的动态 SQL. 闲话少说,代码撸起来! IF 这基本上是where的必需品了 public interface BlogMapper { //这个地方需要注解 @Param 对这个参数进行命名,要不然if的时候获取不到参数名称 List<Blog> selectByTitle(@Param("title") String title); } <?xml version="1.0" encoding="

Mybatis框架之动态SQL书写方式小结

动态SQL简介 动态SQL是Mybatis框架中强大特性之一.在一些组合查询页面,需要根据用户输入的查询条件生成不同的查询SQL,这在JDBC或其他相似框架中需要在代码中拼写SQL,经常容易出错,在Mybatis框架中可以解决这种问题. 使用动态SQL元素与JSTL相似,它允许我们在XML中构建不同的SQL语句.常用元素为: 判断元素:if,choose 关键字元素:where,set,trim 循环元素:foreach if元素 if元素是简单的条件判断逻辑,满足指定条件时追加if元素内的SQ