@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 ...
随机推荐
- c语言文件打开模式
(转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab rb ...
- C# IsNullOrEmpty与IsNullOrWhiteSpace
IsNullOrEmpty:非空非NULL判断 IsNullOrWhiteSpace:非空非NULL非空格判断 后者优于前者 if (!string.IsNullOrWhiteSpace(valueE ...
- react入门(上)
1. ReactJS是什么? 1). Facebook开源的一个js库 2). 一个用于动态构建用户界面的js库2. React的特点 * Declarative(声明式编码) * Component ...
- windows 使用git上传代码至github
1. 首先创建github账户 2. 创建github项目 3. windows安装git工具 ·下载地址:https://git-for-windows.github.io/ ,下载直接安装即可, ...
- MySQL 查询优化之 Index Merge
MySQL 查询优化之 Index Merge Index Merge Intersection 访问算法 Index Merge Union 访问算法 Index Merge Sort-Union ...
- (46)zabbix报警媒介:Jabber
Jabber有第三方插件,能让Jabber用户和MSN.YahooMessager.ICQ等IM用户相互通讯.因为Google遵从Jabber协议,并且Google已经将Gtalk的服务器开放给了其它 ...
- js解析器
1>js的预解析 找var function 参数等 所有的变量,在正式运行代码前,都提前赋了一个值:未定义 所有的函数,在正式运行代码前,都是整个函数块. 遇到重名的:只留一个 如果变量与函数 ...
- 生物信息学练习2- Biom-format
The Biological Observation Matrix (BIOM) format http://biom-format.org/ biom-format有两种方式安装: 1. pytho ...
- POJ:2753-Seek the Name, Seek the Fame
Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Description The little cat is s ...
- JavaScript注释
JavaScript注释有两种方式: 1.单行注释. 2.多行注释. 单行注释 单行注释以“//”开头. <script type="text/javascript"> ...