通过注解实现动态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. 【Linux】安装多个JDK并切换

    一.JDK安装1.将安装包jdk-8u111-linux-x64.tar.gz拷贝到安装目录(如/usr/java)下.2.添加可执行权限chmod +x jdk-8u111-linux-x64.ta ...

  2. 分布式Dubbo快速入门

    目录 Dubbo入门 背景 zookeeper安装 发布Dubbo服务 Dubbo Admin管理 消费Dubbo服务 抽取与依赖版本管理 Dubbo入门 Editor:SimpleWu Dubbo是 ...

  3. ES6笔记

    /** * Created by Administrator on 2017/4/13. */ /*---------------------Es6编码规范---------------------* ...

  4. CF919F

    题意: Alice和Bob玩游戏,每人各有8张牌,牌的大小在0~4之间 每次操作,先手可以选择自己一张牌和对方一张牌求和后%5,将新的牌替代自己拿出的那张牌,以此类推,直到有一个人手中的牌全部是0,则 ...

  5. MAKEWORD 宏(macro)

    先看看Microsoft给出的关于MAKEWORD的参考: 从Microsoft给出的参考可以得知,宏MAKEWORD的作用是用于创建一个由bHigh和bLow组成的WORD类型的值. 其中bLow是 ...

  6. Loadrunner11.0 录制手机App脚本的方法一

    使用Loadrunner录制手机终端App脚本 1. 说明 目前手机APP上的功能日益丰富,对手机应用功能的性能测试需求也越来越多.公司比较抠门没有花钱买Loadrunner,可怜我们工作中一直用的破 ...

  7. hive表中字段显示为NULL时,HDFS文件中存储为\N

    hive数据落地到hdfs,null会默认用'\N'存储 解决方式1:利用命令(这个我没起效果) alter table adl_cici_test_fdt set serdeproperties(' ...

  8. mybatis 遍历map;

    mybatis 遍历map; 参考http://blog.csdn.net/hj7jay/article/details/78652050 ps: ${m[key]}这是显示 打印的key读value ...

  9. WCF 配置App.Config

    <system.serviceModel> <bindings> <basicHttpBinding> <binding name="/> & ...

  10. Git基础(三) 跟踪文件

    检查当前文件状态 git status 跟踪新文件 git add README 状态简览 git status -s 或 git status --short 忽略文件 创建一个名为.gitigno ...