文档章节

基于MyBatis注解扩展,实现无需配置就可拥有增删改

魔法王者安琪拉
 魔法王者安琪拉
发布于 2016/07/08 16:44
字数 843
阅读 2684
收藏 104

一、使用篇

      如果项目本身基于SpringMVC+Mybatis构建,不需添加任何配置Mapper类只需继承

BaseMapper,即拥有增删改方法操作,无需任何配置文件

  1.    
    package com.springmvc.mapper;
    
    import org.springframework.stereotype.Repository;
    
    import com.nmtx.mybatis.ext.mapper.BaseMapper;
    import com.springmvc.model.User;
    @Repository
    public interface UserMapper extends BaseMapper<User>{
    
    }
    

     

  2.  

    package com.springmvc.service.impl;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import com.springmvc.mapper.UserMapper;
    import com.springmvc.model.User;
    import com.springmvc.service.UserService;
    
    
    @Service
    public class UserServiceImpl implements UserService{
        
        @Resource
        private UserMapper userMapper;
        
        public int insertUser(User user) {
            return userMapper.insert(user);
        }
    
        @Override
        public int updateUser(User user) {
            return userMapper.update(user);
        }
    
        @Override
        public int deleteUser(User user) {
            return userMapper.delete(user);
        }
    
        @Override
        public User findUser(User user) {
            return userMapper.findFirst(user);
        }
    }

     

  3.  

    user.xml无需任何配置<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.springmvc.mapper.UserMapper">
             
    </mapper>

     

