通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类。1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并编写测试。(单元测试是一个好习惯,可以减少bug,避免后期修复的时间损耗)

1. 创建mapper.java

package com.blueStarWei.mappers;

import java.util.List;
import java.util.Map; import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider; import com.blueStarWei.entity.TPersonInfo; public interface PersonMapper { @SelectProvider(type=PersonDynamicSqlProvider.class, method="select")
List<TPersonInfo> findByNameAndAge(Map<String,Object> map); @InsertProvider(type=PersonDynamicSqlProvider.class, method="insert")
void insert(TPersonInfo person); @UpdateProvider(type=PersonDynamicSqlProvider.class, method="update")
void update(TPersonInfo person); }

2. 创建provider.java

package com.blueStarWei.mappers;

import java.util.Map;

import org.apache.ibatis.jdbc.SQL;

import com.blueStarWei.entity.TPersonInfo;

public class PersonDynamicSqlProvider {

    public String insert(TPersonInfo person){
return new SQL(){
{
INSERT_INTO("T_PERSON_INFO");
if(person.getName() != null){
VALUES("name", "#{name}"); //VALUES("name", person.getName());
//Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'Java' in 'field list'
}
if(person.getAge() != null){
VALUES("age", "#{age}");
}
}
}.toString();
} public String update(TPersonInfo person){
return new SQL(){
{
UPDATE("T_PERSON_INFO");
if(person.getName() != null){
SET("name=#{name}");
}
if(person.getAge() != null){
SET("age=#{age}");
}
WHERE("id=#{id}");
}
}.toString();
} public String select(Map<String,Object> map){
return new SQL(){
{
SELECT("*");
FROM("T_PERSON_INFO"); StringBuilder whereClause = new StringBuilder();
if(map.get("name") != null){
whereClause.append(" and name like '%").append(map.get("name")).append("%' ");
}
if(map.get("age") != null){
whereClause.append(" and age = ").append(map.get("age"));
}
if(!"".equals(whereClause.toString())){
WHERE(whereClause.toString().replaceFirst("and", ""));
}
}
}.toString();
}
}

3. UnitTest

    @Test
public void testInsertPerson(){
SqlSession session = SqlSessionFactoryUtil.openSession();
PersonMapper mapper = session.getMapper(PersonMapper.class);
TPersonInfo person = new TPersonInfo();
person.setName("Java");
person.setAge(18);
mapper.insert(person);
session.commit(); session.close();
} @Test
public void testUpdatePerson(){
SqlSession session = SqlSessionFactoryUtil.openSession();
PersonMapper mapper = session.getMapper(PersonMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("name", "Java");
map.put("age", 18);
List<TPersonInfo> persons = mapper.findByNameAndAge(map);
for (TPersonInfo person : persons) {
person.setName("Mybatis");
person.setAge(22);
mapper.update(person);
}
session.commit(); session.close();
}

Mybatis之注解实现动态sql的更多相关文章

  1. MyBatis基于注解的动态SQL——概览

  2. MyBatis学习总结_11_MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

  3. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  4. SSM框架之Mybatis(6)动态SQL

    Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...

  5. Spring mybatis源码篇章-动态SQL节点源码深入

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...

  6. MyBatis注解及动态Sql

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

  7. Spring Boot入门系列(十九)整合mybatis,使用注解实现动态Sql、参数传递等常用操作!

    前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类. 接下来介绍使用mybatis 常用注解以及如何传参数等数据库 ...

  8. MyBatis注解配置动态SQL

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

  9. mybatis 接口绑定 和 动态SQL

    一.MyBatis 接口绑定方案及多参数传递 1.作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取mapper.xml中编写的sql 2.后面 ...

随机推荐

  1. Confluence 6 数据库支持的驱动

    数据库 驱动已捆绑? JDBC 驱动 备注 更多信息 PostgreSQL 9.4-1202 JDBC 41 driver download 我们推荐你使用 JDBC 4 的驱动. 如果你希望使用更新 ...

  2. python之vscode配置开发调试环境

    在vscode中下载python插件,下载量最多的就是 打开launch.json,把以下代码粘贴进去即可 { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. ...

  3. Git- 命令及使用

    关于Git相关介绍这里就不介绍了,可转<Git- 简介>或者查看官网信息.这篇整理一下git相关的命令.   1) 远程仓库相关命令 克隆下载仓库:$ git clone git://gi ...

  4. jsp 监听器

    Servlet API提供了一系列的事件和事件监听接口. 上层的servlet/JSP应用能够通过调用这些API进行事件 驱动的开发.这里监听的所有事件都继承自 java.util.Event对象.监 ...

  5. Ubuntu 安装google 拼音

    一.安装fcitx apt-get install fcitx 二.安装google pinyin sudo apt install fcitx-googlepinyin 三. 安装 fcitx-co ...

  6. Spring Boot的Listener机制的用法和实现原理详解

    之前在介绍了在spring-boot启动过程中调用runner的原理,今天我们介绍另外一种可以实现相似功能的机制:spring-boot的Listener机制. 通过注册Listener,可以实现对于 ...

  7. jmeter 获取数据库表数据作为参数

    jmeter - 获取数据库表数据作为参数 在jmeter中使用数据库表数据首先需要设置数据库连接,然后在创建JDBC取样器 1.创建配置元件 JDBC Connection Configuratio ...

  8. C++ Primer 笔记——变量

    1. 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替. 2.使用列表初始化内置类型的变量时,如果初始值存在丢失信息的风险,则编译器将报错 ...

  9. spring cloud 路由网关zuul基本使用

    在微服务架构中,需要几个关键的组件,服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个组件可以组建一个简单的微服务架构.客户端的请求首先经过负载均衡(zuul.Ngnix),再 ...

  10. js 图片转换base64 base64转换为file对象

    function getImgToBase64(url,callback){//将图片转换为Base64 var canvas = document.createElement('canvas'), ...