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

简介: 一、使用篇      如果项目本身基于SpringMVC+Mybatis构建,不需添加任何配置Mapper类只需继承BaseMapper,即拥有增删改方法操作,无需任何配置文件   package com.

一、使用篇

      如果项目本身基于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);
        }
    }
相关文章
|
6天前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
4天前
|
SQL Java 数据库
5、Mybatis-Plus 常用注解
这篇文章详细介绍了Mybatis-Plus中常用的注解,包括解决实体类与数据库表名不一致、字段不匹配的问题,主键生成策略的配置,以及逻辑删除的实现方法。
|
4天前
|
SQL Java 数据库
5、Mybatis-Plus 常用注解
这篇文章详细介绍了Mybatis-Plus中常用的注解,包括解决实体类与数据库表名不一致、字段不匹配的问题,主键生成策略的配置,以及逻辑删除的实现方法。
5、Mybatis-Plus 常用注解
|
6天前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
17天前
|
缓存 Java 数据库连接
mybatis1.常见配置
本文介绍了MyBatis框架中的常见配置及其加载顺序。配置可通过`properties`元素、资源文件或方法参数传递,其中方法参数传递的属性具有最高优先级。文章列举了几个重要的配置项,如`cacheEnabled`用于全局开启或关闭缓存功能;`lazyLoadingEnabled`控制对象的延迟加载行为;`useGeneratedKeys`允许JDBC支持自动生成主键;`defaultExecutorType`设定默认执行器类型等。此外,还介绍了多环境配置方法,通过`environments`元素可定义不同环境下的数据库连接信息,并可根据需求动态选择加载特定环境
|
23天前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
38 3
|
5天前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
2月前
|
SQL 人工智能 Java
mybatis-plus配置sql拦截器实现完整sql打印
_shigen_ 博主分享了如何在MyBatis-Plus中打印完整SQL,包括更新和查询操作。默认日志打印的SQL用?代替参数,但通过自定义`SqlInterceptor`可以显示详细信息。代码示例展示了拦截器如何替换?以显示实际参数,并计算执行时间。配置中添加拦截器以启用此功能。文章提到了分页查询时的限制,以及对AI在编程辅助方面的思考。
145 5
mybatis-plus配置sql拦截器实现完整sql打印
|
1月前
|
Java 数据库连接 mybatis
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
|
2月前
|
Java 数据库连接 数据库
Springboot整合mybatis注解版(202005)
Springboot整合mybatis注解版(202005)
28 3