模拟Hibernate动态生成SQL语句
这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hp.pojo.Member" table="member" catalog="hedb">
<id name="mid" type="java.lang.String">
<column name="mid" length="50" />
<generator class="assigned"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
<property name="salary" type="java.lang.Double">
<column name="salary" precision="22" scale="0" />
</property>
<property name="birthday" type="java.util.Date">
<column name="birthday" length="0" />
</property>
<property name="note" type="java.lang.String">
<column name="note" length="65535" />
</property>
</class>
</hibernate-mapping>
POJO类如下:
package hp.pojo; import java.util.Date; /**
* Member entity. @author MyEclipse Persistence Tools
*/ @SuppressWarnings("serial")
public class Member implements java.io.Serializable
{ // Fields private String mid;
private String name;
private Integer age;
private Double salary;
private Date birthday;
private String note; // Constructors /** default constructor */
public Member()
{
} /** minimal constructor */
public Member(String mid)
{
this.mid = mid;
} /** full constructor */
public Member(String mid, String name, Integer age, Double salary, Date birthday, String note)
{
this.mid = mid;
this.name = name;
this.age = age;
this.salary = salary;
this.birthday = birthday;
this.note = note;
} // Property accessors public String getMid()
{
return this.mid;
} public void setMid(String mid)
{
this.mid = mid;
} public String getName()
{
return this.name;
} public void setName(String name)
{
this.name = name;
} public Integer getAge()
{
return this.age;
} public void setAge(Integer age)
{
this.age = age;
} public Double getSalary()
{
return this.salary;
} public void setSalary(Double salary)
{
this.salary = salary;
} public Date getBirthday()
{
return this.birthday;
} public void setBirthday(Date birthday)
{
this.birthday = birthday;
} public String getNote()
{
return this.note;
} public void setNote(String note)
{
this.note = note;
} }
下面代码演示了利用反射以及XML解析,动态生成SQL语句,并且利用JDBC技术执行SQL语句的过程:
package hp.test; import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import com.mysql.jdbc.PreparedStatement; public class MyHibernate
{
private class Column
{
private String name;
private String length;
} private class Generator
{
private String type;
} private class Id
{
private String name;
private String type; private Column column;
private Generator generator;
}
private class Property
{
private String name;
private String type;
private Column column;
} private class Class
{
private String name;
private String table;
private String catalog; private Id id;
private List<Property> allProperties;
}
private class KeyValuePair
{
private String type;
private Object value; private KeyValuePair(String type,Object value)
{
this.type = type;
this.value = value;
}
} private String configPath ;
private Object obj = null;
private Document document;
private Class voClass ;
private String sql;
private List<KeyValuePair> allValues; public MyHibernate(String configPath)
{
this.configPath = configPath;
} public int save(Object obj) throws Exception
{
this.obj = obj;
this.load();
this.format();
this.generateSql();
return this.saveToDb();
} public void load() throws Exception
{
SAXReader saxReader = new SAXReader();
this.document = saxReader.read(new File(this.configPath));
}
public void format() throws Exception
{
Class _class = new Class();
org.dom4j.Element root = this.document.getRootElement();
Element classElement = root.element("class");
_class.name = classElement.attributeValue("name");
_class.table = classElement.attributeValue("table");
_class.catalog = classElement.attributeValue("catalog"); Element idElement = classElement.element("id");
_class.id = new Id();
_class.id.name = idElement.attributeValue("name");
_class.id.type = idElement.attributeValue("type"); Element columnElementInId = idElement.element("column");
_class.id.column = new Column();
_class.id.column.name = columnElementInId.attributeValue("name");
_class.id.column.length = columnElementInId.attributeValue("length"); Element generatorElement = idElement.element("generator");
_class.id.generator = new Generator();
_class.id.generator.type = generatorElement.attributeValue("class"); List<Property> allProperties = new ArrayList<MyHibernate.Property>();
_class.allProperties = allProperties; List<Element> allPropertiesElements = classElement.elements("property");
for(Element item : allPropertiesElements)
{
Property property = new Property();
property.name = item.attributeValue("name");
property.type = item.attributeValue("type"); Element columnElement = item.element("column");
property.column = new Column();
property.column.name = columnElement.attributeValue("name");
property.column.length = columnElement.attributeValue("length");
allProperties.add(property);
//System.out.println("name: " + property.name);
}
this.voClass = _class;
} public void generateSql() throws Exception
{
this.allValues = new ArrayList<MyHibernate.KeyValuePair>();
StringBuffer columns = new StringBuffer();
StringBuffer values = new StringBuffer();
StringBuffer sql = new StringBuffer(" INSERT INTO ");
sql.append(this.voClass.table).append("( "); if("assigned".equals(this.voClass.id.generator.type))
{
//需要用户提供主键列
columns.append(this.voClass.id.column.name).append(",");
values.append("?,"); Field field = this.obj.getClass().getDeclaredField(this.voClass.id.name);
field.setAccessible(true);
this.allValues.add(new KeyValuePair(this.voClass.id.type, field.get(this.obj)));
} for(Property property : this.voClass.allProperties)
{
columns.append(property.column.name).append(",");
values.append("?,"); Field field = this.obj.getClass().getDeclaredField(property.name);
field.setAccessible(true);
this.allValues.add(new KeyValuePair(property.type, field.get(this.obj)));
} columns.delete(columns.length()-1, columns.length());
values.delete(values.length()-1, columns.length()); sql.append(columns.toString()).append(") VALUES (");
sql.append(values.toString()).append(")");
this.sql = sql.toString();
System.out.println(this.sql);
} public int saveToDb() throws Exception
{
java.lang.Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hedb", "root", "admin");
java.sql.PreparedStatement ps = conn.prepareStatement(this.sql); for(int i = 0; i < this.allValues.size(); i++)
{
//System.out.println("***type:" + this.allValues.get(i).type);
if(String.class.getName().toString().equals(this.allValues.get(i).type))
{
ps.setString(i+1, (String)this.allValues.get(i).value);
}
else if(Integer.class.getName().toString().equals(this.allValues.get(i).type))
{
ps.setInt(i+1, (Integer)this.allValues.get(i).value);
}else if(Double.class.getName().toString().equals(this.allValues.get(i).type))
{
ps.setDouble(i+1, (Double)this.allValues.get(i).value);
}else if(Date.class.getName().toString().equals(this.allValues.get(i).type))
{
ps.setDate(i+1, new java.sql.Date(((Date)this.allValues.get(i).value).getTime()));
} //System.out.println("设置第" + (i+1) + "个值("+this.allValues.get(i).type+","+this.allValues.get(i).value+")");
}
return ps.executeUpdate(); }
}
测试代码:
package hp.test; import java.util.Date; import org.hibernate.Session;
import org.hibernate.SessionFactory; import hp.pojo.Member;
import hp.utils.HibernateHelper; public class Main
{ public static void main(String[] args)
{
Member vo = new Member();
vo.setMid("admin4");
vo.setAge(24);
vo.setBirthday(new Date());
vo.setName("sheldon4");
vo.setNote("a good person4");
vo.setSalary(44444.44); try
{
MyHibernate mh = new MyHibernate("C:\\D\\code\\resource\\mapping.xml");
int count = mh.save(vo);
System.out.println("成功插入" + count + "行数据");
}
catch(Exception e)
{
e.printStackTrace(); }
System.out.println("main done//~");
} }
模拟Hibernate动态生成SQL语句的更多相关文章
- 如何根据实体动态生成sql语句
该文章同时解决了,如何向数据库中添加Null值,以及如何处理“参数化查询未提供参数”的错误.解决方案请看第二段折叠的代码. 背景: 在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有 ...
- 利用反射生成SQL语句
// 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBui ...
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...
- hibernate中使用sql语句进行表链接查询,对结果集的遍历方法
今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_ ...
- 根据excel表格字段生成sql语句
根据excel表格字段生成sql语句 1.1 前言 根据excel表格字段生成sql语句主要是利用了excel的拼接函数 CONCATENATE .该实例主要以mysql脚本支持.实例需求如下:exc ...
- 4、注解反射生成SQL语句
.任务说明 ①有一张用户表,字段包括:用户ID.用户名.昵称.年龄.性别.所在城市.邮箱.手机号: ②使用java注解来对用户表的每个字段或字段的组合条件进行动态生成S ...
- Excel表格生成sql语句
假如excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age ,在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...
- 反射生成SQL语句入门
今天我们来学习学习通过反射技术来生成SQL语句. 反射提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访 ...
- mybatis使用注解替代xml配置,动态生成Sql
mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...
随机推荐
- 五个新知识:微软SHA2补丁,亚信专业工具,微软官方文档,使用过期签名(附官方推荐链接),注意使用具有UAC的CMD
五个新知识:微软SHA2补丁,亚信专业工具,微软官方文档,使用过期签名 不支持SHA2算法的计算机更新补丁:https://technet.microsoft.com/zh-CN/library/se ...
- pydev package包中__init__.py作用
Eclipse用pydev,新建一个pydev package时,总会自动地生成一个空的__init__.py文件. 原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定 ...
- leetcode-Consecutive numbers
Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...
- 动态sql语句
当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,个人觉得用得比较多的地方就是执行搜索查询的SQL语句.对于搜索,可能要根据搜索条件判断来动态执行SQL语句. 在S ...
- javascript 缓冲运动demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 将16进制颜色转换成UIColor-ios
-(UIColor *) hexStringToColor: (NSString *) stringToConvert { NSString *cString = [[stringToConvert ...
- Java基础知识强化51:经典排序之桶排序(BucketSort)
1. 首先说明三点: (1)桶排序是稳定的 (2)桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 (3)桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 2. 桶排序的分析 ...
- 大数据笔记11:MapReduce的运行流程
1.基本概念 (1)Job & Task (2)JobTracker (3)TaskTracker
- C语言union关键字
union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...
- Python字符串格式符号含义
====== #字符串格式化符号含义 #%C 格式化字符串及其ASCLL码 >>> '%c' %97 'a' >>> '%c' % 97 'a' >>& ...