<?php
/**
* @author:zhangmingshuang
* @version:2011-10-13
* @param:
*/
function __autoload($class_name){
require(HIBERNATE_PATH.$class_name.".hbm.php");
}
/**
* 类似JAVA的HIBERNATE操作
* 注意点:
* 1.模型层文件命名型为:tablename.hbm.php (如果要使用别的命名方式,则需要更改autoload方法里的文件名格式)
* 2.模型层的class的名为:表名 (例:class tablename{.......})
* 3.模型层的字段需要与表的字段一致
*
*/
class hibernate{
private $table_name = "";
private $table_fileds = "";
private $fileds_value = "";
//private
var $host; //地址localhost:3306
var $name; //用户名
var $pass; //密码
var $db; //数据库名
var $encode; //字符编码 ,utf8, 不是utf-8。or gbk
//构造函数
function __construct($host, $name, $pass, $db, $encode='utf8'){
$this->host = $host;
$this->name = $name;
$this->pass = $pass;
$this->db = $db;
$this->encode = $encode;
$this->connect();
}
//连结数据库
function connect(){
$conn = mysql_connect($this->host, $this->name, $this->pass)
or die("Could not connect : " . $this->error());
mysql_select_db($this->db)
or die ("Could not select database : " . $this->error());
mysql_query("SET NAMES '$this->encode'"); //设置编码,防止中文乱码
}
//析构函数
function __destruct(){
$this->close();
}
/**
* 保存数据
* @param $class_handle : 类句柄
*/
function save($class_handle){
$this->set_table_filed($class_handle);
$fileds = substr($this->table_fileds, strpos($this->table_fileds,",")+1,strlen($this->table_fileds));
$values = substr($this->fileds_value, strpos($this->fileds_value,",")+1,strlen($this->fileds_value));
$sql = "INSERT INTO `".$this->table_name."`(".$fileds.") VALUES(".$values.")";
$this->query($sql);
}
/**
* 得取刚新增的ID
*/
function get_insert_id(){
return mysql_insert_id();
}
/**
* 获取数据
* @param $class_handle : 类句柄
* @param $val : 值
* @param $primary_key : 主建字段(默认为:模型层的第一个var)
*/
function get($class_handle,$primary_key_val,$primary_key=''){
$table_name = $this->get_table_name($class_handle);//取得表名
$filed_value_array = $this->get_filed_value($class_handle);//取得字段与值
if(empty($primary_key)){//如果主键未输入,则默认为模型层的第一个VAR
//取得模型层的第一个VAR
foreach ($filed_value_array as $key=>$value) {
$primary_key = $key;
break;
}
}
$sql = "SELECT * FROM `".$table_name."` WHERE `".$primary_key."` = '".$primary_key_val."'";
$res = $this->query($sql);
//mysql_fetch_array 为 mysql_fetch_row 扩展 可取出字段
$rows = mysql_fetch_array($res);
if(!empty($rows)){
foreach($rows as $key=>$val){
if(is_numeric($key)){//删除 key 为数字的数据
unset($rows[$key]);
}
}
$set_array = $this->get_class_set($class_handle);//取得字段
if(class_exists($table_name)){
$obj = new $table_name();
//将值SET进类中
foreach($rows as $key=>$val){
//取出取得的数据库数据的第一个记录(如:ID)匹配
foreach ($set_array as $k => $v){
if(strtolower($v)=='set'.$key){
$obj->$v($val);
}
}
}
return $obj;
}
}else{
return new $table_name();
}
}
/**
* * 更新数据
* @param $class_handle : 类句柄
* @param $primary_key : 主建字段(默认为:模型层的第一个var)
*/
function update($class_handle,$primary_key=""){
$table_name = $this->get_table_name($class_handle);//取得表名
$filed_value_array = $this->get_filed_value($class_handle);
if(empty($primary_key)){
//取得模型层的第一个VAR
foreach ($filed_value_array as $key=>$value) {
$primary_key = $key;
break;
}
}
foreach ($filed_value_array as $k=>$v){
if($k!=$primary_key){
$set_sql .= "`".$k."`='".$v."',";
}
}
$set_sql = rtrim($set_sql,",")."WHERE `".$primary_key."`='".$filed_value_array[$primary_key]."'";
$sql = "UPDATE `".$table_name."` SET ".$set_sql;
$this->query($sql);
}
/**
* 删除数据
* @param $class_handle : 类句柄
* @param $primary_key_val : 要删除的值
* @param $primary_key : 主建字段(默认为:模型层的第一个var)
*/
function delete($class_handle,$primary_key_val,$primary_key=''){
$table_name = $this->get_table_name($class_handle);//取得表名
$filed_value_array = $this->get_filed_value($class_handle);
if(empty($primary_key)){
//取得模型层的第一个VAR
foreach ($filed_value_array as $key=>$value) {
$primary_key = $key;
break;
}
}
$sql = "DELETE FROM `".$table_name."` WHERE `".$primary_key."` = '".$primary_key_val."'";
if(is_array($primary_key_val)){
$primary_key_val = implode(",", $primary_key_val);
$sql = "DELETE FROM `".$table_name."` WHERE `".$primary_key."`in(".$primary_key_val.")";
}
$this->query($sql);
}
/**
* 查找数据
* @param $class_handle
*/
function find($class_handle,$order="",$order_by="DESC"){
$table_name = $this->get_table_name($class_handle);//取得表名
$sql = "SELECT * FROM `".$table_name."` WHERE 1 = 1";
if(!empty($order)){
$sql .= " ORDER BY ".$order." ".$order_by;
}
return $this->query($sql);
}
/**
* 根据条件查找数据
* @param $sql : SQL语句
* @param $filed_arr : 条件
*/
//阻止sql注入
function p_filterXss($str){
$str = addslashes($str);
$str = mysql_real_escape_string($str);
return $str;
}
function query_by_sql($sql,$filed_arr){
//取出SQL语句中的?代替为字段
for($i=0;$i<count($filed_arr);$i++){
$filed_obj = mysql_real_escape_string(addslashes(trim($filed_arr[$i])));
if(strstr($sql,"?")){
$x_index = strpos($sql,"?");//找到第一个?
//将语句分成二段
$sql = substr($sql, 0,$x_index)."'".$filed_arr[$i]."'".substr($sql, $x_index+1,strlen($sql));
}
}
return $this->query($sql);
}
/**
* 分頁查詢
* @param $sql 查詢語句
* @param $page 當前頁
* @param $pageSize 每頁條數
*/
function find_by_page($sql,$page,$page_size=10,$filed_arr=array()){
//取出SQL语句中的?代替为字段
for($i=0;$i<count($filed_arr);$i++){
$filed_obj = mysql_real_escape_string(addslashes(trim($filed_arr[$i])));
if(strstr($sql,"?")){
$x_index = strpos($sql,"?");//找到第一个?
//将语句分成二段
$sql = substr($sql, 0,$x_index)."'".$filed_arr[$i]."'".substr($sql, $x_index+1,strlen($sql));
}
}
$page = empty($page) ? 1 : $page;
return $this->query($sql." LIMIT " . ($page-1) * $page_size . ",$page_size");
}
//返回记录集
function get_rows($result){
$rowNum = @mysql_num_rows($result);
if ($rowNum > 0){
for ($i=0; $i<$rowNum; $i++){
$rows[$i] = mysql_fetch_array($result);
}
}
return $rows;
}
//返回错误
function error(){
return mysql_error();
}
//关闭
function close() {
return @mysql_close();
}
/**
* mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。
* 对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。 *
* @param string $sql
* return TRUE/FALSE or 资源标识符
*/
function query($sql){
$result = mysql_query($sql)
or die("Query failed : " . $this->error());
return $result;
}
//統計記錄數
function count($result){
$rows_num = mysql_num_rows($result);
return $rows_num;
}
/**
* 将类名(表名)与类里的var(字段名)历遍取出
* @param $class_handle:类句柄
*/
function set_table_filed($class_handle){
$this->table_name = get_class($class_handle); //取得表名
$object_vars = get_object_vars($class_handle);//取得字段与值
//将字段数组转成字符串
$filed_array = array();$value_array = array();
foreach ($object_vars as $key=>$val){
array_push($filed_array, '`'.$key.'`');
array_push($value_array, '\''.$val.'\'');
}
$this->table_fileds = implode(",", $filed_array);
$this->fileds_value = implode(",", $value_array);
}
/**
* 获取表名
* @param unknown_type $class_hanle
*/
function get_table_name($class_handle){
return get_class($class_handle);
}
/**
* 取得类中的属性,生成SET的方法
* @param unknown_type $class_handle
*/
function get_class_set($class_handle){
$new_array = array();
$filed_array = get_object_vars($class_handle);//取得字段与值
foreach ($filed_array as $key=>$val){
array_push($new_array, "set".ucfirst($key));
}
return $new_array;
}
/**
* 取得类中的属性及对应值
* @param unknown_type $class_handle
*/
function get_filed_value($class_handle){
return get_object_vars($class_handle);//取得字段与值
}
}
#--------------------Example-------------------------------
# 要使用此方法需要配置HIBERNATE_PATH常量,指向:模型层的路径(model/)
# model模层建立规则:
# 1.名字:类名.hbm.php
# 2.类名:table_name (class table_name{ })
# 3.字段:即对表相对应的字段名(要与数据库一致) (var $id="";var $username="".....)
# 4.要配置GET AND SET 方法
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# 使用方法
# 首先,需要实例化:hibernate对像即
# $hibernate = new hibernate(DB_HOST, DB_USER, DB_PASS, DB_NAME);
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# **调用保存
# $admin = new admin(); //不用配置inclue(require or include_once or require_once)
# $admin->setUsername('admin');
# $admin->setNo('no');
# ....
# $hibernate->save($admin);
# **获取刚刚新增的数据ID
# $id = $hibernate->get_insert_id();
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# **根据ID获取数据
# $admin = new admin();//因为无法预知是否会事先初使化数据,所以,所有方法需要调进句柄
# $admin_get = $hibernate->get($admin,$id);//具体参数请自己查看
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# **更新
# $admin = new admin();
# $admin_get = $hibernate->get($admin,$id);
# $admin_get->setUsername('admin');
# $admin_get->setNo('no');
# $hibernate->update($admin_get);//更新的时候,不传ID 但是不能执行 $admin_get->setId(1),这样就更新别的数据了
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# **删除
# $admin = new admin();
# $hibernate->delete(id);//ID可以为1或者数组
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# **查找数据
#
#
?>
分享到:
相关推荐
Hibernate是一款强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用中操作数据库的简便方法。通过使用Hibernate,开发人员可以避免直接编写SQL语句,而是通过面向对象的方式来管理和操作数据。本文将...
标题"Hibernate数据库操作实例.zip"表明这是一个关于使用Hibernate框架进行数据库操作的实际案例。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发人员使用面向对象的方式来处理数据库交互,而无需...
对hibernate的数据库操作封装: 1.分页查询 2.保存对象 3.保存对象组 4. 更新对象 5.更新对象组 6.保存或更新对象 7.保存或更新对象组 8. 删除对象 9. 删除对象组 10.删除对象(此类的所有对象) 11.删除(HQL) 12....
Hibernate 是一款流行的 ORM(对象关系映射)框架,它使得 Java 开发者能够更容易地操作数据库。在使用 Hibernate 进行数据库操作时,事务管理是非常重要的一部分。本文将深入探讨 Hibernate 数据库事务的管理方式,...
以下是对"Hibernate操作数据库的步骤"的详细解释: 1. **读取并解析配置文件**:在Hibernate中,配置文件(通常是`hibernate.cfg.xml`)包含了数据库连接信息,如URL、用户名、密码等。`Configuration`类用于加载这...
Hibernate与JDBC对于数据库的性能操作对比事例,配置,更多信息资源
Java使用Hibernate操作数据库是现代Java应用中常见的技术实践,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库的交互。它允许开发者用Java对象来表示数据库中的记录,而无需关心底层SQL的实现...
ORM允许开发者使用面向对象的方式来操作数据库,而无需关注底层的SQL语句。通过配置文件或注解,Hibernate可以将Java对象与数据库表进行映射,实现了数据的透明访问。 在动态数据库进化版中,我们可能涉及到以下几...
Hibernate 配置各种数据库 Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等...
Hibernate操作数据库时,主要通过以下几个核心组件来实现持久层操作: 1. **Session**:Session是Hibernate用来和数据库进行交互的一个轻量级对象,它相当于JDBC中的Connection。Session对象是应用程序与数据库进行...
Hibernate是一个强大的Java持久化框架,它允许开发者将对象模型与关系数据库进行映射,从而简化了数据库操作。在处理多数据库支持时,Hibernate提供了一些策略和技巧来确保应用程序能够在不同类型的数据库之间灵活...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了与数据库交互的过程,使得开发者可以使用面向对象的方式来操作数据库。对于Oracle数据库的支持,Hibernate提供了专门的驱动和配置,使得...
Hibernate是Java开发中的一个重要工具,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是繁琐的数据访问层实现。本教程结合了【Hibernate学习笔记】,提供了全面且深入的讲解,旨在让学习者对Hibernate有...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过Java对象来操作数据库,极大地简化了数据库操作。金仓数据库,又称为Kingbase,是一款国产的高性能、高可靠性的关系型数据库管理...
hibernate数据库PPT制作
本资料包"Java封装hibernate操作数据库.rar"主要涉及了如何使用Hibernate进行数据库操作,并通过DAO(Data Access Object)层的封装来实现更加高效、简洁的代码结构。 首先,让我们深入了解Hibernate。Hibernate是一...
Hibernate是一个开源的ORM框架,它允许开发者用Java对象来操作数据库,而无需编写大量的SQL语句。通过提供数据持久化层,Hibernate减少了数据库操作的复杂性,提高了代码的可维护性和可读性。 **二、Hibernate的...
hibernate数据库连接池配置。使用非常方便,参考数据库连接池配置
**标题:“Hibernate操作数据库”** Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过使用Hibernate,开发者可以避免编写大量的SQL语句,而是专注...