这里有一个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语句的更多相关文章

  1. 如何根据实体动态生成sql语句

    该文章同时解决了,如何向数据库中添加Null值,以及如何处理“参数化查询未提供参数”的错误.解决方案请看第二段折叠的代码. 背景: 在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有 ...

  2. 利用反射生成SQL语句

    // 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBui ...

  3. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  4. hibernate中使用sql语句进行表链接查询,对结果集的遍历方法

    今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_ ...

  5. 根据excel表格字段生成sql语句

    根据excel表格字段生成sql语句 1.1 前言 根据excel表格字段生成sql语句主要是利用了excel的拼接函数 CONCATENATE .该实例主要以mysql脚本支持.实例需求如下:exc ...

  6. 4、注解反射生成SQL语句

    .任务说明         ①有一张用户表,字段包括:用户ID.用户名.昵称.年龄.性别.所在城市.邮箱.手机号:         ②使用java注解来对用户表的每个字段或字段的组合条件进行动态生成S ...

  7. Excel表格生成sql语句

    假如excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age ,在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...

  8. 反射生成SQL语句入门

    今天我们来学习学习通过反射技术来生成SQL语句. 反射提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访 ...

  9. mybatis使用注解替代xml配置,动态生成Sql

    mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...

随机推荐

  1. Stream 基础和常用

    来源 : http://www.cnblogs.com/jimmyzheng/archive/2012/03/17/2402814.html 系列 目前只作为个人参考. 微软的 stream 结构老大 ...

  2. c++四则运算代码

    //Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--& ...

  3. 创建.NET应用程序所经历的步骤

    1.使用某种.NET兼容语言(如C#)编写应用程序.2.把代码编译为(CIL),存储在程序集中.3.在执行代码时(如果这是一个可执行文件,就自动运行,或者在其他代码使用它时运行),首先必须使用JIT( ...

  4. Templates 模板:

    Templates 模板: ########################温金 $template wj-flow01,"/data01/applog_backup/winfae_log/ ...

  5. MPlayer播放器安装

    http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.1.1.tar.xz [tim@L MPlayer-1.1.1]$ mplayer         ...

  6. xml to json

    // Changes XML to JSONfunction xmlToJson(xml) {    // Create the return object    var obj = {};    i ...

  7. 验证合法的url

    package test; import java.util.regex.Matcher;import java.util.regex.Pattern; public class Test { pub ...

  8. HDU 1501 & POJ 2192 Zipper(dp记忆化搜索)

    题意:给定三个串,问c串是否能由a,b串任意组合在一起组成,但注意a,b串任意组合需要保证a,b原串的顺序 例如ab,cd可组成acbd,但不能组成adcb. 分析:对字符串上的dp还是不敏感啊,虽然 ...

  9. 路由器WAN口和LAN口详解

    前一阵子做路由器的联网,由于利用了Openwrt操作系统,做起来虽然方便,但是很多原理细节都被忽略了.所以这里再来老生常谈一下wan口和lan口的区别,以及他们之间的工作原理. 首先百度一下,基本知识 ...

  10. JAVA学习篇--javaweb之Filter具体解释

    在DRP项目中,多次提到了Filter,它攻克了字符集的统一设置以及统一控制简单WebCache,从中我们能够体会到.它给我们带来的优点不不过降低代码量这么简单,它的出现避免了我们每一个页面反复的编写 ...