这里有一个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. 51单片机C51毫秒级(ms)精确延时

    如下程序能实现ms毫秒级的比较精确的延时 void Delayms(unsigned int n) { unsigned int i,j; ;j--) ;i>;i--); } 用keil可以看出 ...

  2. MCS-51系列和80C51系列单片机是否相同

    MCS是Intel公司单片机的系列符号.Intel推出有MCS-48.MCS-51.MCS-96系列单片机. MCS-51系列单既包括三个基本型80C31.8051.8751,以及对应的低功耗型号80 ...

  3. SignalR 的跨域支持

    How to establish a cross-domain connection Typically if the browser loads a page from http://contoso ...

  4. COJ 0024 N皇后问题

    N皇后问题 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述     在N*N的方格棋盘放置N个皇,使得它们不相互攻击(即任意2个 ...

  5. DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  6. [LeetCode] 116. Populating Next Right Pointers in Each Node 解决思路

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  7. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAApcAAAB3CAIAAADZ1fxtAAAbFElEQVR4nO2dzbHDOo6FHY9S0WqqZt

  8. jdk各个版本的特性

    http://blog.csdn.net/mixiuali/article/details/8180100

  9. SEO名词_黒帽SEO

    一.什么是黒帽SEO 黑帽SEO是指通过一些操控和欺骗找寻搜索引擎漏洞的一些技术,让关键词排名在很短的时间获得非常好的排名的一项技术 二.黒帽SEO的危害 如果被搜索引擎识别网站采用的是黑帽SEO手段 ...

  10. 转载:mybatis和hibernate 解析

    第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀 ...