- 浏览: 253841 次
文章分类
最新评论
-
乛小小白:
有问题啊,下载下来的东西后面有一堆重复的
利用RandomAccessFile 实现多线程下载。 -
liyonghui160com:
能否给个例子 sqlserver的调不通啊
mybatis调用存储过程 -
abc382410124:
存储过程要占用数据库本身的计算资源,数据库本身增删改查已经够累 ...
mybatis调用存储过程 -
ccm1273936998:
[b][/b]
mybatis调用存储过程 -
nanjiwubing123:
<insert id="insert ...
mybatis批量更新的一些问题
现在所学的东西,有很多的共性。Dao层对于臃肿,很多都是ctrl+c和ctrl+v 完成的,这种事情纯粹就是苦力代码。利用双周的时间,用反射机制实现了sql自动生成,简化list封装。
大家看看还有什么需要改进的地方吧。
sql工具类
反射工具类:ReflecTionUtil
嗯,受用。
大家看看还有什么需要改进的地方吧。
sql工具类
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Time; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; public class SqlFactory { /** * @author fule * @param args * 反射工具类 自动生成sql 语句 和参数赋值 实体类中含有id字样的只能唯一 * 对外接口 对象 语句类型 查询参数Map<String,object>字段名 字段值 * * 如果是查询操作,构造方法传入一个jvm初始化的对象实体,生成语句时调用createQuerySql(map ma)方法 * Map<String,object>字段名 字段值 * * 其他操作,构造方法传入一个具体对象实体,生成语句时调用createUpdateSql(String type)方法 * type为update delete insert 的字符串 */ /** 需自动化的对象 **/ private Object obj; /** 生成的sql语句 **/ private String sql; /** 参数值 **/ private List objParam = new ArrayList(); /** 保存对象的属性名和属性值 **/ private Map<String, Object> paramMap = new HashMap<String, Object>(); public SqlFactory(Object obj){ /** * 构造方法 * 自动加载load */ try { this.obj=obj; load(obj); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("IllegalArgumentException***类反射失败"); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("IllegalAccessException***类反射失败"); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("InvocationTargetException***类反射失败"); } } @SuppressWarnings("unchecked") private void load(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { /** * 获得属性名称和值的集合 * */ Class c = obj.getClass(); Method[] methods = c.getMethods(); for (Method m : methods) { String mName = m.getName(); if (mName.startsWith("get") && !mName.startsWith("getClass")) { String fieldName = mName.substring(3, mName.length()); Object value = m.invoke(obj, null); if (value instanceof String) { paramMap.put(fieldName, "\"" + value + "\""); } else { paramMap.put(fieldName, value); } } } } public Object[] getSqlParams() { /** * 参数值 */ return objParam.toArray(); } @SuppressWarnings("unchecked") public String createQuerySql(Map<String,Object> map){ /** * 查询单表记录的sql * map 数据表的字段名 与值 * 不支持分组与多表 */ Class c = obj.getClass(); String tableName = c.getSimpleName(); String sql="select * from "+tableName; if(map!=null){ StringBuffer strb = new StringBuffer("select * from "+tableName+" where 1=1"); Set<String> set = map.keySet(); Object[] keys = set.toArray(); int len = keys.length; for (int i = 0; i < len; i++) { strb.append(" and "+keys[i]+"=?"); objParam.add(map.get(keys[i]));//将值加入到参数 } sql = strb.toString(); } return sql; } @SuppressWarnings("unchecked") public String createUpdateSql(String type) { /** * createUpdateSql 自动生成添删改的SQL语句 * 表中 字段名只能有一个包含id的字段 * @param obj 对象 * @param type 传递过来的操作类型 delete update insert * @return String */ Class c = obj.getClass(); String tableName = c.getSimpleName(); StringBuffer strb = new StringBuffer(); Set<String> set = paramMap.keySet(); Object[] keys = set.toArray(); int len = keys.length; if ("insert".compareToIgnoreCase(type)==0) { strb.append("insert into " + tableName + "("); for (int i = 0; i < len; i++) { if (i < len - 1) { strb.append(keys[i]); objParam.add(paramMap.get(keys[i])); strb.append(","); } else { strb.append(keys[i]); objParam.add(paramMap.get(keys[i])); strb.append(") values("); } } for (int i = 0; i < len; i++) { if (i < len - 1) { strb.append("?" + ","); } else { strb.append("?" + ")"); } } } if ("delete".compareToIgnoreCase(type)==0) { strb.append("delete from " + tableName); for (int i = 0; i < len; i++) { if (((String) keys[i]).contains("id") || ((String) keys[i]).contains("Id")) { strb.append(" where " + keys[i] + "=?"); objParam.add(paramMap.get(keys[i])); } } } if ("update".compareToIgnoreCase(type)==0) { strb.append("update " + tableName + " "); for (int i = 0; i < len; i++) { if (i < len - 1) { strb.append("set" + keys[i] + "=?"); objParam.add(paramMap.get(keys[i])); strb.append(","); } else { strb.append("set" + keys[i] + "=?"); objParam.add(paramMap.get(keys[i])); } } for (int i = 0; i < len; i++) { if (((String) keys[i]).contains("id") || ((String) keys[i]).contains("Id")) { strb.append(" where " + keys[i] + "=?"); objParam.add(paramMap.get(keys[i])); } } } sql = strb.toString(); return sql; } /** * Test * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Users te = new Users(); te.setName("张三"); te.setPass("123456"); te.setId(123); te.setBir(new Time(new Date().getTime())); System.out.println("********添删改********"); SqlFactory sf = new SqlFactory(te); String sql = sf.createUpdateSql("delete"); Object[] oo = sf.getSqlParams(); System.out.println(sql); System.out.println(Arrays.toString(oo)); System.out.println("********查询********"); SqlFactory sf2 = new SqlFactory(te);//1 Map<String, Object> ma = new HashMap<String, Object>(); ma.put("userName", "张三"); ma.put("userPass", new Time(new Date().getTime())); String qsql = sf2.createQuerySql(ma);//2 System.out.println(qsql); Object[] oo2 = sf2.getSqlParams();//3 System.out.println(Arrays.toString(oo2)); String sstr = "setUid"; System.out.println(sstr.substring(3)); } } class Users { private String name; private String pass; private int id; private Time Bir; public int getId() { return id; } public void setId(int id) { this.id = id; } public Time getBir() { return Bir; } public void setBir(Time bir) { Bir = bir; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Users() {} }
反射工具类:ReflecTionUtil
package com.util; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.SortedMap; import javax.servlet.jsp.jstl.sql.Result; import com.entity.Nr_users; public class ReflecTionUtil { /** * @author fule * 反射工具类 * 封装数据结果到集合 * 传入result 实体和 实体类具体url */ private String[] classMethods = new String[20];// set方法数组 private Class[] classParams = new Class[20];// set方法参数类型 private int classMethodsNum = 0;// 实体类属性个数 private Class cs = null;// 会话管理器 private List list = null;// 实体类属性字段名的集合 public void getStandardManager(String url) throws ClassNotFoundException { cs = Class.forName(url); } public void getProtect(String url) throws ClassNotFoundException { // 实体类变量字段 list = new ArrayList(); this.getStandardManager(url); Field[] fields = cs.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { list.add(fields[i].getName()); } } public void getConsructor(String url) throws ClassNotFoundException { // set方法和参数类型 this.getStandardManager(url); Method[] methods = cs.getMethods(); int count = 0; for (Method m : methods) { if (m.getName().substring(0, 3).equals("set")) { Class[] parms = m.getParameterTypes(); classMethods[count] = m.getName(); classParams[count] = parms[0];// count++; } } classMethodsNum = count; } public Object getObject(String url) throws SecurityException, NoSuchMethodException, ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { /** * 创建类对象 */ this.getStandardManager(url); Constructor constructor = cs.getConstructor(); Object object = constructor.newInstance(); return object; } public Result checkResult(Result rs) { /** * 验证数据库中的数据 */ for (int i = 0; i < rs.getRowCount(); i++) { SortedMap map = rs.getRows()[i]; for (int j = 0; j < list.size(); j++) { Object value = map.get(list.get(j));//testtest if(value==null){ System.out.println("数据验证失败,检查实体类与数据表规范!"); try { throw new Exception("数据验证失败,检查实体类与数据表规范!"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ map.put(list.get(j), value); } } } return rs; } public List getValue(String url, Result rs) { /** * list列表 value */ List resultlist = new ArrayList(); try { this.getConsructor(url); this.getProtect(url); rs = checkResult(rs); for (int i = 0; i < rs.getRowCount(); i++) { Object object = this.getObject(url); for (int j = 0; j < classMethodsNum; j++) { Method method = cs.getMethod(classMethods[j], classParams[j]); //System.out.println("当前调用set方法:"+method); //System.out.println("表字段名:"+classMethods[j] // .substring(3).toLowerCase());//表字段名 String tstr = classMethods[j] .substring(3).toLowerCase(); ///System.out.println("表字段值:"+rs.getRows()[i].get(tstr)); //表字段值 method.invoke(object, rs.getRows()[i].get(tstr));//动态设值 //System.out.println((Nr_users)object); } resultlist.add(object); } } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return resultlist; } }
评论
8 楼
allan_chan
2012-04-25
实用性不强,但可以很好的理解反射机制
7 楼
jyjava
2012-04-23
其实应该都是单表的操作,或者像ibates那样生成链表的javaBean结果
6 楼
lohasle
2012-04-23
yjingzeming 写道
String tableName = c.getSimpleName();
String sql="select * from "+tableName;
这样子强迫对象名和表名字相同感觉有点不人性呀,对于一个表名字为T_WEBSERVICE_ORGANIZATIO的pojo类名也为这个的让我情何以堪?
再加个构造器
//表名称
public String tblname;
public SqlFactory(String tblname){
this.tblname = tblname;
}
这样子是否可以?
String sql="select * from "+tableName;
这样子强迫对象名和表名字相同感觉有点不人性呀,对于一个表名字为T_WEBSERVICE_ORGANIZATIO的pojo类名也为这个的让我情何以堪?
再加个构造器
//表名称
public String tblname;
public SqlFactory(String tblname){
this.tblname = tblname;
}
这样子是否可以?
嗯,受用。
5 楼
cfan_haifeng
2012-04-23
更多的是使用代码生成器,连同jsp、dao、service、pojo、action都搞出来
4 楼
yjingzeming
2012-04-23
String tableName = c.getSimpleName();
String sql="select * from "+tableName;
这样子强迫对象名和表名字相同感觉有点不人性呀,对于一个表名字为T_WEBSERVICE_ORGANIZATIO的pojo类名也为这个的让我情何以堪?
再加个构造器
//表名称
public String tblname;
public SqlFactory(String tblname){
this.tblname = tblname;
}
这样子是否可以?
String sql="select * from "+tableName;
这样子强迫对象名和表名字相同感觉有点不人性呀,对于一个表名字为T_WEBSERVICE_ORGANIZATIO的pojo类名也为这个的让我情何以堪?
再加个构造器
//表名称
public String tblname;
public SqlFactory(String tblname){
this.tblname = tblname;
}
这样子是否可以?
3 楼
tangjunjun1986
2012-04-23
性能!!!!!
2 楼
shiren1118
2012-04-23
没啥大意义,反射慎用啊,如果需要的话可以考虑grails的orm
1 楼
apple0668
2012-04-23
链表查询可以做到么?
发表评论
-
java取得格式化时间的最小刻度的整点时间
2013-05-02 16:10 10760public class Test{ /** ... -
java与Spring中的资源加载
2013-04-26 16:58 4242java Resource 资源加载: xml p ... -
圣诞即来,一颗打印的圣诞树给程屌。
2012-12-24 14:43 47import java.util.Scanner; ... -
整了一个工具类,简化文件上传的一些基本操作。(基于common-fileupload)
2012-07-23 15:37 7224一般常用的有三种上传组件是用的比较多的有三种。 参考:htt ... -
java代码优化
2012-07-06 11:02 3701 集合,数组遍历 提前写好len 2 手动置无用对象指向 ... -
自动生成实体类
2012-04-19 12:33 5052javabean中需要建大量的实体类,几张表就有几张实体类,有 ...
相关推荐
C#封装MySql数据库操作,反射动态生成SQL语句。看程序前,最好请先看看里面的“数据库说明”文档,不然可能会一头雾水。 这是我第一次写数据库的程序,我知道有很多地方写得不好,希望能得到大家的指点。我的联系...
qt 封装的类 表根据字段名和值 生成sql语句
插件中封装了一系列数据库操作的类,根据实体模型自动化生成插入、更新、删除、查询语句,Dao层通用函数封装,使用此插件基本上只用写少量的数据库层代码即可完成对数据库的操作。
1、EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2、通过datatable反射实体需要先建一个类 ,头痛 3、通过SQL语句返回的实体也需要先建一个类 ,头痛 4、如果通过代码生成器要写模版,需要...
DbToCode 是一款为 C# 数据库程序员设计的自动代码生成器,DbToCode 生成的代码基于基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。采用 Model +...
插件中封装了一系列数据库操作的类,根据实体模型自动化生成插入、更新、删除、查询语句,Dao层通用函数封装,使用此插件基本上只用写少量的数据库层代码即可完成对数据库的操作。
5、Enterprise Library代码生成,生成整个项目工程框架,包含实体类、数据访问类、业务类、Asp.net页面类,利用泛型及缓存机制,良好的架构极大简化代码,强大完善的基类使你甚至不用编写一行代码。 6、可以查看...
在封装SQL语句之前,我们得知道什么是DAO封装与实体类以及JDBC工具类的封装与连接数据库的具体流程。 封装SQL语句的好处: 封装SQL语句后就可以导包,给其他的工程使用,大大降低开发的强度,减少代码的冗余。...
查询信息实体类(SearchInfo.cs)7.类型(例如:int,string,double)转换(SmartDataReader.cs)8.Sql命令操作函数(可用于安装程序的时候数据库脚本执行)(SqlScriptHelper.cs)----------Device--------------1....
通过书写实体类,在实体类上就注解,程序生成表结构. 通过书写sql语句,返回map或list结构表示单条记录或多条记录. sqlit-tools-android V0.1不能做的事: 不提供多表关系与实体类进行映射的功能,sqlit-tools并不是...
采用 Model + DAL + BLL + Web 的设计,主要实现在 C# 中对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、 Model 类构造等基础代码片断,使程序员可以节省大量机械录入的时间和...
用来生成支持特定框架的数据访问代码,可以将数据库完全封装,不用再考虑数据库,也不用写Sql语句,可以极大的提高工作效率,完全通过一些属性的控制来完成数据库逻辑,而且支持数据库事务 有两个版本PPCoder1.0S为...
作业内容是做一个控制台程序: 1 建立一个数据库,然后执行下面的数据库脚本,会增加两张表 User Company,大家可以去表里面自己多...8 进阶需求(可选):每个实体类的基础增删改查SQL语句是不变的,用泛型缓存试试!
.Net平台下的O-RMap中间件。我用C#实现了一个实体层Xxmm。采用它的好处是你的应用程序开发者不需要了解关系数据库结构,事实上,他们甚至不...因为SQL语句都是在运行时刻有Xxmm自动生成。它将随你的数据库变化而变化。
此版本不仅整合了springboot和mybatis,更是通过自己封装,实现动态生成sql语句,对应的实体类service只需要继承一个类就能动态的生成自己的增删查改,大大简化了常见的操作
MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。 MyBatis、Hibernate 和 JDBC和 Hibernate 相比,MyBatis 封装性低于 Hibernate,但性能优秀...
CoreData的简单用法,增删改查。由于是一个Demo所以也没怎么进行封装,就迁就着看,再以后的几篇关于...个人感觉效率比FMDM操作数据库高,而且还能直接生成实体类,省去了我们去一个文件一个文件的去建立model层的东西
11.执行查询语句,返回DataSet,执行SQL语句,返回影响的记录数,执行多条SQL语句,实现数据库事务。 执行多条SQL语句,实现数据库事务。 12.执行多条SQL语句,实现数据库事务。 13.执行多条SQL语句,实现数据库事务...
甚至不用写insert和uqdate语句,只要把实体传进去就能实现插入和更新,而且还解决了date类型的格式问题,你只需要设置一下dbHelper类的属性就能实现时间类型的插入和取出格式。而且在插入和更表时实现了自动避开自动...
你可以用它来生成ORM的实体类,存储过程,SQL语句等等。我甚至用它来生成Asp.Net的页面(呵呵,我很懒)。 MyGeneration提供了强大的在线模版库,你可以通过访问其网站或者使用Template Browser中的在线模版功能...