@InsertProvider 根据bean属性,自动生成插入sql语句
以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语句的更多相关文章
- Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题
在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public ...
- 一个自动生成插入与更新SQL语句的小类
无需关注字段类型,只要传入字段名与值的集合,自动生成Ms sql server SQL语句.详见Test()方法 using System; namespace Fan.iData.SqlUtilit ...
- 仿Orm 自动生成分页SQL
分页的写法 自从用上了Orm,分页这种事就是腰不酸腿不痛了.不过有时候想用纯粹的ado.net来操作,希望返回的数据是原生的DataTable或DbDataReader类似的东西,故研究下怎么生成分页 ...
- 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 ...
- Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...
- .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
目录 .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中 前言 笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在 ...
- .net core 利用日志查看ef生成的SQL语句
EF Core 没有直接提供像 EF6 那样方便的在日志中记录最终生成的 SQL 的功能,可以通过官方提供的日志记录(Microsoft.Extensions.Logging)实现. 一. 使用 Mi ...
- 深入理解 LINQ to SQL 生成的 SQL 语句
Ø 简介 在 C# 中与数据交互最常用的语句就是 LINQ 了,而 LINQ to SQL 是最直接与数据库打交道的语句,它可以根据 LINQ 语法生成对应的 SQL 语句,在数据库中去执行.本文主 ...
- oracle问题:新建了一个PDM文件,建表后生成的sql语句中含有clustered
问题描述 为了在oracle中新增表,在PDM中建表,使用其生成的sql语句,但是建表不能成功,提示 ORA-00906: 缺失左括号 原因是多了clustered 关键字 情景重现 1. 新建一个p ...
随机推荐
- java发送email一般步骤
java发送email一般步骤 一.引入javamail的jar包: 二.创建一个测试类,实现将要发送的邮件内容写入到计算机本地,查看是否能够将内容写入: public static void mai ...
- DocView mode 2 -- 快捷键
** 启动 C-c C-c 切换DocView和文件内容显示 M-x doc-view-mode 启动主模式 M-x doc-view-minor-mode 启动辅模式 k k ...
- PC上测试移动端网站和模拟手机浏览器
一.Chrome*浏览器 chrome模拟手机总共有四种方法,原理都一样,通过伪装User-Agent,将浏览器模拟成Android设备.以下标星的为推荐方法. 1.新建Chrome快捷方式 右击桌面 ...
- google F12
谷歌浏览器(Google Chrome)开发调试详细介绍 博客分类: 前端 浏览器chromegoogle调试开发 很多Web前台开发者都喜欢这种浏览器自带的开发者工具,这对前台设计.代码调试很大帮 ...
- 高性能MySQL(第三版)
一.MySQL架构与历史 1.2.2 锁粒度 表锁:写锁的优先级高于读锁:写锁的请求可以插入到读锁的前面,但读锁的请求却不能插入到写锁的前面: 行级锁:行级锁只在存储引擎层实现,在服务器层没有实现: ...
- Django中的csrf相关装饰器
切记: 这俩个装饰器不能直接加在类中函数的上方 (CBV方式) csrf_exempt除了,csrf_protect受保护的 from django.views import Viewfrom ...
- Knockout v3.4.0 中文版教程-9-计算监控-API参考
5.参考 下面的内容描述了如何构建和使用计算监控. 1. 构建一个计算监控 可以用如下的形式构建一个计算监控: ko.computed( evaluator [, targetObject, opti ...
- layer2-1 二层
一 概述 一层的相关介绍 CSMA/CD 网桥和交换机的区别 冲突 共享 端口密度 性能 功能 交换机的三种主流转发方式 存储转发 完整的收到 ...
- 04-offsetLeft和style.left的区别
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- resetlogs报错 ORA-00392
alter database open resetlogs或者 alter database open resetlogs upgrade报错:ORA-00392 在rman restor ...