文档章节

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

魔法王者安琪拉
 魔法王者安琪拉
发布于 2016/07/08 16:44
字数 843
阅读 2551
收藏 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

© 著作权归作者所有

共有 人打赏支持
魔法王者安琪拉
粉丝 80
博文 93
码字总数 31299
作品 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 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.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
基于 Spring jdbcTemplate 的 ORM--nimble-orm

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

pugwoo
2017/04/22
297
1
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
BeetlSql 2.2.1 发布,mybatis 功能 beetl 实现

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

闲大赋
2016/03/29
2.2K
15

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 种族不同,禁止交往

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《苏菲小姐》- 鱼果 《苏菲小姐》- 鱼果 手机党少年们想听歌,请使劲儿戳(这里) @貓夏:下大雨 正是睡觉的好时候 临睡前...

小小编辑
今天
211
6
Python 搭建简单服务器

Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下: 1.等待客户端的链接,服务器会收到一个http协议的请求数据报 2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文...

代码打碟手
今天
1
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
今天
0
0
qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部