二、扩展原理基于Mybatis中 @InsertProvider,@DeleteProvider,@UpdateProvider,@SelectProvider注解,具体实现代码如下

  1.  

    package com.nmtx.mybatis.ext.mapper;
    
    import org.apache.ibatis.annotations.DeleteProvider;
    import org.apache.ibatis.annotations.InsertProvider;
    import org.apache.ibatis.annotations.Options;
    import org.apache.ibatis.annotations.SelectProvider;
    import org.apache.ibatis.annotations.UpdateProvider;
    
    import com.nmtx.mybatis.ext.common.SqlProvider;
    
    public interface BaseMapper<T> {
    
        @InsertProvider(type = SqlProvider.class, method = "insert")
        @Options(useGeneratedKeys=true)
        public int insert(T bean);
    
        @DeleteProvider(type = SqlProvider.class, method = "delete")
        public int delete(T bean);
    
        @UpdateProvider(type = SqlProvider.class, method = "update")
        public int update(T bean);
    
        @SelectProvider(type = SqlProvider.class, method = "findFirst")
        public T findFirst(T bean);
    }


     

  2.  

    package com.nmtx.mybatis.ext.common;
    
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.lang3.ArrayUtils;
    import org.springframework.util.StringUtils;
    
    import com.nmtx.mybatis.ext.common.table.TableFormat;
    import com.nmtx.mybatis.ext.common.table.annotation.Column;
    import com.nmtx.mybatis.ext.common.table.annotation.Table;
    import com.nmtx.mybatis.ext.common.table.impl.HumpToUnderLineFormat;
    
    public class SqlProvider {
        
        
        private TableFormat tableFormat = new HumpToUnderLineFormat();
    
        public String insert(Object bean) {
            Class<?> beanClass = bean.getClass();
            String tableName = getTableName(beanClass);
            Field[] fields = getFields(beanClass);
            StringBuilder insertSql = new StringBuilder();
            List<String> insertParas = new ArrayList<String>();
            List<String> insertParaNames = new ArrayList<String>();
            insertSql.append("INSERT INTO ").append(tableName).append("(");
            try {
                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    Column column = field.getAnnotation(Column.class);
                    String columnName = "";
                    if (column != null) {
                        if (!column.required())
                            continue;
                        columnName = column.value();
                    }
                    if (StringUtils.isEmpty(columnName)) {
                        columnName = tableFormat.getColumnName(field.getName());
                    }
                    field.setAccessible(true);
                    Object object = field.get(bean);
                    if (object != null) {
                        insertParaNames.add(columnName);
                        insertParas.add("#{" + field.getName() + "}");
                    }
                }
            } catch (Exception e) {
                new RuntimeException("get insert sql is exceptoin:" + e);
            }
            for (int i = 0; i < insertParaNames.size(); i++) {
                insertSql.append(insertParaNames.get(i));
                if (i != insertParaNames.size() - 1)
                    insertSql.append(",");
            }
            insertSql.append(")").append(" VALUES(");
            for (int i = 0; i < insertParas.size(); i++) {
                insertSql.append(insertParas.get(i));
                if (i != insertParas.size() - 1)
                    insertSql.append(",");
            }
            insertSql.append(")");
            return insertSql.toString();
        }
    
        public String update(Object bean) {
            Class<?> beanClass = bean.getClass();
            String tableName = getTableName(beanClass);
            Field[] fields = getFields(beanClass);
            StringBuilder updateSql = new StringBuilder();
            updateSql.append(" update ").append(tableName).append(" set ");
            try {
                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    Column column = field.getAnnotation(Column.class);
                    String columnName = "";
                    if (column != null) {
                        if (!column.required())
                            continue;
                        columnName = column.value();
                    }
                    if (StringUtils.isEmpty(columnName)) {
                        columnName = tableFormat.getColumnName(field.getName());
                    }
                    field.setAccessible(true);
                    Object beanValue = field.get(bean);
                    if (beanValue != null) {
                        updateSql.append(columnName).append("=#{").append(field.getName()).append("}");
                        if (i != fields.length - 1) {
                            updateSql.append(",");
                        }
                    }
                }
            } catch (Exception e) {
                new RuntimeException("get update sql is exceptoin:" + e);
            }
            updateSql.append(" where ").append(tableFormat.getId()+" =#{id}");
            return updateSql.toString();
        }
    
        public String delete(Object bean) {
            Class<?> beanClass = bean.getClass();
            String tableName = getTableName(beanClass);
            Field[] fields = getFields(beanClass);
            StringBuilder deleteSql = new StringBuilder();
            deleteSql.append(" delete from ").append(tableName).append(" where  ");
            try {
                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    Column column = field.getAnnotation(Column.class);
                    String columnName = "";
                    if (column != null) {
                        if (!column.required())
                            continue;
                        columnName = column.value();
                    }
                    if (StringUtils.isEmpty(columnName)) {
                        columnName = tableFormat.getColumnName(field.getName());
                    }
                    field.setAccessible(true);
                    Object beanValue = field.get(bean);
                    if (beanValue != null) {
                        deleteSql.append(columnName).append("=#{").append(field.getName()).append("}");
                        if (i != fields.length - 1) {
                            deleteSql.append(" and ");
                        }
                    }
                }
            } catch (Exception e) {
                new RuntimeException("get delete sql is exceptoin:" + e);
            }
            return deleteSql.toString();
        }
    
        public String findFirst(Object bean) {
            Class<?> beanClass = bean.getClass();
            String tableName = getTableName(beanClass);
            Field[] fields = getFields(beanClass);
            StringBuilder selectSql = new StringBuilder();
            List<String> selectParaNames = new ArrayList<String>();
            List<String> selectParas = new ArrayList<String>();
            selectSql.append("select ");
            try {
                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    Column column = field.getAnnotation(Column.class);
                    String columnName = "";
                    if (column != null) {
                        if (!column.required())
                            continue;
                        columnName = column.value();
                    }
                    if (StringUtils.isEmpty(columnName)) {
                        columnName = tableFormat.getColumnName(field.getName());
                    }
                    field.setAccessible(true);
                    Object object = field.get(bean);
                    selectSql.append(field.getName());
                    if (object != null) {
                        selectParaNames.add(columnName);
                        selectParas.add("#{" + field.getName() + "}");
                    }
                    if (i != fields.length - 1)
                        selectSql.append(",");
                }
            } catch (Exception e) {
                new RuntimeException("get select sql is exceptoin:" + e);
            }
            selectSql.append(" from ").append(tableName).append(" where ");
            for (int i = 0; i < selectParaNames.size(); i++) {
                selectSql.append(selectParaNames.get(i)).append("=").append(selectParas.get(i));
                if (i != selectParaNames.size() - 1)
                    selectSql.append(" and ");
            }
            return selectSql.toString();
        }
    
        private String getTableName(Class<?> beanClass) {
            String tableName = "";
            Table table = beanClass.getAnnotation(Table.class);
            if (table != null) {
                tableName = table.value();
            } else {
                tableName = tableFormat.getTableName(beanClass.getSimpleName());
            }
            return tableName;
        }
    
        private Field[] getFields(Class<?> beanClass) {
            Field[] beanFields = beanClass.getDeclaredFields();
            Class<?> beanSuperClass = beanClass.getSuperclass();
            Field[] beanSuperFields = beanSuperClass.getDeclaredFields();
            return ArrayUtils.addAll(beanFields, beanSuperFields);
        }
    }

     

   三、源码地址 

  http://git.oschina.net/lianghao2016/mybatis-ext

