文档章节

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

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

© 著作权归作者所有

共有 人打赏支持
魔法王者安琪拉
粉丝 78
博文 98
码字总数 32765
作品 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.10.38 发布,Java Dao 工具

BeetlSQL 2.10.38 发布,改进内容包括: #IMVHW execute查询风格支持翻页查询 pageQuery #IN5HI SpringBoot Starter 多数据源配置增强,允许为多数据源指定默认配置,简化配置 #IN6VN Query...

闲大赋
2018/09/29
1K
2
基于 Spring jdbcTemplate 的 ORM--nimble-orm

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

pugwoo
2017/04/22
297
1
beetlsql 1.2.0 发布,mybatis 的 beetl 实现

beetlsql 1.2.0 发布,此版本更新内容如下: 新增 #17 sql文件的md格式引入注释符号。 #12代码生成,直接根据表名生成pojo类,并可以配置基类,包名,是否使用BigDecimal等 #7 直接执行jdbc ...

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

本次发布增强了ORM查询,提供了ORMQuery注解来配置ORM查询 随后的查询都可以通过tail属性进一步获取关系映射,注解ORMQuery可以和sql的ORM关系函数联合使用,从而提供灵活简单的ORM查询 同时...

闲大赋
2016/11/28
1K
3
beetlSql 2.6.6 发布,mybatis 功能 beetl 实现

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

闲大赋
2016/10/27
690
5

没有更多内容

加载失败,请刷新页面

加载更多

tac 与cat

tac从后往前看文件,结合grep使用

writeademo
31分钟前
2
0
表单中readonly和dsabled的区别

这两种写法都会使显示出来的文本框不能输入文字, 但disabled会使文本框变灰,而且通过通过表单提交时,获取不到文本框中的value值(如果有的话), 而readonly只是使文本框不能输入,外观没...

少年已不再年少
52分钟前
2
0
SpringBoot上传图片操作

首先有个上传文件的工具类 /** * 文件上传 * @param file * @param filePath * @param fileName * @throws Exception */public static void uploadFile(byte[] file, String ...

_liucui_
今天
6
0
DrawerLayout

public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener,OnFragmentInteractionListener{ public NavigationView navView; ......

安卓工程师王恒
今天
1
0
python精简笔记

python精简笔记-字符串基本用法 字符串常见用法: * encode() # 编码成bytes类型 * find() # 查找子串 * index() # 获取下标 * replace() # 替换子串 * len(string) # 返回字符串长度,...

平头哥-Enjoystudy
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部