返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis抽取基类BaseMapper增删改查的实现
  • 946
分享到

mybatis抽取基类BaseMapper增删改查的实现

2024-04-02 19:04:59 946人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录准备工作:1:数据库表2:准备实体类步骤1:编写工具类Tools:作用:用于驼峰和数据库字段的转换步骤2:自定义两个注解,分别用于类字段的排除和字义主键步骤3:自定义动态sql生

目前项目当中使用mapper.xml文件方式对数据库进行操作,但是每个里边都有增/删/改/查,为了方便开发,把这些公共的代码提取出来,不用当做基类,不用每个Mapper文件都写了

准备工作:

1:数据库表


CREATE TABLE `t_permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
  `type` int(11) NOT NULL COMMENT '权限类型',
  `name` varchar(255) NOT NULL COMMENT '权限名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COMMENT='权限表';

2:准备实体类


public class TPermissionEntity {
 
 @PrimaryKey //下面步骤2中自定义注解
 private Integer id;//权限ID
 
 private Integer type;//权限类型
 private String name;//权限名称
 
 //省略了get,set方法....
 
}

步骤1:编写工具类Tools:作用:用于驼峰和数据库字段的转换

因为类的名称用的是驼峰命名,所以这里需要转换一下


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Tool {
 
 private static Pattern linePattern = Pattern.compile("_(\\w)");
 
 public static String lineToHump(String str) {
  str = str.toLowerCase();
  Matcher matcher = linePattern.matcher(str);
  StringBuffer sb = new StringBuffer();
  while (matcher.find()) {
   matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
  }
  matcher.appendTail(sb);
  return sb.toString();
 }
 
 private static Pattern humpPattern = Pattern.compile("[A-Z]");
 
 public static String humpToLine(String str) {
  Matcher matcher = humpPattern.matcher(str);
  StringBuffer sb = new StringBuffer();
  while (matcher.find()) {
   matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
  }
  matcher.appendTail(sb);
  return sb.toString();
 }
 
}

步骤2:自定义两个注解,分别用于类字段的排除和字义主键


@Target({ElementType.FIELD})  
@Retention(RetentionPolicy.RUNTIME) 
public @interface Exclude {
 
}
@Target({ElementType.FIELD})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface PrimaryKey {  
    String value() default "";  
} 

步骤3:自定义动态sql生成类BaseSqlProvider<T>

作用:根据传入的对象动态获取表名和字段名生成动态的sql语句,再执行

@Insert,@Select,@update,@Delete是直接配置SQL语句,而@InsertProvider,@UpdateProvider,@SelectProvider,@DeleteProvider则是通过SQL工厂类及对应的方法生产SQL语句


import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.jdbc.SQL;
import com.example.demo.common.utils.Tool;
 
public class BaseSqlProvider<T> {
 
 @Options
 public String add(T bean) {
 
  SQL sql = new SQL();
 
  Class clazz = bean.getClass();
 
  String tableName = clazz.getSimpleName();
  
  String realTableName = Tool.humpToLine(tableName).replaceAll("_entity", "").substring(1);
  sql.INSERT_INTO(realTableName);
 
  List<Field> fields = getFields(clazz);
  for (Field field : fields) {
 
   field.setAccessible(true);
 
   String column = field.getName();
 
   System.out.println("column:" + Tool.humpToLine(column));
 
   sql.VALUES(Tool.humpToLine(column), String.fORMat("#{" + column + ",jdbcType=VARCHAR}"));
 
  }
 
  return sql.toString();
 }
 
 public String delete(T bean) {
 
  SQL sql = new SQL();
 
  Class clazz = bean.getClass();
 
  String tableName = clazz.getSimpleName();
 
  String realTableName = Tool.humpToLine(tableName).replaceAll("_entity", "").substring(1);
  sql.DELETE_FROM(realTableName);
 
  List<Field> primaryKeyField = getPrimarkKeyFields(clazz);
 
  if (!primaryKeyField.isEmpty()) {
 
   for (Field pkField : primaryKeyField) {
    pkField.setAccessible(true);
    sql.WHERE(pkField.getName() + "=" + String.format("#{" + pkField.getName() + "}"));
   }
 
  } else {
 
   sql.WHERE(" 1= 2");
 
   throw new RuntimeException("对象中未包含PrimaryKey属性");
  }
 
  return sql.toString();
 }
 
 private List<Field> getPrimarkKeyFields(Class clazz) {
 
  List<Field> primaryKeyField = new ArrayList<>();
  List<Field> fields = getFields(clazz);
  for (Field field : fields) {
   field.setAccessible(true);
   PrimaryKey key = field.getAnnotation(PrimaryKey.class);
   if (key != null) {
    primaryKeyField.add(field);
   }
 
  }
  return primaryKeyField;
 }
 
 private List<Field> getFields(Class clazz) {
 
  List<Field> fieldList = new ArrayList<>();
  Field[] fields = clazz.getDeclaredFields();
  for (Field field : fields) {
   field.setAccessible(true);
   Exclude key = field.getAnnotation(Exclude.class);
   if (key == null) {
    fieldList.add(field);
   }
 
  }
  return fieldList;
 }
 
 public String get(T bean) {
 
  SQL sql = new SQL();
 
  Class clazz = bean.getClass();
 
  String tableName = clazz.getSimpleName();
 
  String realTableName = Tool.humpToLine(tableName).replaceAll("_entity", "").substring(1);
  sql.SELECT("*").FROM(realTableName);
 
  List<Field> primaryKeyField = getPrimarkKeyFields(clazz);
 
  if (!primaryKeyField.isEmpty()) {
 
   for (Field pkField : primaryKeyField) {
    pkField.setAccessible(true);
    sql.WHERE(pkField.getName() + "=" + String.format("#{" + pkField.getName() + "}"));
    
   }
  } else {
 
   sql.WHERE(" 1= 2");
 
   throw new RuntimeException("对象中未包含PrimaryKey属性");
  }
  System.out.println("getSql:"+sql.toString());
  return sql.toString();
 }
 
 public String update(T bean) {
 
  SQL sql = new SQL();
 
  Class clazz = bean.getClass();
 
  String tableName = clazz.getSimpleName();
 
  String realTableName = Tool.humpToLine(tableName).replaceAll("_entity", "").substring(1);
  sql.UPDATE(realTableName);
 
  List<Field> fields = getFields(clazz);
  for (Field field : fields) {
 
   field.setAccessible(true);
 
   String column = field.getName();
 
   if (column.equals("id")) {
    continue;
   }
 
   System.out.println(Tool.humpToLine(column));
 
   sql.SET(Tool.humpToLine(column) + "=" + String.format("#{" + column + ",jdbcType=VARCHAR}"));
  }
 
  List<Field> primaryKeyField = getPrimarkKeyFields(clazz);
 
  if (!primaryKeyField.isEmpty()) {
 
   for (Field pkField : primaryKeyField) {
    pkField.setAccessible(true);
    sql.WHERE(pkField.getName() + "=" + String.format("#{" + pkField.getName() + "}"));
   }
 
  } else {
 
   sql.WHERE(" 1= 2");
 
   throw new RuntimeException("对象中未包含PrimaryKey属性");
  }
  System.out.println("updateSql:"+sql.toString());
  return sql.toString();
 
 } 
}

步骤4:编写BaseMapper基类接口


public interface BaseMapper<T> {
 
        //新增一条数据
 @InsertProvider(method = "add",type=BaseSqlProvider.class)
 @Options(useGeneratedKeys=true)
 public int add(T bean);
 
        //根据主键删除一条数据
 @DeleteProvider(method = "delete",type=BaseSqlProvider.class)
 public int delete(T bean);
 
        //根据主键获取一条数据
 @SelectProvider(method = "get",type=BaseSqlProvider.class)
 public T get(T bean);
 
        //修改一条数据
 @UpdateProvider(method = "update",type=BaseSqlProvider.class)
 public int update(T bean);
 
}

说明:@InsertProvider注解中的type指明自定义的SQL工厂类,method是工厂类里对应的方法,方法返回的是对方的sql语句

到这里基类以及它的配置就完成了,接下来,可以使用了

举例:

编写一个TPermissionMapper接口,实现BaseMapper类,并传入一个泛型参数,此时这个TPermissionMapper接口已经具备了,BaseMapper中基本的增/删/改/查功能.同时TPermissionMapper还可以再写自己独有的方法和mapper.xml文件对功能进行扩展


public interface TPermissionMapper extends BaseMapper<TPermissionEntity>{
 
 //List<TPermissionEntity> queryByPage();
 
}

在controller当中的应用:


@Controller
public class LoginController {
 
 @Autowired
 private TPermissionMapper tPermissionMapper;
 
        //新增
 @ResponseBody
 @RequestMapping(value = "/add")
 public Integer add() {
  TPermissionEntity permissionEntiry = new TPermissionEntity();
  permissionEntiry.setName("test");
  permissionEntiry.setType(3);
  Integer num = tPermissionMapper.add(permissionEntiry);
  return num;
 }
 
        //修改
 @ResponseBody
 @RequestMapping(value = "/update")
 public Integer update() {
  TPermissionEntity permissionEntiry = new TPermissionEntity();
  permissionEntiry.setId(23);
  permissionEntiry.setName("test");
  permissionEntiry.setType(3);
  Integer num = tPermissionMapper.update(permissionEntiry);
  return num;
 }
 
        //查询
 @ResponseBody
 @RequestMapping(value = "/query")
 public TPermissionEntity query() {
  TPermissionEntity tPermissionEntity = new TPermissionEntity();
  tPermissionEntity.setId(23);
  tPermissionEntity= (TPermissionEntity) tPermissionMapper.get(tPermissionEntity);
  return tPermissionEntity;
 }
 
        //删除
 @ResponseBody
 @RequestMapping(value = "/delete")
 public Integer delete() {
  TPermissionEntity permissionEntiry = new TPermissionEntity();
  permissionEntiry.setId(22);
  Integer num = tPermissionMapper.delete(permissionEntiry);
  return num;
 }
}

到此这篇关于mybatis抽取基类BaseMapper增删改查的实现的文章就介绍到这了,更多相关mybatis BaseMapper增删改查内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: mybatis抽取基类BaseMapper增删改查的实现

本文链接: https://lsjlt.com/news/135760.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mybatis抽取基类BaseMapper增删改查的实现
    目录准备工作:1:数据库表2:准备实体类步骤1:编写工具类Tools:作用:用于驼峰和数据库字段的转换步骤2:自定义两个注解,分别用于类字段的排除和字义主键步骤3:自定义动态sql生...
    99+
    2024-04-02
  • Mybatis实现增删改查
    目录一.mybatis的配置1.1 添加相应的jar包1.2 配置mybatis.xml文件1.3 创建数据库1.4 创建实体类1.5 创建接口实现的方法1.6 配置UserMapp...
    99+
    2024-04-02
  • Mybatis(二):实现“增删改查”
    Mybatis(二):实现“增删改查” 前言一、MyBatis的增删改查1、添加2、修改3、删除4、查询4.1 查询一个实体4.1 查询集合 二、MyBatis获取参数值的两种方式(...
    99+
    2023-10-08
    mybatis java 数据库
  • MybatisPlus BaseMapper 实现对数据库增删改查源码
    目录环境搭建从 @MapperScan 入手SqlSessionDaoSupportMybatisConfiguration.addMapper()小结MybatisPlus 是一款...
    99+
    2023-01-31
    MybatisPlus BaseMapper 数据库增删改查 MybatisPlus增删改查
  • Mybatis如何实现增删改查
    这篇文章主要介绍了Mybatis如何实现增删改查,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Mybatis实现增删改查一.mybatis的配置1.1 添加相应的jar包在l...
    99+
    2023-06-26
  • SpringBoot配置MyBatis-Plus实现增删查改
    目录1 MyBatis-Plus 2 Maven依赖3 Spring Boot配置4 UserEntity5 UserMapper6 Serv...
    99+
    2024-04-02
  • JDBC 实现通用的增删改查基础类方法
    java中关于数据的管理有很多的框架,如hibernate、mybatis等,但我最开始学习的就是JDBC,我觉得JDBC还是很不错的,它让我更深层次的了解了数据的操作,今天我将我写过的JDBC基础类再写一遍!加深下记忆!!!先将通用的增查...
    99+
    2023-05-30
  • Mybatis基于xml配置实现单表的增删改查功能
    Mybatis入门-基于配置实现单表的增删改查 Mybatis简介 官网链接:https://mybatis.org/mybatis-3/zh/index.html。更加详细的信息可...
    99+
    2024-04-02
  • MyBatis 单表的增删改查
    ✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:...
    99+
    2023-08-17
    mybatis java mysql
  • Mybatis Plus 增删改查的实现(小白教程)
    目录前言什么是 mybatis-plus?快速开始准备环境:准备数据表 IDEA中配置 maven 创建 spring boot 应用创建mapper接口添加@MapperScan ...
    99+
    2024-04-02
  • SpringBoot整合Mybatis简单实现增删改查
    目录前言第一:创建MySQL数据库第二:创建SpringBoot项目,引入需要的依赖包第三:创建程序目录和配置核心application.xml文件第四:依次编写Entity、Dao...
    99+
    2024-04-02
  • C#抽象增删改怎么实现
    本篇内容主要讲解“C#抽象增删改怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#抽象增删改怎么实现”吧!现在业界火了一种ORM 框架,那就是Dapper,我也是Dapper的粉丝之一,...
    99+
    2023-06-17
  • Mybatis怎么实现动态增删改查功能
    这篇文章给大家分享的是有关Mybatis怎么实现动态增删改查功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、Mybatis 流程简介最近在看 Mybatis 的源码,大致了解整个框架流程后便手写了一个特别简...
    99+
    2023-06-14
  • Mybatis怎么实现一个增删改查程序
    这篇文章主要介绍“Mybatis怎么实现一个增删改查程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mybatis怎么实现一个增删改查程序”文章能帮助大家解决问题。idea新建Maven项目Myb...
    99+
    2023-06-30
  • Mybatis实现自动生成增删改查代码
    目录1 配置Mybatis插件2 创建库表3 配置参数4 运行插件5 编写其他代码使用 mybatis generator 自动生成代码,实现数据库的增删改查。 GitHub项目地址...
    99+
    2023-01-11
    Mybatis自动生成代码 Mybatis自动生成增删改查代码 Mybatis增删改查
  • MongoDB实现增删改查
    一、增加 insert向数据库中插入集合 插入一条记录,传入集合 db..insert() db.students.insert({name:"唐僧",age:60,gender:"...
    99+
    2024-04-02
  • 使用Spring+SpringMVC+Mybatis实现留言板的增删改查
    目的 1)掌握使用maven来创建SSM项目 2)掌握web.xml和pom.xml的使用 3)掌握Spring、SpringMVC和Mybatis,学会整合SSM 4)掌握的controller层注解@Autowired,@Requ...
    99+
    2023-09-01
    mysql tomcat idea
  • SpringBoot整合MyBatis实现增删改查(简单,详细)
    新建springboot工程 若选择https://start.spring.io下一步失败 则选择Custom,输入:https://start.aliyun.com后下一步 添加需要的依赖 添加其他依赖,全部依赖如下: ...
    99+
    2023-08-19
    mybatis spring boot 数据库 mysql
  • python实现mongodb的增删改查
                                                          python实现mongodb的增删改查环境:192.168.122.1    python192.168.122.11  mong...
    99+
    2023-01-31
    python mongodb
  • Mybatis接口没有实现类为什么可以执行增删改查
    Mybatis接口没有实现类为什么可以执行增删改查,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、前言介绍MyBatis 是一款非常优秀的持久层框架,相对于I...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作