© 著作权归作者所有

共有 人打赏支持
魔法王者安琪拉
粉丝 79
博文 96
码字总数 32078
作品 0
深圳
程序员
私信 提问
加载中

评论(17)

魔法王者安琪拉
魔法王者安琪拉

引用来自“Kevin_Zhan”的评论

地址失效了

引用来自“小兵成长记”的评论

项目不完整,占不公了,你看这篇博客就可以了,有什么问题,可以@我

引用来自“Kevin_Zhan”的评论

@小兵成长记 对了,那些import com.nmtx.mybatis.ext.common.table.TableFormat;
import com.nmtx.mybatis.ext.common.table.annotation.Column;
import com.nmtx.mybatis.ext.common.table.annotation.Table;
import com.nmtx.mybatis.ext.common.table.impl.HumpToUnderLineFormat; 都是你自己自定义的吧?怎么在博客里找不到相关的代码呢,大概的流程和思路我看了,想法的确挺好的
嗯,是的,这个根据你自己的需求来,就是表名和你的bean对应转换,字段名和属性名之间的转换,你自己实现就好,我的个不一定适和你
Kevin_Zhan
Kevin_Zhan

引用来自“Kevin_Zhan”的评论

地址失效了

引用来自“小兵成长记”的评论

项目不完整,占不公了,你看这篇博客就可以了,有什么问题,可以@我
@小兵成长记 对了,那些import com.nmtx.mybatis.ext.common.table.TableFormat;
import com.nmtx.mybatis.ext.common.table.annotation.Column;
import com.nmtx.mybatis.ext.common.table.annotation.Table;
import com.nmtx.mybatis.ext.common.table.impl.HumpToUnderLineFormat; 都是你自己自定义的吧?怎么在博客里找不到相关的代码呢,大概的流程和思路我看了,想法的确挺好的
魔法王者安琪拉
魔法王者安琪拉

引用来自“Kevin_Zhan”的评论

地址失效了
项目不完整,占不公了,你看这篇博客就可以了,有什么问题,可以@我
Kevin_Zhan
Kevin_Zhan
地址失效了
魔法王者安琪拉
魔法王者安琪拉

引用来自“akeng”的评论

引用来自“akeng”的评论

不错,挺给力的

引用来自“小兵成长记”的评论

应该还有更牛的功能,待发现,一起多看看

引用来自“akeng”的评论

不支持,类属性里面有其他类这种情况吧

引用来自“小兵成长记”的评论

你说的是级联查询吧,肯定支持,需要配置一个resultMap

引用来自“akeng”的评论

额,我只是说你的这个代码

引用来自“小兵成长记”的评论

这个没写全,只在自己项目中用过,级联查询不通用,做不了扩展
哦,用了你的这个在我的小项目里,还挺好用的,省了我的增删改查方法

