以Test为例,用mybatis的@InsertProvider的注解插入数据的时候,每次都要写类似于

Mapper类

@Mapper
public interface TestDao { @InsertProvider(type = TestSqlProvider.class,method="insertAll")
public void insertOrderLine(@Param("list")List<Test> list); }
SqlProvider方法
    public String insertAll(Map map) {
List<Test> list = (List<Test>) maop.get("list");
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO TEST");
sb.append("(PKEY,NAME,AGE,SEX");
sb.append("VALUES");
MessageFormat mf = new MessageFormat(
"#'{'list[{0}].pkey},#'{'list[{0}].name},#'{'list[{0}].age},#'{''list[{0}].sex}");
for (int i = ; i < list.size(); i++) {
sb.append(mf.format(new Object[] { i }));
if (i < list.size() - )
sb.append(",");
}
return sb.toSting();
}

这种方式的话,写法很繁琐,如果字段多,就特别麻烦。所以我在想可不可以通过一种比较通用化的方式,生成插入语句。
方式:
用一个注解的形式,记录字段对应的数据库列名
注解类:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Columns { String value();//字段名 String comment() default "";//注释 }

在Test类的字段中加上@Columns注解

例如:

    @Columns(value = "PKEY",comment = "主键")
protected Integer pkey;//主键

然后写一个工具类,通过反射生成插入语句

方法:

public static String getInsertSql(Class<?> clas,int size) {
String tableName = SCHEMAS + "." + underscoreName(clas.getSimpleName());
List<Field> fieldList = getSuperFields(clas);
StringBuilder insertTable = new StringBuilder();
insertTable.append("INSERT INTO ");
insertTable.append(tableName);
StringBuilder columnsStr = new StringBuilder("(");
StringBuilder valuesStr = new StringBuilder("(");
for (int i = ; i < fieldList.size(); i++) {
fieldList.get(i).setAccessible(true);
Columns columns = fieldList.get(i).getAnnotation(Columns.class);
if (columns != null) {
columnsStr.append(columns.value()); }
String fieldName = fieldList.get(i).getName();
if (fieldName.equals("pkey")) {//db2自定生成自增主键的方式,也可以uuid
valuesStr.append("default");
}else {
valuesStr.append("#'{'list[{0}].").append(fieldName).append("}");
}
if (i < fieldList.size() - ) {
valuesStr.append(",");
columnsStr.append(",");
}
}
columnsStr.append(")");
valuesStr.append(")"); StringBuilder sql = new StringBuilder();
sql.append(insertTable).append(columnsStr).append("VALUES");
MessageFormat mf = new MessageFormat(valuesStr.toString());
for (int i = ; i < size; i++) {
sql.append(mf.format(new Object[] { i }));
if (i < size - ) {
sql.append(",");
}
} return sql.toString();
} // 驼峰转大写+下划线,abcAbcaBc->ABC_ABCA_BC
public static String underscoreName(String name) {
StringBuilder result = new StringBuilder();
if ((name != null) && (name.length() > )) {
result.append(name.substring(, ).toUpperCase());
for (int i = ; i < name.length(); i++) {
String s = name.substring(i, i + );
if ((s.equals(s.toUpperCase())) && (!Character.isDigit(s.charAt()))) {
result.append("_");
}
result.append(s.toUpperCase());
}
}
System.err.println("underscoreName:" + result.toString());
return result.toString();
} /**
*
* <p>Title: getSuperFields</p>
* <p>Description:获取所有属性,包含父类</p>
* @param clas
* @return
*/
public static List<Field> getSuperFields(Class<? extends BeanBase> clas) {
List<Field> fieldList = new ArrayList<>() ;
while (clas != null) {//取父类属性
fieldList.addAll(Arrays.asList(clas .getDeclaredFields()));
clas = (Class<? extends BeanBase>) clas.getSuperclass(); //父类
}
return fieldList;
}

insetAll的写法

    public String insertAll(Map map) {
List<Test> list = (List<Test>) map.get("list");
String insertSql = BeanUtils.getInsertSql(Test.class, list.size());
return insertSql;
}

到此就完成了自动化方法,这个只是粗劣的写一下,希望各位看过的大佬,指出不足

@InsertProvider 根据bean属性,自动生成插入sql语句的更多相关文章

  1. Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题

    在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public ...

  2. 一个自动生成插入与更新SQL语句的小类

    无需关注字段类型,只要传入字段名与值的集合,自动生成Ms sql server SQL语句.详见Test()方法 using System; namespace Fan.iData.SqlUtilit ...

  3. 仿Orm 自动生成分页SQL

    分页的写法 自从用上了Orm,分页这种事就是腰不酸腿不痛了.不过有时候想用纯粹的ado.net来操作,希望返回的数据是原生的DataTable或DbDataReader类似的东西,故研究下怎么生成分页 ...

  4. 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和  ...

  5. Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...

  6. .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中

    目录 .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中 前言 笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在 ...

  7. .net core 利用日志查看ef生成的SQL语句

    EF Core 没有直接提供像 EF6 那样方便的在日志中记录最终生成的 SQL 的功能,可以通过官方提供的日志记录(Microsoft.Extensions.Logging)实现. 一. 使用 Mi ...

  8. 深入理解 LINQ to SQL 生成的 SQL 语句

    Ø  简介 在 C# 中与数据交互最常用的语句就是 LINQ 了,而 LINQ to SQL 是最直接与数据库打交道的语句,它可以根据 LINQ 语法生成对应的 SQL 语句,在数据库中去执行.本文主 ...

  9. oracle问题:新建了一个PDM文件,建表后生成的sql语句中含有clustered

    问题描述 为了在oracle中新增表,在PDM中建表,使用其生成的sql语句,但是建表不能成功,提示 ORA-00906: 缺失左括号 原因是多了clustered 关键字 情景重现 1. 新建一个p ...

随机推荐

  1. java发送email一般步骤

    java发送email一般步骤 一.引入javamail的jar包: 二.创建一个测试类,实现将要发送的邮件内容写入到计算机本地,查看是否能够将内容写入: public static void mai ...

  2. DocView mode 2 -- 快捷键

    ** 启动 C-c C-c    切换DocView和文件内容显示 M-x doc-view-mode    启动主模式 M-x doc-view-minor-mode    启动辅模式 k    k ...

  3. PC上测试移动端网站和模拟手机浏览器

    一.Chrome*浏览器 chrome模拟手机总共有四种方法,原理都一样,通过伪装User-Agent,将浏览器模拟成Android设备.以下标星的为推荐方法. 1.新建Chrome快捷方式 右击桌面 ...

  4. google F12

    谷歌浏览器(Google Chrome)开发调试详细介绍 博客分类: 前端 浏览器chromegoogle调试开发  很多Web前台开发者都喜欢这种浏览器自带的开发者工具,这对前台设计.代码调试很大帮 ...

  5. 高性能MySQL(第三版)

    一.MySQL架构与历史 1.2.2 锁粒度 表锁:写锁的优先级高于读锁:写锁的请求可以插入到读锁的前面,但读锁的请求却不能插入到写锁的前面: 行级锁:行级锁只在存储引擎层实现,在服务器层没有实现: ...

  6. Django中的csrf相关装饰器

    切记:  这俩个装饰器不能直接加在类中函数的上方 (CBV方式) csrf_exempt除了,csrf_protect受保护的   from django.views import Viewfrom ...

  7. Knockout v3.4.0 中文版教程-9-计算监控-API参考

    5.参考 下面的内容描述了如何构建和使用计算监控. 1. 构建一个计算监控 可以用如下的形式构建一个计算监控: ko.computed( evaluator [, targetObject, opti ...

  8. layer2-1 二层

    一   概述    一层的相关介绍 CSMA/CD 网桥和交换机的区别 冲突    共享      端口密度     性能   功能   交换机的三种主流转发方式 存储转发         完整的收到 ...

  9. 04-offsetLeft和style.left的区别

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  10. resetlogs报错 ORA-00392

      alter database open resetlogs或者 alter database open resetlogs upgrade报错:ORA-00392     在rman restor ...