用过java开源项目mybatis(ibatis)后,觉得它的思路挺好,于是做了一个风格类似于batis的组件。
将SQL从MVC中的模型中分离出来,一方面便于后期SQL的优化,也让PHP不再夹杂着SQL,让PHPer更专注于业务逻辑。
下面是demo
一、主配置文件config.xml(名字任意)
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- 全局别名 --> <typeAliases> <typeAlias key="DAOPATH" value="application/"/> </typeAliases> <!-- 数据源 --> <databases> <database id="sysvotes" default="true"> <property name="driver" value="pdo"/> <property name="charset" value="UTF8"/> <property name="dsn" value="mysql:host=localhost;dbname=test"/> <property name="username" value="root"/> <property name="password" value=""/> </database> <database id="syshotels"> <property name="driver" value="pdo"/> <property name="dsn" value="mysql:host=192.168.1.251;dbname=syshotels"/> <property name="username" value="root"/> <property name="password" value=""/> </database> </databases> <caches> <cache id="memcache" default="true"> <property name="type" value="memcache"/> <property name="host" value="localhost"/> <property name="port" value="11211"/> </cache> <cache id="file"> <property name="type" value="file"/> <property name="filepath" value="Cache/Temp/"/> </cache> </caches> </configuration>
<?xml version="1.0" encoding="utf-8" ?> <mapper> <sql id="allFields">`TIMESTAMP`, logger, `LEVEL`, message, thread, `FILE`, line</sql> <!-- id:作为Batis引用的唯一标识 resultClass:返回数据的封装为Class对象。若没有此参数,将不会对结果封装为对象 cacheId:缓存配置标签ID。目前支持:file、memcache cacheTime:缓存超时时间,单位秒 cahce:是否缓存,默认false prepare:是否使用PDO的prepare,默认true --> <select id="SelectAll" resultClass="Log" cacheId="file" cacheTime="3600" cache="true" prepare="true"> SELECT #allFields# FROM log2 WHERE thread > :number </select> <!-- 对于复杂的搜索条件,phpBatis不支持if-else或trim这样的标签。 解决方法:关闭使用PDO的prepare绑定,将搜索条件在PHP中处理好,然后传给phpBatis直接替换。 --> <select id="getLogs" cache="false" prepare="false"> SELECT #allFields# FROM log2 WHERE :terms </select> <insert id="insertlog"> insert into log2 (#allFields#) values (:timestamp, :logger, :level, :message, :thread, :file, :line) </insert> <update id="Update" parameterClass="Person"> update log2 set logger = :logger, message = :message, thread = :thread, line = :line where `timestamp`=:timestamp </update> <delete id="Delete" parameterClass="int"> delete from PERSON where PER_ID = #value# </delete> </mapper>
<?php require 'phpBatis.php'; $batis = new PhpBatis('application/config.xml'); /** * 事务 */ $time = time(); $params = array( 'timestamp'=>$time, 'logger'=>'Mr.jinyong', 'level' =>'WARN', 'message'=>'test', 'thread' =>'5501', 'file' => __FILE__, 'line' =>50 ); $batis->beginTransaction(); try{ $batis->setMapper("application/log.xml")->insert("insertlog", $params); $updateParams = array( 'timestamp'=>$time, 'logger'=>'Mr.jinyong', 'message'=>'update', 'thread' =>'5501', 'line' =>50 ); $batis->setMapper("application/log.xml")->update("Update", $updateParams); $batis->setMapper("application/log.xml")->insert("insertlog", $params); $batis->commitTransaction(); }catch(BatisException $e){ $batis->rollBackTransaction(); } // /** // * 插入一条记录 // */ // $params = array( // 'timestamp'=>time(), // 'logger'=>'Mr.jinyong', // 'level' =>'WARN', // 'message'=>'test', // 'thread' =>'5501', // 'file' => __FILE__, // 'line' =>50 // ); // $batis->setMapper("application/log.xml")->insert("insertlog", $params); // /** // * 更新一条记录 // */ // $batis->setMapper("application/log.xml")->update("Update", $params); // /** // * 查询一条记录,并返回Log对象 // */ // $result = $batis->setMapper("application/log.xml")->queryOne("SelectAll", array(':number'=> 0)); // echo $result->getLogger(); // /** // * 复杂的查询条件,关闭prepare // */ // $result = $batis->setMapper("application/log.xml")->queryList("getLogs", array(':terms'=> "thread=5400 OR thread<3000")); // print_r($result);
组件下载地址:http://download.csdn.net/download/a600423444/3646995