还有分页也可以自己实现
akeng
akeng

引用来自“akeng”的评论

不错,挺给力的

引用来自“小兵成长记”的评论

应该还有更牛的功能,待发现,一起多看看

引用来自“akeng”的评论

不支持,类属性里面有其他类这种情况吧

引用来自“小兵成长记”的评论

你说的是级联查询吧,肯定支持,需要配置一个resultMap

引用来自“akeng”的评论

额,我只是说你的这个代码

引用来自“小兵成长记”的评论

这个没写全,只在自己项目中用过,级联查询不通用,做不了扩展
哦,用了你的这个在我的小项目里,还挺好用的,省了我的增删改查方法
魔法王者安琪拉
魔法王者安琪拉

引用来自“akeng”的评论

不错,挺给力的

引用来自“小兵成长记”的评论

应该还有更牛的功能,待发现,一起多看看

引用来自“akeng”的评论

不支持,类属性里面有其他类这种情况吧

引用来自“小兵成长记”的评论

你说的是级联查询吧,肯定支持,需要配置一个resultMap

引用来自“akeng”的评论

额,我只是说你的这个代码
这个没写全,只在自己项目中用过,级联查询不通用,做不了扩展
akeng
akeng

引用来自“akeng”的评论

不错,挺给力的

引用来自“小兵成长记”的评论

应该还有更牛的功能,待发现,一起多看看

引用来自“akeng”的评论

不支持,类属性里面有其他类这种情况吧

引用来自“小兵成长记”的评论

你说的是级联查询吧,肯定支持,需要配置一个resultMap
额,我只是说你的这个代码
魔法王者安琪拉
魔法王者安琪拉

引用来自“akeng”的评论

不错,挺给力的

引用来自“小兵成长记”的评论

应该还有更牛的功能,待发现,一起多看看

引用来自“akeng”的评论

不支持,类属性里面有其他类这种情况吧
你说的是级联查询吧,肯定支持,需要配置一个resultMap
akeng
akeng

引用来自“akeng”的评论

不错,挺给力的

引用来自“小兵成长记”的评论

应该还有更牛的功能,待发现,一起多看看
不支持,类属性里面有其他类这种情况吧
BeetlSql 2.7.0 发布,mybatis 功能 beetl 实现

本次发布增强了ORM查询,提供了ORMQuery注解来配置ORM查询 @OrmQuery({@OrmCondition(target=Department.class,attr="departmentId",targetAttr="id",type=OrmQuery.Type.ONE),@OrmCondition......

闲大赋
2016/11/28
1K
3
beetlsql 1.2.0 发布,mybatis 的 beetl 实现

beetlsql 1.2.0 发布,此版本更新内容如下: 新增 #17 sql文件的md格式引入注释符号。 selectUser * 注释一* 注释二 select from user where ... #12代码生成,直接根据表名生成pojo类,并可...

闲大赋
2015/10/30
1K
29
beetlSql 2.6.6 发布,mybatis 功能 beetl 实现

beetlSql 2.6.6 发布了,更新如下: #178 增加 genBuiltInSqlToConsole,打印class对应的增删改查sql #176 内置sql 不需要条件1=1 完善文档,增加了spring boot集成说明 com.ibeetl beetlsq...

闲大赋
2016/10/27
616
5
基于 Spring jdbcTemplate 的 ORM--nimble-orm

这是一个基于 Spring JdbcTemplate 的小工具,帮助开发者简单地完成 Mysql 的增删改查。 使用 nimble-orm 的优势 为互联网频繁的表变动而生。 表名、字段名,仅在代码中出现一次。修改表名只...

pugwoo
2017/04/22
297
1
BeetlSql 2.2.1 发布,mybatis 功能 beetl 实现

BeetlSQL 2.2.1发布了,BeetSQL 是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 #90 在注解控...

闲大赋
2016/03/29
2.2K
15

没有更多内容

加载失败,请刷新页面

加载更多

Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
1
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
1
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
4
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
3
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部